-
[스프링] 객체지향 쿼리 심화스프링 2022. 12. 26. 22:35728x90
김영한 자바 ORM 표준 JPA 프로그래밍 - 객체지향 쿼리 심화
1. 벌크 연산
여러 건을 한번에 수정하거나 삭제하는 벌크 연산을 사용하기
// queryString을 변경하면 수정, 삭제, insert도 가능 String queryString = " update Product p " + " set p.price = p.price * 1.1 " + " where p.stockAmount < :stockAmount "; // 조건 : 재고 10개 미만인 모든 상품 10%가격 상승 int resultCount = em.createQuery(queryString) .setParameter("stockAmount",10) .executeUpdate(); // 이 부분이 벌크 연산하는 부분
주의할점
1번. 벌크 연산은 영속성 컨텍스트와 2차 캐시를 무시하고 바로 디비에 직접 쿼리작성 한다는 점 ( 플러쉬 등 관련으로 영속성 컨텍스트랑 DB의 데이터가 달라서 무결성 문제 발생 가능 )
1번 문제 해결 방법
- em.refresh() ( 권장 놉 )
- 벌크 연산 먼저 실행 ( 가장 실용적임 )
- 벌크 연산 수행후 영속성 컨텍스트 초기화 ( 때로는 추천 )1. JPQL은 조회한 엔티티만 영속성 컨텍스트가 관리한다 ( JPQL은 조회한 엔티티는 영속 상태 )
2. JPQL로 조회할때, 영속성 컨텍스트를 먼저 조회를 하고 없으면 디비를 조회하고, 1차 캐시에 저장한 후에 반환한다 ( 동일성을 만족시킴 ) -> 영속성 컨텍스트에 이미 존재하는 엔티티가 있으면 기존 엔티티 반환 ( 새롭게 조회된 엔티티는 버린다는 말임 )
1) Find VS JPQL
em.find() => 엔티티를 영속성 컨텍스트에서 먼저 찾고 디비에서 찾는다 ( 성능상 이점이 있음 )
JPQL => 항상 디비 먼저 조회 ( 조호환 엔티티는 영속 성태, 영속성 컨텍스트에 이미 엔티티가 있으면, 기존 엔티티 반환 )
'스프링' 카테고리의 다른 글
[스프링] 트랜잭션과 락,2차캐리 (0) 2022.12.28 [스프링] OSIV (2) 2022.12.28 [스프링] 스프링 데이터 JPA (0) 2022.12.28 [스프링] QueryDsl 정리 (0) 2022.12.26 [스프링] JPQL 정리 (0) 2022.12.26