JPA

벌크 연산(부제 - DB에 직접 쿼리)

쿠카이든 2022. 6. 18. 21:02
728x90
  • 엔티티를 수정하려면 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용한다.
  • 하지만 이방법으로는 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래 걸린다.
  • 이럴 때 여러건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용하면 된다.
String sqlString = 
    "update Product p " +
    "setp.price = p.price * 1.1 " +
    "where p.stockAmount < :stockAmount";
    
int resultCount = em.createQuery(qlString)
                    .setParameter("stockAmount", 10)
                    .executeUpdate();
  • 벌크 연산은 executeUpdate() 메소드를 사용한다. 이 메소드는 벌크 연산으로 영향을 받은 엔티티 건수를 반환한다.
  • 삭제도 같은 메소드를 사용한다. 아래는 100원 미만인 상품을 삭제하는 코드다.
String qlString = 
    "delete from Product p " +
    "where p.price < :price";
    
int resultCount = em.createQuery(qlString)
                    .setParameter("price", 100)
                    .executeUpdate();
  • 주의점 : 벌크연산을 사용할 때는 벌크 연산이 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리한다는 점에 주의
  • 해결 방법 : 벌크 연산 먼저 실행 - 예를 들어 위에서 벌크 연산을 먼저 실행하고 나서 상품A를 조회하면 벌크 연산으로 이미 변경된 상품A를 조회하게 된다.

 

출처 : JAVA 표준 ORM JPA 프로그래밍 (저자 : 김영한)

728x90