Chapter 03. 영속성 컨텍스트

Chapter 03. 영속성 컨텍스트

1. 엔티티 매니저 팩토리와 엔티티 매니저

구조

┌─────────────────────────────────────────────────────────────┐
│                  EntityManagerFactory                        │
│           (애플리케이션 전체에서 1개, 스레드 안전)              │
│                    ┌───────────────┐                         │
│                    │ Connection Pool│                        │
│                    └───────────────┘                         │
└────────────────────────┬────────────────────────────────────┘
                         │ createEntityManager()
         ┌───────────────┼───────────────┐
         ▼               ▼               ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│EntityManager │ │EntityManager │ │EntityManager │
│   (요청1)    │ │   (요청2)    │ │   (요청3)    │
│ 스레드 공유X  │ │ 스레드 공유X  │ │ 스레드 공유X  │
└──────────────┘ └──────────────┘ └──────────────┘
       │                │                │
       ▼                ▼                ▼
┌─────────────────────────────────────────────────┐
│                 영속성 컨텍스트                   │
│             (엔티티 저장/관리 환경)               │
└─────────────────────────────────────────────────┘

핵심 특징

구분EntityManagerFactoryEntityManager
생성 비용매우 높음낮음
생성 횟수애플리케이션당 1개요청마다 생성
스레드 안전O (공유 가능)X (공유 금지!)
커넥션풀 관리필요 시점에 획득
// 팩토리 생성 (1번만, 비용 큼)
EntityManagerFactory emf =
    Persistence.createEntityManagerFactory("jpabook");

// 엔티티 매니저 생성 (요청마다, 비용 작음)
EntityManager em = emf.createEntityManager();

엔티티 매니저는 DB 커넥션이 필요한 시점까지 커넥션을 얻지 않는다 (지연 획득)


2. 영속성 컨텍스트란?

“엔티티를 영구 저장하는 환경”

em.persist(entity);  // 엔티티를 영속성 컨텍스트에 저장

개념

  • 논리적 개념으로, 눈에 보이지 않음
  • 엔티티 매니저를 통해 접근/관리
  • 엔티티 매니저 생성 시 하나의 영속성 컨텍스트 생성
┌──────────────────────────────────────┐
│          EntityManager               │
│                │                     │
│                ▼                     │
│   ┌──────────────────────────┐       │
│   │    영속성 컨텍스트         │       │
│   │  ┌────────────────────┐  │       │
│   │  │     1차 캐시        │  │       │
│   │  │  ┌──────┬───────┐  │  │       │
│   │  │  │ @Id  │ Entity │  │  │       │
│   │  │  ├──────┼───────┤  │  │       │
│   │  │  │ "id1"│ member │  │  │       │
│   │  │  └──────┴───────┘  │  │       │
│   │  └────────────────────┘  │       │
│   │  ┌────────────────────┐  │       │
│   │  │ 쓰기 지연 SQL 저장소  │  │       │
│   │  │ INSERT INTO ...    │  │       │
│   │  └────────────────────┘  │       │
│   └──────────────────────────┘       │
└──────────────────────────────────────┘

영속성 컨텍스트의 5가지 이점

이점설명
1차 캐시동일 트랜잭션 내 캐싱
동일성 보장같은 엔티티는 같은 인스턴스
쓰기 지연SQL을 모아서 한 번에 전송
변경 감지엔티티 변경 시 자동 UPDATE
지연 로딩실제 사용 시점에 조회

요약

항목핵심
EntityManagerFactory앱당 1개, 스레드 안전, 공유 가능
EntityManager요청당 1개, 스레드 불안전, 공유 금지
영속성 컨텍스트엔티티를 영구 저장하는 환경
persist()엔티티를 영속성 컨텍스트에 저장
커넥션 획득실제 필요 시점까지 지연

핵심 코드

// 팩토리 생성 (앱 시작 시 1번)
EntityManagerFactory emf =
    Persistence.createEntityManagerFactory("jpabook");

// 엔티티 매니저 생성 (요청마다)
EntityManager em = emf.createEntityManager();

// 영속성 컨텍스트에 저장
em.persist(entity);

// 종료
em.close();
emf.close();