엘리스 SW 엔지니어 트랙 (게시글 삭제할 때 댓글은 삭제 안되는 문제)

ChanghyeonO·2023년 7월 23일
0
post-custom-banner

커뮤니티에 생성된 질문 게시글에 댓글을 달 수 있도록 해두었다.
댓글을 작성할 때는 게시글의 고유 id 값을 참조하도록 해두었는데 만약 게시글을 삭제하게 될 경우, 참조하는 게시글이 없는 댓글 내용만 db에 계속 저장되어 있는 문제가 발생했다.

// 커뮤니티 질문 삭제
  async deleteQuestion(id: string) {
    try {
      const question = await Question.findOneAndDelete({ _id: id });
      return question;
    } catch (error) {
      throw new Error("커뮤니티 질문 삭제에 실패하였습니다.");
    }
  },

기존에 작성되어 있던 서비스 코드는 이렇다.
코드에는 게시글을 찾아서 삭제하는 기능은 있지만 그 게시글을 참조하고 있는 댓글 데이터를 삭제하는 코드가 작성되어 있지 않았다.
어떻게 하면 게시글을 삭제할 때 해당 id값을 참조하고 있는 댓글까지 삭제할 수 있을까?
일단 댓글 데이터는 게시글 id 값을 함께 가지고 있다.
그러니 게시글을 삭제할 때 가져온 id값으로 db의 Comment에 있는 게시글 중 해당 id 값을 가지고 있는 데이터를 함께 삭제해주도록 하면 될 것이다.

위는 해당하는 데이터를 모두 삭제해주기 위해 찾은 메서드.

때문에 아래처럼 코드를 수정해주었다.

  async deleteQuestion(id: string) {
    try {
      const question = await Question.findOneAndDelete({ _id: id });
      
      if (!question) {
        throw new Error("커뮤니티 질문을 찾을 수 없습니다.");
      }
      
      await Comment.deleteMany({ _id: { $in: question.commentIds } });

      return question;
    } catch (error) {
      throw new Error("커뮤니티 질문 삭제에 실패하였습니다.");
    }
  }

위 코드에서 먼저 커뮤니티 게시글을 먼저 찾아서 삭제해도록 해주었다.
만일 게시글을 찾을 수 없을 경우 에러를 던지도록 코드를 추가해주었고, 게시글 찾고 삭제가 된 경우, deleteMany 메서드를 사용, db의 Comment에서 $in 쿼리 연산자를 사용해 id가 question.commentIds 배열에 포함되어 있는 경우 전부 삭제해달라고 작성했다.
즉 이 코드는 question.commentIds 배열에 있는 id를 가진 모든 댓글을 삭제하라는 명령을 db에 전달하는 코드이다.

이렇게 코드를 수정하고 게시글 데이터를 삭제해보니 댓글 데이터까지 함께 잘 삭제가 되는 걸 확인했다.

profile
꾸준한 기록을 통해, 좋은 개발자가 되겠습니다.
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기