deleteAllInBatch() 함수란?
org.springframework.data.jpa.repository.JpaRepository에서 정의되어 있다.
비교할 대상인 deleteAll()은 인터페이스 org.springframework.data.repository.CrudRepository에 정의 되어있다.
둘다 구현체인 org.springframework.data.jpa.repository.support.SimpleJpaRepository에 구현되어있다.
Spring Data JPA의 JpaRepository에서 제공하는 대량 삭제(Batch Delete) 메서드로, 모든 엔티티를 한 번의 SQL 쿼리로 즉시 삭제하는 기능을 한다. deleteAll 메서드는 조회후 삭제하는 반면 (SELECT, DELETE) deleteAllInBatch는 바로 삭제한다는 특징이 있다.
deleteAllInBatch()의 특징
- 즉시 삭제 (Flush 수행)
- deleteAllInBatch()는 바로 DELETE SQL을 실행하며, 개별 엔티티를 하나씩 조회하거나 삭제하지 않는다.
- EntityManager.flush()를 자동으로 호출하여 트랜잭션 내에서 즉시 DB에 반영된다.
- 연관된 영속성 컨텍스트를 무시하고 직접 DELETE 실행
- 일반적인 deleteAll()은 개별 엔티티를 1개씩 삭제하지만,deleteAllInBatch()는 영속성 컨텍스트를 무시하고 한 번의 SQL로 삭제한다.
- @Transactional 필요
- deleteAllInBatch()는 트랜잭션 내에서 실행되어야 한다. (@Transactional 필요).
deleteAllInBatch() 사용 시 주의점
- 영속성 컨텍스트를 무시하고 실행되기 때문에 별도로 등록한 이벤트가 실행되지 않는다는 걸 주의해야한다.
(@PreRemove 같은 콜백 메서드가 동작하지 않으므로, 개별 삭제 로직이 필요하면 deleteAll()을 사용해야 함.)
- 연관된 엔티티(FK)가 있을 경우, 자식 엔티티를 먼저 삭제해야 한다.
(관련 stackoverflow 링크를 보자. )
따라서, 대량의 데이터를 삭제해야 하고 엔터티 리스너나 영속성 컨텍스트의 동기화가 필요하지 않은 경우에는 deleteAllInBatch()를 사용하는 것이 효율적이다. 반면, 엔터티 리스너의 호출이나 영속성 컨텍스트의 동기화가 필요한 경우에는 deleteAll()을 사용하는 것이 적합하다.
관련링크
'개발 > TIL' 카테고리의 다른 글
Java의 Optional<T>로 안전하게 null 데이터 처리하기 (0) | 2025.02.20 |
---|---|
default 를 이용해서 interface 에 메서드 정의하기 (0) | 2025.02.19 |
SQL 엔진에서 JOIN 을 수행하는 원리 (MySQL) (0) | 2025.02.17 |
CI/CD 방식과 각 장/단점 (0) | 2025.02.16 |
controller 에서 dto 그대로 전달하기 vs 파라미터로 나누어 전달하기 (0) | 2025.02.15 |