지우쓰 개발일기
[JPA] JPQL (5) 본문
본 포스팅은 자바 ORM 표준 JPA 프로그래밍 (김영한 저)을 읽고 정리한 내용입니다.
자바 ORM 표준 JPA 프로그래밍
에이콘 오픈 소스 프로그래밍 시리즈. 이 책은 JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것을 다룬다.
www.aladin.co.kr
벌크 연산
-
em.remove()는 너무 오래 걸림
-
em.executeUpdate(): 벌크 연산 후 영향을 받은 엔티티 건수 반환
주의점
-
벌크 연산은 Persistence Context를 무시하고 DB에 바로 쿼리한다.
-
벌크 연산 전 후의 Persistence Context 엔티티들이 DB에 값과 차이가 날 수 있다.
해결책
-
em.refresh()
-
DB에서 엔티티 다시 조회
-
-
벌크 연산 먼저 실행
-
벌크 연산 수행 후 Persistence Context 초기화
-
초기화 이후 다시 엔티티 조회
-
Persistence Context & JPQL
쿼리 후 영속 상태
-
관리 O : 엔티티 조회
-
관리 X : 임베디드 타입, 단순 필드 조회
-
즉, 조회한 엔티티만 Persistence Context가 관리한다.
JPQL로 조회한 엔티티
-
JPQL은 DB에서 즉시 엔티티를 조회
-
조회한 엔티티 Persistence Context에서 검색
-
있으면 새로 조회한 엔티티 버림
-
없으면 Persistence Context에 엔티티 추가
-
Persistence Context의 엔티티 반환
find() vs JPQL
find()
-
Persistence Context에서 먼저 조회
-
엔티티가 없으면 DB에서 조회
JPQL
-
DB에 SQL을 실행해서 조회
공통점
-
조회된 엔티티는 영속 상태다.
-
Persistence Context에 이미 존재하는 엔티티가 있으면 기존 엔티티를 반환한다.
Flush
JPQL & Flush
-
JPQL은 무조건 우선 DB에서 데이터를 조회한다.
-
따라서 JPQL을 실행하기 전 Persistence Context와 DB를 동기화해야 한다.
최적화
-
FlushModeType.AUTO: flush on query & commit
-
FlushModeType.COMMIT: flush on commit
-
너무 자주 flush가 일어나는 경우에만 후자를 고려해야 한다.
-
JPA를 통하지 않고 JDBC를 통해 쿼리하면 문제가 생기므로 별도로 flush 해야 한다.
'Spring Boot > JPA' 카테고리의 다른 글
[JPA] Spring Data JPA, JpaRepository (0) | 2020.09.25 |
---|---|
[JPA] QueryDSL (0) | 2020.09.22 |
[JPA] JPQL (4) (0) | 2020.09.21 |
[JPA] JPQL (3) (0) | 2020.09.21 |
[JPA] JPQL (2) (0) | 2020.09.20 |