[Spring Data JPA] @Modifying
@Modifying
Spring Data JPA에서 데이터베이스의 데이터를 수정하는 쿼리를 정의할 때 사용되는 애노테이션으로 @Query 애노테이션과 함께 변경이 일어나는 작업을 수행하는 메서드에 사용한다. 이는 벌크 연산 시 사용한다.
벌크 연산
데이터베이스에서 대량의 데이터를 Update, Delete 하기 위한 작업으로 이는 JPA에서 변경 감지를 통해 변경되는 것이 아니라 한 번에 Update 쿼리를 날리는 작업을 의미한다.
즉 Entity의 Life-cycle을 무시하고 쿼리가 실행되므로 영속성 컨텍스트 관리에 주의해야 한다.
(jdbc 템플릿, mybatis 처럼 jdbc를 직접 날리는 것도 Jpa는 인식하지 못하므로 영속성 컨텍스트를 플러시나 초기화를 해주어야 한다.)
앞서 말했다 시피 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 날린다.
따라서 벌크 연산을 먼저 실행하고 영속성 컨텍스트를 초기화해야 한다.
→ 벌크 연산은 JPQL이므로 실행 시 flush가 발생함.
하지만 내가 만약 DB에서 데이터를 조회 후 벌크 연산을 실행한다면?
DB에는 결과가 반영되었지만 영속성 컨텍스트에는 변경 전 결과가 남아있음.
따라서 컨텍스트를 초기화하고 사용해야 안전하다.
이를 위해 @Modifying 애노테이션에는 두 가지 옵션을 설정할 수 있다.
- flushAutomatically (기본 false)
- 설정 값이 true 라면 해당 쿼리 실행 전 영속성 컨텍스트의 변경 사항을 flush
- clearAutomatically (기본 false)
- 설정 값이 true 라면 벌크성 쿼리를 실행 후 영속성 컨텍스트를 clear
@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int increaseMemberAge(@Param("age") int age);
참고
실전! 스프링 데이터 JPA 강의 | 김영한 - 인프런
김영한 | 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제
www.inflearn.com