Spring Boot

[SPRING] bulk delete 벌크딜리트 하기

재원쓰 2023. 2. 22. 00:23

커뮤니티 프로젝트를 하면서 게시글/댓글/좋아요까지 연관되어있는 테이블을 쿼리최적화 하면서 삭제하는 방법을 찾고 있었다.

 

우선 댓글과 연관되어있는 좋아요를 삭제 해줄것이다.

게시글 ID로 모든 댓글을 불러온다.

List<CommunityComment> comments = commentRepository.findAllByCommunityBoardId(boardId);

여기서 일단 쿼리가 한번 쓰였다.

 

다음은 이 댓글에 있는 좋아요를 다 지워줘야 하는데...

for (CommunityComment comment : comments) {
    likeCommentRepository.deleteAllByComment(comment);
}

이렇게 했다가는

엄청난 쿼리가 나가는 것을 볼 수 있다....

 

스프링데이터 JPA의 'In'이라는 것을 써보는 건 어떨까?

likeCommentRepository.deleteAllByCommentIn(comments);

음 안된다.

 

SpringDataJpa에서 deleteByXXX 등의 메소드 사용시

  • 삭제 대상들을 전부 조회하는 쿼리가 1번 발생한다.
  • 삭제 대상들은 1건씩 삭제 된다.
  • cascade = CascadeType.DELETE으로 하위 엔티티와 관계가 맺어진 경우 하위 엔티티들도 1건씩 삭제가 진행된다.

그러니까. 스프링데이터 JPA는 bulk delete를 해줄 수 없는 것 같다.

 

깔끔하게 직접 쿼리문을 작성 해주자.

@Query("delete from CommentLike cl where cl.comment.Id in :commentIds")
@Modifying
void deleteLikeAllByInCommentId(@Param("commentIds") List<Long> commentIds);

익숙하지 않은 쿼리문이 작성되었다.

where id in :idList 👈 이 부분에 주목하면 될 것 같다. In을 저렇게 써주면 되는군!

쿼리가 한방으로 줄었다!!!