Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

지우쓰 개발일기

[JPA] JPQL (5) 본문

Spring Boot/JPA

[JPA] JPQL (5)

jiwoo-kimm 2020. 9. 24. 01:03

본 포스팅은 자바 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
Comments