벌크성 수정 쿼리의 필요성
JPA는 데이터를 갖고 와서 데이터가 변경되었는지 확인하는 "Dirty Checking" 작업을 한다. 이것은 한 건 한 건의 데이터들에 대한 수정을 확인한다.
하지만 특정 연산에 의하여 몇 개인지 몰라 Dirty Checking이 불가능한 상황에는 어떻게 할까?
예를 들어 나이가 20 보다 적은 회원들을 모두 1살 높여야 하는 상황이라고 해보자.
이런 상황에는 나이가 20보다 적은 회원들을 모두 갖고와서 수정하는 것보다, Update Query 한 번 날리는 게 효율적이다.
이를 벌크성 수정쿼리라고 한다
순수 JPA에서의 벌크성 수정 쿼리
public int bulkAgePlus(int age) {
return em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age")
.setParameter("age", age)
.executeUpdate();
}
SpringDataJpa에서 벌크성 수정 쿼리
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
@Modifying 애노테이션은 @Query와 함께 사용한다.
@Query는 기본적으로 select를 할 때 사용하는 애노테이션이다.
Update, Delete와 같은 벌크 연산을 수행하려면 해당 애노테이션이 필요하다. 그렇지 않으면 예외를 발샌시킬 수 있다.
Spring Data JPA의 자동 영속성 컨텍스트 초기화
또한 JPA ORM편에서 학습했듯이 bulk 연산을 하면 영속성 컨텍스트를 무시하고 DB는 업데이트한다.
Application에 있는, 즉 영속성 컨텍스트에 있는 객체들은 바뀐 내용이 반영되어 있지 않다.
이전에는 em.flush로 영속성 컨텍스트에 남아있는 쿼리들을 DB에 반영한 후, em.clear로 영속성 컨텍스트를 비우는 방법을 사용했다.
Spring Data Jpa도 뭔가 em.clear를 지원할 것 같았는데, 역시나였다.
@Modifying(clearAutomatically = true)
@Modifying에 옵션을 제공하는데, 위와같이 설정하면 벌크 연산 후에 자동으로 영속성 컨텍스트를 비워준다.
'JPA > Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 6. 사용자 정의 Repository. DI 활용 (0) | 2023.11.24 |
---|---|
[Spring Data JPA] 5. JPA Hint & Lock (0) | 2023.11.23 |
[Spring Data JPA] 4. @EntityGraph (0) | 2023.11.23 |
[Spring Data JPA] 2. Spring Data JPA Paging (0) | 2023.11.23 |
[Spring Data JPA] 1. QueryMethod (0) | 2023.11.21 |