김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C
JPQL - 벌크 연산
• 많은 양의 데이터를 대상으로 update, delete를 하는 연산입니다.
EX) 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면?
• JPA 변경감지 기능으로 실행하려면 너무 많은 SQL 실행
1. 재고가 10개 미만인 상품을 리스트로 조회한다.
2. 상품 엔티티의 가격을 10% 증가한다.
3. 트랜잭션 커밋 시점에 변경감지가 동작한다.
변경된 데이터가 100건이라면 100번의 UPDATE SQL 실행
---> 데이터가 많을 수록 상당히 비효울적이다.
하여 한방에 100개의 데이터를 update해주는 연산을 벌크 연산이라고 합니다.
벌크연산 예제
• 쿼리 한 번으로 여러 테이블 로우 변경(엔티티)
• executeUpdate()의 결과는 영향받은 엔티티 수 반환
• UPDATE, DELETE 지원
• INSERT도 가능.(insert into .. select, 하이버네이트 지원)
테이블에 있는 모든 멤버의 나이를 20으로 update하는 벌크연산을 해보겠습니다.
결과를 보시면 11명의 member의 나이를 모두 20으로 update했음을 알 수 있습니다.
벌크 연산 주의 :
벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리합니다.
• 벌크연산을 먼저 실행해야 합니다. (벌크연산 전에 영속성 컨텍스트 비워짐)
• 영속성 컨텍스트에 들어있는 데이터가 있다면 벌크연산 수행 후 영속성 컨텍스트를 초기화해줘야합니다.
(만약에 회원의 연봉이 1000만원이었는데, 벌크연산으로 회원의 연봉을 6000으로 바꿨다면 영속성 컨텍스트에는 1000만원, DB에는 6000만원 입니다. 하여 영속성 컨텍스트를 초기화해줘야 합니다. )
위의 주의점을 아래 코드로 보겠습니다.
물론 결과는 벌크연산이 적용되지 않은 30입니다.
하여 아래처럼 벌크연산 후 바로 영속성 컨텍스트를 clear하고 DB에서 다시 가져와야 합니다.
이렇게되면 findmember.age = 20이 나옵니다.
'JPA > JPQL' 카테고리의 다른 글
JPA - Named 쿼리 (0) | 2021.07.24 |
---|---|
JPQL -엔티티 직접사용 (0) | 2021.07.24 |
JPQL 다형성 쿼리 (0) | 2021.07.24 |
JPQL - 패치조인의 특징과 한계 (0) | 2021.07.24 |
JPQL - 페치 조인(fetch join) (0) | 2021.07.23 |