JPA - 영속성 컨텍스트

김수혁·2023년 11월 1일
0

CS

목록 보기
2/3

🍃 영속성 컨텍스트

JPA에서 사용하는 개념 => 영속성 컨텍스트

❗영속성 컨텍스트

  • Entity를 영구 저장하는 환경

  • 눈에 보이지 않는 논리적 개념

  • 애플리케이션과 DB 사이 객체를 보관하는 가상의 DB라고 생각하면 편하다

  • 영속성 컨텍스트에 Entity를 보관 및 관리

    ❔ Entity Manager

    사용자가 Entity를 영속성 컨텍스트에 접근 및 관리 할 수 있도록 도와주는 매니저

  • EntityManagerFactory를 통해 요청이 올 때마다 EntityManager를 생성
    *EntityManager는 내부적으로 Connection을 사용하여 DB 접근

즉, 한개의 영속성 컨텍스트가 여러개의 EntityManager에 대응할 수 있다.

엔티티를 저장한다는 것

  • 데이터를 영속성 컨텍스트에 저장한다는 의미
  • 엔티티를 영속화 한다는 의미
  • DB에 저장하는 것이 아님

❗ 엔티티 생명주기

EntityManager에 영속성 컨텍스트에 보관, 관리, 삭제되는 Entity의 생명주기

EntityManager 생성

EntityManagerFactory emf = Persistence.createEntityManagerFactory("ssafy");
  • EntityManagerFactory를 먼저 생성
EntityManager em = emf.createEntityManager();
  • EntityManagerFactory를 이용하여 EntityManager 생성

Entity 생성

비영속
Member member = new Member();
  • 객체 생성
  • 엔티티가 영속성 컨텍스트에 없는 상태
영속
em.persist(member);
  • 엔티티를 영속성 컨텍스트에 저장 -> 엔티티를 영속성 컨텍스트가 관리
준영속
em.detach(member) => 특정 엔티티만 준영속 상태로 변환
em.clear() => 영속성 컨텍스트 초기화
em.close() => 영속성 컨텍스트 종료
  • 엔티티가 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 영속성 컨텍스트가 엔티티를 관리하지 않아 엔티티는 영속성 컨텍스트가 제공하는 기능 사용 X
삭제
em.remove(member)
  • 영속성 컨텍스트에 있는 엔티티 삭제
  • 이때 DB에서도 삭제

영속성 컨텍스트의 장점

  1. 1차 캐시 및 동일성 보장
  2. 트랜잭션 쓰기 지연
  3. 변경 감지
  4. 지연 로딩
1차 캐시 및 동일성 보장
  • 1차 캐시 : 영속성 컨텍스트 내부에서 엔티티를 보관하는 저장소
  • 동일성 보장 : 같은 트랙잭션 안에서 같은 객체는 ==로 비교 가능

❔ 1차 캐시가 동작하는 과정은 ❔
1. 엔티티 생성 후 영속화(영속성 컨텍스트에 보관)
2. 해당 엔티티 조회
2-1. JPA는 영속성 컨텍스트에 1차 캐시 확인
2-2. 만약 key가 같은 값이 있으면 캐시에서 값을 가져온다
2-3. 만약 없다면 DB 조회
3. DB에 데이터가 있으면 가져오고 1차 캐시에 저장 후 데이터 변환

트랜잭션 쓰기 지연
  • DB에 보낼 쿼리문을 한 트랜잭션 안에 모았다가 한번에 송출
  • 목적 : 네트워크 부하 줄이기
  • 방법
트랜잭션 저장
em.persist(member)
  • 객체 생성 후 영속화
  • 1차 캐시에 저장 및 Insert 쿼리를 트랜잭션에 저장
트랜잭션 커밋
transaction.commit()
  • 트랜잭션을 커밋하면서 EntityManager의 flush함수 호출
    ‼ flush란? => 영속성 컨텍스트의 내용을 DB에 반영하는 것

변경 감지

  • 영속성 컨텍스트에서 보관하는 데이터에 변경이 일어났는지 확인
  • 데이터 변경 확인 시 update 쿼리를 JPA가 날려줌
동작 순서

지연 로딩

  • 즉시 로딩: 엔티티 조회 시 연관된 객체도 함께 DB에서 조회
  • 지연 로딩 : 연관된 객체 조회 X, 필요할 때 DB에서 조회
profile
안녕

0개의 댓글