본문 바로가기

Spring Data JPA

벌크성 수정쿼리 @Modifying

 

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.

www.inflearn.com

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

Spring Data JPA @Modifying (2) - flushAutomatically

https://devhyogeon.tistory.com/4 Spring Data JPA @Modifying (1) - clearAutomatically 이 글을 작성하게 된 계기는 Spring Data JPA의 @Modifying에 있는 flushAutomatically에 대해 의문점이 생겼고, 그에 대한 학습 테스트를 해보

devhyogeon.tistory.com

벌크성 수정쿼리

 

  • 스프링 데이터 JPA에서는 @Modifying 어노테이션을 사용하여 벌크성 수정쿼리를 전송할 수 있다.
  • @Query 어노테이션을 통해 JPQL, Native Query로 작성한 CUD 쿼리를 대상으로 사용된다.
  • 영속성 컨텍스트를 사용하지 않고 직접적으로 쿼리를 실행하는 방식으로 동작하므로 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 있는 엔티티의 상태가 달라질 수 있으므로 주의해야한다.
// udpate
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int updateBulkAgePlus(@Param("age") int age);

// delete
@Modifying
@Query("delete from Member m where m.MemberId = :id")
void deleteBulkById(long id);

@Modifying 속성

@Modifying 어노테이션은 clearAutomatically, flushAutomatically 속성을 지원한다.

 

  • clearAutomatically(default : false) - 벌크성 쿼리 실행 후 영속성 컨텍스트를 초기화 할 것인지 설정한다.
  • flushAutomatically(default : false) - 벌크성 쿼리 실행 전 영속성 컨텍스트의 변경 사항을 DB에 flush 할 것인지를 설정한다.

* 추가 flushAutomatically 속성이 false 인경우에도 flush 가 실행되는 경우 

Spring Data JPA는 구현체로 Hibernate를 사용하며 Hibernate의 FlushModeType enum 클래스를 살펴보면 값으로 AUTO, COMMIT이 존재하는 것을 확인할 수 있다. 

 

  • AUTO: flush가 쿼리 실행시 발생 (default)
  • COMMIT: flush가 트랜잭션이 COMMIT될때 발생

두 값 중에서 AUTO를 Default값으로 설정하고 있으므로 @Modifying의 flushAutomatically 속성이 false로 설정되어 있어도 쿼리 실행전에 항상 flush가 동작한다.

해당 설정을 변경하기 위해서는 application.properties 또는 yml에 아래 설정을 추가해주면된다.

 

  • spirng.jpa.properties.org.hibernate.flushMode=[AUTO/COMMIT]

'Spring Data JPA' 카테고리의 다른 글

Hint & Lock  (0) 2022.12.18
엔티티 그래프 @EntityGraph  (0) 2022.12.18
페이징과 정렬  (0) 2022.12.18
Query Methods  (0) 2022.12.18
Spring Data Jpa 활성화 및 공통 인터페이스와 구현체 확인  (0) 2022.12.06