본문 바로가기
JPA/JPA

[JPA] JPQL - 벌크 연산

by 걸어가는 신사 2022. 1. 8.

1. 벌크 연산

  • 엔티티를 수정하려면 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용하고, 삭제하려면 EntityManage.remove() 메서드를 사용한다.
  • 하지만 이 방법으로 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래 걸린다. 
  • 여러 건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용한다.
//모든 멤버의 나이를 20으로 수정한다.
int resultCount = em.createQuery("update Member m set m.age = 20")
	.executeUpdate();
    
//10살 이상의 멤버를 모두 삭제한다.
int resultCount = em.createQuery("delete from Member m where m.age > 10")
	.executeUpdate();
  • executeUpdate() 메서드를 사용하여 벌크 연산을 한다.
    • 벌크 연산으로 영향을 받은 엔티티 건수를 반환한다.

 

2. 벌크 연산의 주의점

  • 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리 한다.
  • 영속성 컨텍스트에 있는 상품A와 데이터베이스에 있는 상품A의 가격이 다를 수 있다.
    • 벌크 연산을 주의해서 사용해야 한다.

 

3. 문제 해결 방법

(1) em.refresh() 사용

  • 벌크 연산을 수행한 직후에 정확한 상품A 엔티티를 사용해야 한다면 em.refresh()를 사용해서 데이터베이스에서 상품A를 다시 조회하면 된다.

(2) 벌크 연산 먼저 실행

  • 벌크 연산을 가장 먼저 실행하는 것이다.
  • 벌크 연산을 먼저 실행하고 나서 상품A를 조회하면 벌크 연산으로 이미 변경된 상품A를 조회하게 된다.
  • JPA와 JDBC를 함께 사용할 때 유용하다.

(3) 벌크 연산 수행 후 영속성 컨텍스트 초기화

  • 벌크 연산을 수행한 직후에 바로 영속성 컨텍스트를 초기화해서 영속성 컨텍스트에 남아 있는 엔티티를 제거한다.
반응형

댓글