쌓고 쌓다
[스프링 부트] 게시글 삭제시 댓글 처리 - 13 본문
댓글 구현한 이후
게시글 삭제시 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을 통해 테스트 코드 수행 후 상태를 다시 원래 상태로 복구해준다.
'프로그래밍 > spring' 카테고리의 다른 글
[스프링 부트] Ajax 댓글 작성 및 삭제 - 15 (0) | 2023.07.24 |
---|---|
[스프링 부트] 댓글, 날짜순 게시글 정렬 기능 - 14 (0) | 2023.07.23 |
[스프링 부트] Ajax 댓글 리스트 및 페이징 - 12 (0) | 2023.07.18 |
빈 스코프 (singleton, prototype, request) (0) | 2023.07.17 |
빈 생명주기 콜백 (0) | 2023.07.16 |
Comments