ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링] 객체지향 쿼리 심화
    스프링 2022. 12. 26. 22:35
    728x90
    김영한 자바 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
Designed by Tistory.