본문 바로가기

공부방/JAVA

deleteAll 대신 deleteAllInBatch를 사용하자

최근 받은 코드 리뷰에서 deleteAll 대신에 deleteAllInBatch 를 사용하라는 리뷰를 받았다. 내부적인 구현이 어떠한지 궁금하여 알아본 내용을 포스팅한다
최근에 받은 코드리뷰
이런 리뷰를 받게 되었다.
 
repository.deleteAll()repository.deleteAllInBatch 는 차이가 무엇일까?
 

repository.deleteAll()

/* * (non-Javadoc) * @see org.springframework.data.repository.Repository#deleteAll() */ @Override @Transactional public void deleteAll() { for (T element : findAll()) { delete(element); } }
Java
deleteAll 의 내부 구현
어쩐지 show-sql 옵션으로 보면 delete 쿼리가 하나씩 날아갔다.
하지만, 테스트 코드이기 때문에 딱히 문제 되지 않는다고 생각하고 넘어갔다.
만약 테스트 데이터로 1000개 의 item 을 삭제해야 한다면 1000번의 delete 쿼리가 실행되는 것이다.
 

repository.deleteAllInBatch()

/* * (non-Javadoc) * @see org.springframework.data.jpa.repository.JpaRepository#deleteInBatch(java.lang.Iterable) */ @Override @Transactional public void deleteAllInBatch(Iterable<T> entities) { Assert.notNull(entities, "Entities must not be null!"); if (!entities.iterator().hasNext()) { return; } applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, entityInformation.getEntityName()), entities, em) .executeUpdate(); }
Java
deleteAllInBatch 의 내부구현
여기서 보면 getQueryString 에 매개변수로 DELETE_ALL_QUERY_STRING 을 받는다.
public abstract class QueryUtils { public static final String COUNT_QUERY_STRING = "select count(%s) from %s x"; public static final String DELETE_ALL_QUERY_STRING = "delete from %s x"; public static final String DELETE_ALL_QUERY_BY_ID_STRING = "delete from %s x where %s in :ids";
Java
실제로 실행되는 SQL query
해당하는 상수를 타고 들어가면 QueryUtilsDELETE_ALL_QUERY_STRING 이라는 상수가 있고
delete from %s x 와 같이 작성된 쿼리가 있다.
즉, delete from 테이블 이름 이 되는것이다.
 
쿼리 성능은 여러번 쿼리를 실행하는 것 보다 최대한 한번에 실행하는 것이 실행해야 하는 쿼리 개수가 많아질 수록 당연히 압도적인 성능 차이를 나타낼 것이다.
 
웹에서 대체로 delete 쿼리를 사용할 일이 없었는데 덕분에 좋은 ORM query 를 알게된것 같다.

'공부방 > JAVA' 카테고리의 다른 글

[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)  (0) 2023.03.22
equals, hashcode  (0) 2023.03.10
동기-비동기, 블로킹-논블로킹  (0) 2023.01.17
Database 조회 최적화  (0) 2022.07.29
Decorator pattern  (0) 2022.07.29