스프링 데이터 JPA[쿼리 메서드] - 벌크 연산

2021. 2. 6. 23:16JPA/SPRING DATA JPA

벌크 연산이란?

insert, update, delete 할때 단건이 아닌 다건으로 한번에 처리하는 쿼리

JPA에서 벌크 연산시 주의점!

벌크 연산 쿼리는 엔티티 매니저가 영속성 컨텍스트에 변경된 내용을 업데이트 하지 않고 바로 데이터베이스로 보내진다. 따라서 벌크 연산 후에 실제 데이터베이스와 영속성 컨텍스트의 엔티티 정보가 다를 수 있다!

그래서 벌크 연산 후에는 flush()와 clear()를 꼭 해줘서 이후의 로직에 대해 다시 영속 상태가 되도록 유도 해야한다!

flushAutomatically, clearAutomatically

스프링 데이터 JPA에서는 해당 속성으로 flush()와 clear()를 자동으로 수행되게 할 수 있다.

여기서 flush는 clear하기 전에 혹시 모를 기존에 영속성 컨텍스트에 남아있는 쿼리를 수행하기 위함이다.

예시)

@Modifying(flushAutomatically = true, clearAutomatically = true)
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);

@Modifying

INSERT, UPDATE, DELETE에 모두 적용되며 없을 경우 SELECT로 인식하기 때문에 에러가 발생한다.