-
[SPRING] bulk delete 벌크딜리트 하기Spring Boot 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을 저렇게 써주면 되는군!
쿼리가 한방으로 줄었다!!!
'Spring Boot' 카테고리의 다른 글
[QUERYDSL] querydsl 전용 메서드/라이브러리 정리 (0) 2023.02.18 [DOCKER] Docker에 MySQL 적용부터 WorkBench 연결까지! (1) 2023.02.14 [SPRING] 강한결합, 느슨한 결합? (0) 2023.02.12 [SPRING] Redis를 사용해보장 (0) 2023.02.09 [SPRING] 단위테스트 원칙 (0) 2023.02.03