개인 복습과제에 마지막 수정일이 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 구현된 메소드들을 사용할 때, 해당 메소드를 통해 실제로 어떤 쿼리가 나가는지 확인하고
좀 더 효율적인 쿼리 메소드를 사용해야겠다고 느꼈다.
'TIL' 카테고리의 다른 글
2023.01.11 TIL - [프로젝트] Ticket Auction 2일차 (0) | 2024.01.11 |
---|---|
2023.01.02 TIL - DTO 역직렬화 문제 (no delegate- or property-based Creator) (1) | 2024.01.03 |
2023.12.19 TIL - AWS SDK(Feat.S3) Credential 로드 (0) | 2023.12.19 |
2023.12.18 TIL (2) | 2023.12.18 |
2023.12.13 TIL (0) | 2023.12.13 |