728x90
이전글
체크사항
- 포스트 수정 / 삭제
- ADMIN회원이나 글을 작성한 일반회원이 글에 대한 수정과 삭제를 할 수 있다.
Controller
...
public class PostController {
private final PostService postService;
...
@DeleteMapping("/{postId}")
public Response<PostResponse> deletePost(@PathVariable Integer postId,
Authentication authentication){
String userName = authentication.getName();
postService.deletePost(postId, userName);
return Response.success(new PostResponse("포스트 삭제 완료", postId));
}
}
삭제를 위한 api이므로 HTTP의 DELETE메서드를 사용합니다.
하나의 게시물을 특정하여 삭제하는 api이므로 삭제하려는 게시판의 id를 가지고 옵니다.
또한 삭제하려는 게시물의 작성자인지 확인해야 하므로 Authentication을 통해 Token의 주인 정보를 받아옵니다.
Service
...
public class PostService {
private final PostRepository postRepository;
private final UserRepository userRepository;
...
public void deletePost(Integer postId, String userName) {
// user가 찾아지지 않는다면 삭제할 수 없다.
User user = userRepository.findByUserName(userName)
.orElseThrow(
() -> new SNSAppException(USERNAME_NOT_FOUND, "일치하지 않은 회원 입니다.")
);
// post가 찾아지지 않는다면 삭제할 수 없다.
Post post = postRepository.findById(postId)
.orElseThrow(
() -> new SNSAppException(POST_NOT_FOUND, "해당 포스트가 없습니다.")
);
// User가 관리자가 아닌데, User와 Post를 작성한 User가 다르면 삭제할 수 없다.
if (!user.getUserRole().equals(ADMIN) && !user.getId().equals(post.getUser().getId())) {
throw new SNSAppException(INVALID_PERMISSION, "사용자가 권한이 없습니다.");
}
postRepository.delete(post);
}
}
- 넘어온 userName으로 User의 정보를 먼저 찾습니다. userName으로 검색한 결과가 없다면 잘못된 토큰을 받아온 경우이므로 예외를 발생시킵니다.
- 넘어온 postId로 Post 정보를 찾습니다. Post의 결과가 없다면 해당 게시물은 존재하지 않으므로 예외를 발생시킵니다.
- User가 관리자가 아님에도 Post작성자와 해당 Post를 수정하려는 User의 정보가 다르다면 예외를 발생시킵니다.
- postId 또는 post를 매개변수로 집어넣어 해당 post를 삭제합니다.
- post를 집어 넣을지, postId를 집어넣을지 고민하다가 post를 그대로 넣기로 했습니다. postId 하나가 아닌 모든 정보가 일치할 때 삭제하면 조금 더 정확한 로직이 진행되지 않을까 하는 기대감 때문입니다.
결과
삭제 전 DB
삭제 api 실행
삭제 후 DB
반응형
'프로젝트 > Archive' 카테고리의 다른 글
[04] User Test 코드 작성 (0) | 2022.12.26 |
---|---|
[JWT] JWT Exception 처리 (0) | 2022.12.25 |
[03] 게시된 포스트 수정 (0) | 2022.12.23 |
[03] 게시된 모든 포스트 목록 보기 (0) | 2022.12.23 |
[03] 포스트 단건 상세 정보 보기 만들기 (0) | 2022.12.23 |