실전! 스프링 데이터 JPA

Ch03. 쿼리 메소드 기능 - 벌크성 수정 쿼리

webmaster 2021. 12. 26. 12:45
728x90

 

JPA

벌크연산

  • JPA의 더티 체크 기능을 사용하면, 단건 업데이트밖에 되지 않기 때문에 여러 건을 Update 하기 위해서는 벌크성 수정 쿼리를 동작시켜야 된다.
  • 벌크 연산 같은 경우 조심해서 사용해야된다.(쿼리를 직접 동작)

SpringDataJpa

SpringDataJPA의 벌크연산
Test

  • 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용
    • 사용하지 않으면 다음 예외 발생
    • org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
  • 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트 초기화: @Modifying(clearAutomatically = true) (이 옵션의 기본값은 false )
    • 벌크 연산을 진행 후 영속성 컨택스트와 DB을 데이터 정합성이 다를 수 있으므로 clear옵션을 설정해 주어야 한다.
    • 이 옵션 없이 회원을 findById 로 다시 조회하면 영속성 컨텍스트에 과거 값이 남아서 문제가 될 수 있다. 만약 다시 조회해야 하면 꼭 영속성 컨텍스트를 초기화 하자

참고: 벌크 연산은 영속성 컨텍스트를 무시하고 실행하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 엔티티 상태가 달라질 수 있다.

권장하는 방안 

1. 영속성 컨텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행한다.

2. 부득이하게 영속성 컨텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 컨텍스트를 초기화 한다.

728x90