스프링 JPA 댓글/대댓글 기능 구현

wisdom·2022년 8월 21일
0

백엔드 개발자라면?

목록 보기
17/42

  • 처음에는 위 사진처럼 댓글에 대댓글이 달리고 그 대댓글에 다시 댓글이 달리면 박스가 오른쪽으로 계속 밀리는 형태의 댓글을 구현해보려고 생각했다. 이걸 무한 댓글이라고 부르는 것같다. 그런데 찾아보니까 그런 형식으로는 요즘 보기에도 복잡하고 사용성이 떨어져서 잘 안쓰인다고 한다. 그래서 계획을 바꿨고 유투브와 인스타그램의 댓글 방식을 참고했다.
  • 유투브와 인스타그램을 확인해보니 댓글을 작성하면 각 댓글마다 답글 버튼이 생긴다. 그리고 답글 버튼을 누르면 답글의 댓글이 달린다. 이를 대댓글이라고 하자.
  • 대댓글에 다시 댓글을 달면 아래 사진처럼 댓글 작성자의 아이디가 자동으로 입력된다. 그 결과 댓글 작성자에게 알림이 간다. 이름 참고해서 댓글에 대댓글까지 구현하려고한다. 즉 대댓글의 깊이가 깊어지지 않고 @로 해결한다.
    • 나중에 기회가 되면 웹푸시 알림도 구현해보고 싶다!

댓글, 대댓글 관련 정책

인스타그램의 정책을 참고함

  • 댓글은 수정할 수 없음
  • 게시글이 삭제되면 댓글도 삭제되고, 대댓글도 삭제된다.
  • 댓글이 삭제되면, 대댓글도 삭제된다.

댓글 테이블

  • comment_id
  • article_id
  • user_id
  • content
  • parentt_id
  • created_at

REST API URI Design 고민

/api/articles/{articleId}/comments/{commentId}/replies/{repliesId}
  • 대댓글을 삭제할 때 요청 URI인데 너무 긴 게 아닌가? 고민했다. 과연 REST API URI 디자인을 잘한걸까? 다른 접근 방식이 있을까?

서비스 로직 고민

  • 아래는 대댓글을 삭제하는 서비스 로직이다.
  • 게시글와 댓글 존재여부 체크 후에 대댓글 아이디로 삭제해도 되는걸까?
  • 아니면 삭제할 때 게시글아이디, 댓글아이디, 대댓글 아이디가 전부 동일할 때만 삭제하는 게 더 적합할까
    - ex) commentRepo.deleteByArticleAndParentAndId(게시글, 댓글, 대댓글아이디)
public void deleteReply(Long articleId, Long commentId, Long replyId) { 
    articleService.exists(articleId); // 1. 게시글이 있는지 체크 
	exists(commentId); // 2. 댓글이 있는지 체크 
	commentRepo.deleteById(replyId) 
}
profile
문제를 정의하고, 문제를 해결하는

0개의 댓글