[게시판 프로젝트] 회원 정보 수정(3)

J_Eddy·2021년 12월 14일
2

이전 포스트에서는 내 정보 수정, 패스워드 변경을 다루었다.
회원 정보 수정(1)_내 정보 수정
회원 정보 수정(2)_패스워드 수정

📌 회원 정보 수정 _ 회원 탈퇴

회원탈퇴 진행 시 로직이 조금 까다로웠다. 처음에는 해당 회원이 작성한 게시물과 댓글을 생각하지않고 단순히 회원정보를 지우는 방식으로 탈퇴를 진행하였는데, 나중에 이 오류를 발견하였다.

🛠 로직

먼저 회원탈퇴를 진행한다고 누르면 해당회원이 작성한 모든 게시물과 댓글을 삭제를 하여야한다. 만일 삭제하는 로직을 구현하지않고 진행하면 참조 무결성 오류가 발생한다.

먼저 로직은 해당회원이 작성한 게시물이 있는지 체크하고 있다면 해당게시물에 댓글이 있는지 체크한다. 댓글이 있다면 해당 게시물에 있는 댓글과 대댓글을 모두 삭제하고 해당회원이 작성한 댓글이 있는지 체크한다. 만일 있다면 해당회원의 댓글을 삭제하여 탈퇴를 진행한다.

Service

먼저 id값을 넘겨 해당회원의 member정보를 가져온다. 이후 해당회원이 작성한 게시물이 있는지 체크한다. 이때 existByWriter은 JPA로 해당 함수를 만들어 boolean값을 리턴받았다.

이후 해당 사용자가 작성한 게시물이 있다면 for문을 이용하여 해당게시물을 삭제 시도한다. 이때 existByBoardId를 이용하여 해당 게시물에 댓글이 있는지 체크하고 있다면 deleteByBoardId를 이용하여 댓글을 삭제 하였다. 댓글 테이블에는 BoardId가 컬럼값으로 들어가있다. 따라서 deleteByBoardId는 해당 게시물에 달린 댓글을 전부 삭제하라는 뜻이다.

이후 deleteById로 해당 게시물을 삭제 하였다.

게시물 다음에 확인해야할것은 다른사람 게시물에 남겨놓은 댓글이 있는지 확인해야 한다. 이 역시 existByWriter로 해당회원이 작성한 댓글이 있는지 조회를 하고 만일 있다면 해당댓글의 deleteByCid로 댓글과 대댓글을 모두 삭제한다.

//멤버 탈퇴
    public void deleteUser(Long id) {
        Optional<MemberEntity> memberEntity = memberRepository.findById(id);

        //해당 회원이 작성한 게시물이 있을 때
        if(boardRepository.existsByWriter(memberEntity.get())){
            List<BoardEntity> boardEntity = boardRepository.findByWriter(memberEntity.get());
            for(int i=0; i<boardEntity.size(); i++){
                //해당게시물에 댓글이 있을 때 댓글 모두 삭제
                if(boardCommentRepository.existsByBoardId(boardEntity.get(i))){
                    boardCommentQueryRepository.deleteByBoardId(boardEntity.get(i));
                }
                //해당 게시물 삭제
                boardRepository.deleteById(boardEntity.get(i).getId());
            }
        }

        //해당 회원이 작성한 댓글 삭제
        if(boardCommentRepository.existsByWriter(memberEntity.get())){
            List<BoardCommentEntity> boardCommentEntityList = boardCommentRepository.findByWriter(memberEntity.get());
            for(int i=0; i<boardCommentEntityList.size();i++){
                boardCommentQueryRepository.deleteByCid(boardCommentEntityList.get(i).getId());
            }
        }

        memberRepository.deleteById(id);
    }

deleteByCid

/*모댓글, 대댓글 삭제*/
    @Transactional
    public void deleteByCid(Long cid) {
        queryFactory.delete(QBoardCommentEntity.boardCommentEntity)
                .where(QBoardCommentEntity.boardCommentEntity.id.eq(cid)
                        .or(QBoardCommentEntity.boardCommentEntity.cGroup.eq(cid))
                )
                .execute();
    }
profile
논리적으로 사고하고 해결하는 것을 좋아하는 개발자입니다.

0개의 댓글