[클론 코딩] 네이버 카페 - 댓글 삭제

2024. 6. 10. 19:19Project/Naver Cafe

  네이버 카페 댓글은 삭제시 2가지 방식으로 삭제되었음을 사용자에게 보여준다.

  1. 답글이 달린 댓글의 경우 '삭제된 댓글'이라는 메시지를 노출
  2. 그 외의 경우 댓글 노출 목록에서 삭제(=DB에 정보가 없으니 당연함)

  즉, 주의할 점은 답글이 달린 댓글이라는 건데 단순히 메시지만 노출해주면 될 것 같지만, 중요한건 댓글이 삭제되더라도 해당 댓글만 삭제될 뿐 나머지 댓글(+답글)들은 삭제 전과 같은 순서로 계속 노출되어야 한다는 것이다. 이런 부분 때문에 이전에 댓글 정보에 그룹 넘버를 지정해 기존 순서를 유지할 수 있도록 한 것이다.

 

  또한 '댓글수'와 '답글수'를 따로 계산할 요량으로 변수를 두었지만 이는 댓글 삭제시 댓글수가 변경되어 기존에 생각했던데로 그룹번호로 쓰는데 문제가 있어 '그룹번호'와 '댓글수'로 수정하였다. 이렇게 되면 '그룹번호'가 댓글+답글 그룹을 구별하는 역할을 할 것이고, 댓글 삭제시 댓글수 정보를 수정하므로 '그룹번호'는 제대로 제 역할을 할 수 있다.


CommentController

package CloneCoding.NaverCafe.domain.comment.controller;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/cafe/{cafe_url}")
public class CommentController {

    private final CommentService commentService;

    @DeleteMapping("/{normal_id}/comment/{comment_id}")
    public String delComment(@PathVariable("cafe_url") String cafeUrl,
                             @PathVariable("normal_id") Long articleId,
                             @PathVariable("comment_id") Long commentId,
                             @RequestHeader("Authorization") String token) {
        log.info("댓글 삭제 요청");
        return commentService.delComment(cafeUrl, articleId, commentId, token);
    }



}

 

  • delComment() : 카페 url, 게시글 id, 댓글 id, 토큰 정보로 CommentService의 delComment()를 호출하고 결과 메시지 반환

CommentServiceImpl

package CloneCoding.NaverCafe.domain.comment.service;

import static CloneCoding.NaverCafe.message.SystemMessage.*;

@Service
@RequiredArgsConstructor
public class CommentServiceImpl implements CommentService {

    private final CommentRepository commentRepository;
    private final CafeRepository cafeRepository;
    private final CafeMemberRepository cafeMemberRepository;
    private final NormalRepository normalRepository;
    private final AesUtil aesUtil;

    @Transactional
    @Override
    public String delComment(String cafeUrl, Long normalId, Long commentId, String token) {

        checkCafeMember(cafeUrl, token);
        Normal article = normalRepository.findByIdWithLock(normalId)
                .orElseThrow(() -> new NoSuchElementException("게시글 정보를 찾을 수 없습니다."));
        Comment comment = commentRepository.findById(commentId)
                .orElseThrow(() -> new NoSuchElementException("댓글 정보를 찾을 수 없습니다."));

        article.subCommentCount();

        commentRepository.delete(comment);
        normalRepository.save(article);

        return DELETE_COMMENT_COMPLETE.getMessage();
    }

    private CafeMember checkCafeMember(String url, String token) {

        String accountId = aesUtil.aesDecode(token);
        Cafe findCafe = cafeRepository.findByUrl(url);

        return cafeMemberRepository.findByAccountId(findCafe, accountId);
    }

}

 

  • delComment() : 게시글의 CommentCount 정보를 수정하고 엔티티 저장, 댓글 엔티티 삭제 후에 결과 메시지 반환

API TEST

DB - 댓글 삭제 전

 

API TEST - 댓글 삭제 요청

 

DB - 댓글 삭제 후

 

  댓글(id=1) 삭제 요청 테스트에 대한 결과이다. DB를 확인해 보면 해당 댓글은 삭제 되었지만 댓글의 답글은 유지되는걸 확인 할 수 있으며, 삭제된 댓글을 제외하면 나머지 댓글(+답글)은 모두 이전과 같은 순서를 유지하는 걸 확인 할 수 있다.

 

DB - 삭제된 댓글의 답글에 답글 작성

 

  댓글이 삭제되면 당연하게도 답글을 작성할 순 없지만, 삭제된 댓글의 답글에는 답글을 작성할 수 있는데 그 경우를 테스트한 결과이다. 댓글1(id=1)이 삭제된 상태에서 답글3(id=5)에 답글을 작성하였고 생성된 댓글이 잘 추가 된 것을 확인 할 수 있다. 또한 이전에 말한 것처럼 작성일은 늦을지 몰라도 댓글그룹1에 포함되는 답글이므로 답글3 다음에 노출되는 것을 확인 할 수 있다.