실전! 스프링 데이터 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 |