쌓고 쌓다

[스프링 부트] 게시글 삭제시 댓글 처리 - 13 본문

프로그래밍/spring

[스프링 부트] 게시글 삭제시 댓글 처리 - 13

승민아 2023. 7. 21. 00:02

댓글 구현한 이후

게시글 삭제시 SQL Error가 발생했다.

Cannot delete or update a parent row: a foreign key constraint fails

 

게시글 삭제 기능 구현 이후에 댓글 기능을 구현했고

게시글 삭제 부분에 댓글 처리를 추가적으로 작성해주지 않아 SQL 에러가 발생했다.

 

게시글 삭제시 해당 게시글의 댓글들도 함께 삭제하도록 코드를 추가 및 변경해보자.

 

 

CommentRepository

public interface SpringDataJpaCommentRepository extends JpaRepository<Comment, Long> {
    Page<Comment> findByPno(Long pno, Pageable pageable); // 페이징된 댓글들
    List<Comment> findByPno(Long pno); // pno의 댓글들
}

게시글의 PK로 댓글들을 찾는 메서드를 오버로딩했다.

하나는 페이징된 댓글들을 하나는 모든 댓글들을 뽑아온다.

이런 방식이 적합한지는 모르겠으나 만들면서 배우는게 아닌가!

 

CommentService

1. 게시글 번호로 해당 댓글들 모두 삭제

   public void deleteCommentByPno(Long pno) {
        List<Comment> commentList = commentRepository.findByPno(pno);
        for (Comment comment : commentList) {
            commentRepository.delete(comment);
        }
    }

게시글의 PK를 받아 해당하는 댓글들을 모두 뽑아온다.

JPA delete에 엔티티를 넘겨 삭제하는 방법이 가능하므로 해당 댓글들을 delete한다.

 

2. 댓글 조회

    public Page<Comment> findPagingComments(Long pno, Pageable pageable) {
        Page<Comment> comments = commentRepository.findByPno(pno, pageable);
        return comments;
    }

    public List<Comment> findComments(Long pno) {
        return commentRepository.findByPno(pno);
    }

페이징된 댓글들만 필요할 줄 알아서

페이징 댓글들을 위해 findComments라고 지었으나 수정했다.

메서드 명을 페이징 댓글과 댓글로 분리했다.

 

PosterController

@GetMapping("/poster/delete")
public String delete(@RequestParam(value="id") Long id) {
	commentService.deleteCommentByPno(id);
	posterService.deletePoster(id);
	return "redirect:/posters";
}

기존에 게시글의 id를 받아봐 해당 게시글만 삭제하였으나

해당 게시글의 id를 통해 댓글들도 삭제처리를 해주게 했다.

 

구현 결과

해당 게시글 삭제전에 댓글들을 삭제하고 게시글 삭제가 이뤄진다.

 

 

+ 테스트 코드

@SpringBootTest
@Transactional
public class CommentTest {

    @Autowired
    private SpringDataJpaCommentRepository commentRepository;

    @Autowired
    private CommentService commentService;


    @Test
    @DisplayName("해당 게시글 댓글 삭제")
    public void commentDeleteByPno() {
        List<Comment> commentList = commentService.findComments(232L);
        System.out.println("commentList Size = " + commentList.size());
        commentService.deleteCommentByPno(232L);
        Assertions.assertThat(commentService.findComments(232L).size()).isEqualTo(0);
    }


}

허접한 코드이지만 신기방기

@SpringBootTest로 통합 테스트를

@Transactional을 통해 테스트 코드 수행 후 상태를 다시 원래 상태로 복구해준다.

Comments