JPA deleteAll vs deleteAllInBatch

joona95·2024년 4월 1일

문제 상황

querydsl 사용하여 커스텀하게 생성한 레포지토리에 대한 테스트가 필요했다.

사실 테스트용 DB를 따로 생성하는 게 좋다고 듣기는 했는데 우선적으로 가볍게 테스트하기 위해서 기존 개발 DB 연결 상태에서 진행하게 됐다.

기존 데이터들과 별개로 동작하게 하기 위해 기존 데이터를 전부 제거 한 후에 테스트되도록 setup() 메서드에서 deleteAll() 을 사용했다.

deleteAll() 을 사용했더니 for문을 돌면서 id를 하나씩 검색하며 삭제를 하고 있었다.

결론

deleteAll()

Hibernate: 
    select
        blogrecipe0_.blogRecipeId as blogreci1_2_,
        blogrecipe0_.createdAt as createda2_2_,
        blogrecipe0_.updatedAt as updateda3_2_,
        blogrecipe0_.blogName as blogname4_2_,
        blogrecipe0_.blogThumbnailImgUrl as blogthum5_2_,
        blogrecipe0_.blogUrl as blogurl6_2_,
        blogrecipe0_.description as descript7_2_,
        blogrecipe0_.publishedAt as publishe8_2_,
        blogrecipe0_.title as title9_2_ 
    from
        BlogRecipe blogrecipe0_
        
 Hibernate: 
    delete 
    from
        BlogRecipe       
    where
        blogRecipeId=?
 Hibernate: 
    delete 
    from
        BlogRecipe       
    where
        blogRecipeId=?
...

select가 먼저 실행되며 전체 조회가 발생한다.

조회한 값들의 id마다 하나씩 delete가 일어난다.

deleteAllInBatch()

Hibernate: 
    delete 
    from
        BlogRecipe

select 없이 바로 테이블에 대한 delete가 발생한다.

0개의 댓글