-
Spring Data Jpa를 이용한 게시물 댓글 삭제졸업과제/BackEnd 2023. 2. 19. 14:22
사용자가 자기의 댓글을 삭제하는 로직을 구현도전!
ReplyRepository
reply 테이블의 속성 댓글을 삭제할 때는 현재 유저의 pk와 게시물의 pk를 알아야 정확하게 원하는 댓글만 삭제할 수 있을 것 같다고 생각했다.
그 이유는 만약 게시물 id로만 조회해서 삭제를 시도한다면 사용자가 작성한 댓글뿐만 아니라
나머지 타인이 작성한 댓글까지 삭제가 될것이고
유저가 a게시물 뿐만아니라 b, c게시물에도 댓글이 있는 상황일 때유저 id로 삭제를 시도한다면
a,b,c게시물의 댓글이 삭제가 되기 때문에 post_id와 유저의 id가 일치하는 댓글만 삭제할수있게 두 개의 매개변수를 받도록 Repository를 설정했다.
Controller, Service
@PostMapping(value = "/detailPost/ReplyDelete") public ReplyDeleteResultDto Reply_delete(Long PostId,Long ReplyId) { LOGGER.info("[Reply_delete] 댓글 삭제 컨트롤러 동작. 게시물 Id:{}",PostId); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Object principal = authentication.getPrincipal(); User user = (User)principal; ReplyDeleteResultDto replyDeleteResultDto = replyService.reply_delete(PostId, user.getId(),ReplyId); return replyDeleteResultDto; }
댓글 삭제 컨트롤러이다. 댓글 삭제를 시도하면 삭제를 시도하는 게시물의 id와 댓글의 id를 받아온다.
그리고 역시 Jwt Token을 이용해 현재 세션의 유저 정보를 받아온 뒤 Service를 호출해 삭제 로직이 동작할 수 있도록 해준다.
@Transactional public ReplyDeleteResultDto reply_delete(Long PostId,Long UserId,Long ReplyId) { ReplyDeleteResultDto replyDeleteResultDto = new ReplyDeleteResultDto(); replyDeleteResultDto.setUserId(UserId); replyDeleteResultDto.setReplyId(ReplyId); logger.info("[reply_delete] 댓글 삭제 로직 동작. postId:{}, userId:{}",PostId,UserId); Reply reply = replyRepository.findById(ReplyId).orElse(null); if(!UserId.equals(reply.getUser().getId())) { logger.info("[reply_delete] 사용자가 삭제할수 없는 댓글입니다"); setFailResult(replyDeleteResultDto); replyDeleteResultDto.setMsg("사용자가 삭제할수 없는 댓글입니다"); return replyDeleteResultDto; } else { replyRepository.deleteByPost_PostIdAndUser_Id(PostId,UserId); setSuccessResult(replyDeleteResultDto); } return replyDeleteResultDto; }
서비스는 전달받은 Id들을 이용해 객체들을 호출한다. 만약 현재 세션 유저의 pk와 삭제를 시도하는 댓글의 유저 fk가 일치하지 않는다면 유저 본인이 작성한 댓글이 아니기 때문에 삭제할 수 없도록 오류를 처리해 준다.
현재 세션의 유저가 댓글을 작성한 유저가 맞다면 앞서 작성한 deleteByPost_PostIdAndUser_Id를 호출해 게시물의 pk와 유저의 pk를 전달해 현재 게시물에서 사용자가 작성한 댓글을 삭제할 수 있도록 해준다.
Swagger을 이용한 테스트
아이디가 e인 유저가 있다고 가정하고 테스트를 진행해 볼 예정이다.
e유저는 post_id가 14인 게시물에 댓글을 작성한 상태이다.
14번 게시물에 3개의 댓글이 달려있는 상태 현재 아이디가 e인 유저가 작성한 댓글의 pk는 37번 인대 12번 댓글 즉 다른 사람의 댓글삭제를 시도했을 때 Service에서
설정했던 대로 if문에 걸리면서 사용자가 삭제할 수 없는 댓글이라는 오류 메시지를 잘 보내주는 모습을 확인했다.
자신의 댓글 삭제 시도 이제 e유저가 작성했던 37번 댓글 삭제를 시도해 본 결과 e유저가 작성한 댓글만 삭제되고 타인이 작성한 댓글들은
게시물에 잘 남아있다.
다음에는 대댓글을 구현하고 싶다. 대댓글의 부모댓글만 식별해서 DB에 값을 넣어주면 될 거 같은 대 생각해 보니
html에 값을 전달할 때도 어려울 거 같다... 다음에는 페이징 도전해야지
'졸업과제 > BackEnd' 카테고리의 다른 글
Spring boot 쿠키에 JWT 토큰값 세팅 (0) 2023.02.27 Spring Data Jpa의 Pageable을 이용한 게시물 페이징 처리 (0) 2023.02.20 Spring Data JPA를 이용한 게시물 댓글 작성 기능 구현 (0) 2023.02.18 게시물 상세페이지 조회. LazyInitializationException (0) 2023.02.17 Spring DATA JPA 게시물 삭제 (0) 2023.02.16