- @Query 어노테이션(JPQL Query, Native Query)을 통해 작성된 DML쿼리에서 사용되는 어노테이션.
- 기본적으로 JpaRepository에서 제공하는 메서드 혹은 메서드 네이밍으로 만들어진 쿼리에는 적용되지 않는다.
clearAutomatically,flsuAutomatically속성을 변경할 수 있고 주로 벌크연산과 같이 이용된다.벌크 연산 : 다건의 UPDATE, DELETE 연산을 하나의 쿼리로 하는 것
- @Query에 벌크 연산 쿼리를 작성하고 @Modifying을 붙이지 않으면
InvalidDataAccessApiUsageexception이 발생한다.
✨JPA Entity LifeCycle을 무시하고 쿼리가 실행되기 때문에 영속성 콘텍스트 관리에 주의해야한다!!
@Modifying이 붙은 해당 쿼리 메서드 실행 직후, 영속성 컨텍스트를 clear 할 것인지 지정하는 Attribute.
: @Query로 정의된 JPQL을 실행후에 자동으로 영속성 컨텍스트를 비워주는 옵션. > 영속성 컨텍스트가 비워져서 데이터베이스에서 가져온 모든 데이터들이 영속성 컨텍스트에 저장되어 최신 상태를 유지할 수 있다.
JPA에서는 1차캐시를 통해 엔티티를 캐싱 > DB의 접근횟수 줄임 > 성능 개선
1차캐시는 @Id값을 key값으로 엔티티를 관리하므로 findBy~~등을 통해 엔티티를 조회했을 시 @Id값이 캐시에 존재한다면 DB에 접근하지 않고 캐싱된 엔티티를 반환한다.
JPA의 1차 캐시는 DB에 접근 횟수를 줄이는 성능개선에는 좋다.
다만 @Modifying + @Query를 사용한 벌크연산에는 이 기능 때문에 예측하지 못한 결과가 나올 수 있다.
벌크연산은 1차 캐시를 포함한 영속성 컨텍스트를 무시하고 바로 Query를 실행하므로
"영속성 컨텍스트는 데이터 변경을 알 수가 없다."벌크 연산 실행 시, 1차캐시(영속성 컨텍스트)와 DB의 데이터 싱크가 맞지 않게 된다.
👉🏻Spring Data JPA는 @Modifying의 clearAutomatically 유용한 기능을 제공하기 때문에 이를 쉽게 해결할 수 있다.
clearAutomatically를 ture로 변경해준다면, 벌크 연산 직후 자동으로 영속성 컨텍스트를 clear해준다.
@Query와 @Modifying을 통한 쿼리 메서드를 사용할 때, 해당쿼리를 실행하기 전 영속성 컨텍스트의 변경사항을 DB에 flush 할 것인지를 결정하는 Attribute.
Default : false
Spring Data JPA는 구현체로 Hibernate를 사용하고 있고 FlushModeType Enum class가 있다.
spring.jpa.properties.org.hibernate.flushMode=COMMIT
AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)은 embedded DB가 아닌 properties에 정의한 DataSource를 사용할 수 있게 한다.@Transactional을 포함하고 있다.@Rollback(false)를 이용하면 Rollback이 되지 않는다. 참고
Spring Data JPA @Modifying 알아보기
Spring Data JPA @Modifying (1) - clearAutomatically
Spring Data JPA @Modifying Annotation