[ 김영한 스프링 데이터 JPA #5 ] 벌크성 수정 쿼리

김수호·2024년 6월 3일
0
post-thumbnail

일반적으로 JPA 에서 수정 시, 엔티티 정보를 가져와서 값을 변경한다. 그러면 이후에 변경 감지를 통해 DB에 업데이트 쿼리가 반영되는 식이다. 그런데 이것은 대부분 단 건씩 처리하는 방식이다.

🤔 한 번의 수정으로 여러 데이터에 반영하도록 하려면 어떻게 해야할까? 이런 경우 벌크성 수정 쿼리를 통해서 처리한다.

  • 순수 JPA 를 사용한 벌크성 수정 쿼리
  • 스프링 데이터 JPA를 사용한 벌크성 수정 쿼리
    • 조회를 제외한 작업시에는 @Modifying 어노테이션을 사용해야 한다.
      • 사용하지 않으면 예외가 발생한다.

 

✔️ 참고

  • 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트 초기화해야 한다. ( clearAutomatically 옵션 )
    • @Modifying(clearAutomatically = true) ( default:false )
    • 이 옵션을 적용하지 않으면, 벌크 연산 후 다시 조회해야 하는 경우가 있을 때, 영속성 컨텍스트에 과거 값이 남아서 문제가 될 수 있다. 따라서, 만약 벌크성 쿼리 작업 이후 다시 조회해야 하면 꼭 영속성 컨텍스트를 초기화 하자.
    • 벌크 연산은 영속성 컨텍스트를 무시하고 실행하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 엔티티 상태가 달라질 수 있다.
      • 실무 권장 방안
        • 1) 영속성 컨텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행한다.
        • 2) 부득이하게 영속성 컨텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 컨텍스트를 초기화 한다.
    • 참고로 스프링 데이터 JPA 와 다른 데이터 접근 기술을 섞어서 사용할 때도, 이런 영속성 컨텍스트와 관련된 부분을 조심해야 한다.
  • 참고) clearAutomatically / flushAutomatically
    • https://velog.io/@gruzzimo/JPA-Modifying%EC%9D%98-flushAutomatically-%EC%98%B5%EC%85%98%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%93%B0%EC%A7%80

강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.

profile
현실에서 한 발자국

0개의 댓글