Project/커뮤니티 게시판

[커뮤니티 게시판] 댓글 기능 관련 정리

SN.Flower 2023. 8. 20.

💡   댓글 기능은 어떻게 구현했나요?

Create: 댓글 작성 후 작성 버튼을 누르면 javascript의 댓글 작성 함수를 호출해서 ajax를 통해 댓글 api에 post로 댓글 작성자, 내용, 게시글 id, 부모 댓글 id가 담긴 json 데이터를 전송합니다.

이후 Controller에서 @RequestBody를 통해 받은 댓글 dto를 JpaRepository를 상속받는 Repository에서 save() 함수를 통해 댓글을 생성했습니다.

그리고 게시글 엔티티의 댓글수 필드 값을 1 증가시키고 댓글 알림을 생성하기위해서 댓글 알림 dto를 만들고ApplicationEventPublisher의 publishEvent()함수를 호출해서 이벤트를 발생시켰습니다.

 

Read: 계층형 댓글을 만들기 위해서 댓글 객체는 ManyToOne 으로 해서 부모 댓글의 id값을 가지고, OneToMany로 자식 댓글 리스트를 갖도록 했습니다.

그리고 댓글을 읽을 때는 db에서 댓글을 부모 id와 댓글 자신의 id 순서로 탐색하며 dto로 변환시키고, HashMap과 ArrayList를 활용해서 부모 댓글 dto가 있다면 dto의 자식 댓글 리스트에 자식 댓글 dto를 넣도록 했습니다.

결과적으로 만들어진 계층형 댓글 리스트 dto를 ajax의 get요청의 response로 전달해서 뷰에 보이도록 했습니다.

 

Update: 댓글의 내용만 수정하기때문에 patch로 댓글 api에 요청해서 Service의 댓글 수정 함수를 호출했습니다.

댓글 id로 댓글을 조회한 후 작성자인지 확인 후, request로 받은 댓글 내용을 수정하도록했습니다.

 

Delete: delete로 댓글 api에 요청해서 Service의 댓글 삭제 함수를 호출했습니다.

댓글 id로 댓글을 조회한 후 작성자인지 확인 후, 해당 게시글의 댓글 수를 1 줄였습니다.

그리고 자식 댓글이 있다면 자식 댓글의 부모 댓글이 누구인지에 대한 정보가 남아있어야 기존 계층형 댓글 구조를 유지할 수 있으므로 deleted 필드의 상태만 true로 바꿔주고 뷰에서는 삭제된 댓글이라고 표시되게 했습니다.

자식 댓글이 없다면 본인이 db에서 삭제가 되는 동시에 부모 댓글 중에 deleted 상태가 true이고 자식이 자신뿐이라면 똑같이 db에서 삭제하며 앞의 조건으로 삭제가 가능한 부모 댓글을 찾아가며 가능하다면 db에서 삭제하도록 했습니다.

댓글