TIL

2023.12.20 TIL - JPA - deleteAll() / deleteAllInBatch()

개인 복습과제에 마지막 수정일이 90일이 지난 데이터들을 삭제하려는 요구사항이 있어 Spring 스케줄을 통해 삭제하려고 한다.

해당 조건에 맞는 데이터를 찾은 후 List를 deleteAll() 메소드로 지우려고 작성하고 테스트하는데

날라간 쿼리를 보니 N개 만큼 delete 요청을 보내고있다..

 


deleteAll()

deleteAll 내부를 보니 다음과 같이 구현되어있다.

 

 

 

코드를 보면 Iteratable을 상속받는 클래스타입의 객체(필자는 List를 넘김) 에서 for문을 통해 delete 쿼리를 날리고있었다.

그래서 한 번에 쿼리를 날리는 메소드가 있는지 찾아보았다.


deleteAllInBatch()

찾아보니 deleteAllInBatch 라는 메소드가 있었다

해당 메소드 구현은 다음과 같다.

 

 

쿼리를 실행하기전에 DELETE\_ALL\_QUERY\_STRING 을 통해 바인딩을 해주고있다. 해당 부분을 살펴보자

 

 

 

getQueryString() 을 통해 해당 쿼리문을 applyAndBind의 인자로 넣는 것을 확인할 수 있다.

이어서 applyAndBind를 확인해보면 다음과 같이 구현되어있다.

 

 

 

applyAndBind 코드를 보니 내부에서 or를 붙여 하나의 쿼리를 만드는 것을 알 수 있었다.

 


느낀점

많은 데이터를 삭제 처리할 때, deleteAll() 보다는 deleteAllInBatch가 더 나은 것 같다.

좀 더 나은 성능을 위해서는 or 보다 in을 사용하는게 좋기 때문에 @Query를 통해 직접

쿼리를 작성하여 사용하는 것도 괜찮아보인다.

spring data jpa 구현된 메소드들을 사용할 때, 해당 메소드를 통해 실제로 어떤 쿼리가 나가는지 확인하고

좀 더 효율적인 쿼리 메소드를 사용해야겠다고 느꼈다.

728x90