JPQL , Persistence Context

Growing_HJ·2024년 8월 1일

JPA

목록 보기
14/15

📍 영속성 컨텍스트와 JPQL 📍

1. 쿼리 후 영속 상태인 것과 영속 상태가 아닌 것.

JPQL 의 조회 대상은 엔터티, 임베디드 타입, 값 타입 같이 다양한 종류가 존재한다.
JPQL 로 엔터티를 조회하면 영속성 컨텍스트에서 관리되지만 엔터티가 아니면 영속성 컨텍스트에서 관리되지 않는다.

2. JPQL 로 조회한 엔터티와 영속성 컨텍스트

JPQL 로 데이터베이스에서 조회한 엔터티가 영속성 컨텍스트에 이미 존재할 경우,
JPQL 로 데이터베이스에서 조회한 결과를 버리고 대신에 영속성 컨텍스트에 있던 엔터티를 반환한다.
이때는 식별자 값을 사용해서 비교한다.

  • JPQL 로 조회한 엔터티는 영속 상태이다.
  • 영속성 컨텍스트에 이미 존재하는 엔터티가 있으면 기존 엔터티를 반환한다.
    ❗️데이터베이스에서 새로 조회한 엔터티를 버리고 영속성 컨텍스트에 있는 기존 엔터티를 반환하는 이유
    ❗️ JPQL 로 조회한 새로운 엔터티를 영속성 컨텍스트에 하나 더 추가하거나,
    기존 엔터티를 새로 검색한 엔터티로 대체하면 발생하는 문제 ? ?
    👉🏻 영속성 컨텍스트는 기본 키 값을 기준으로 엔터티를 관리한다. 따라서 같은 기본 키 값을 가진 엔터티는 등록할 수 없다.
    ❗️ 영속성 컨텍스트는 영속 상태인 엔터티의 동일성을 보장한다 ❗️ 는 것을 기억할 것.

3. find() vs JPQL

em.find() 메소드는 엔터티를 영속성 컨텍스트에서 먼저 찾고 없으면 데이터베이스에서 찾는다.
따라서 해당 엔터티가 영속성 컨텍스트에 있으면 메모리에서 바로 찾으므로 성능상 이점이 있다
(1차 캐시라 부르는 이유)


JPQL 은 항상 데이터베이스에 SQL 을 실행해서 결과를 조회한다.
em.find() 메소드는 영속성 컨텍스트에서 엔터티를 먼저 찾고 없으면 데이터베이스에서 조회하지만,
JPQL 을 사용하면 데이터베이스를 먼저 조회한다.


JPQL 을 호출하면 데이터베이스에서 회원 엔터티를 조회하고 영속성 컨텍스트에 등록한다.
두번째 JPQL 을 호출하면 데이터베이스에서 같은 회원 엔터티를 조회한다.


JPQL 의 특징

  1. JPQL 은 항상 데이터베이스를 조회한다.
  2. JPQL 로 조회한 엔터티는 영속 상태이다.
  3. 영속성 컨텍스트에 이미 존재하는 엔터티가 있으면 기존 엔터티를 반환한다.
    ⭐️ JPQL 은 SQL 을 추상화해서 특정 데이터 베이스 기술에 의존하지 않는다. ⭐️

0개의 댓글