Chapter 03. 영속성 컨텍스트
1. 엔티티 매니저 팩토리와 엔티티 매니저
구조
┌─────────────────────────────────────────────────────────────┐
│ EntityManagerFactory │
│ (애플리케이션 전체에서 1개, 스레드 안전) │
│ ┌───────────────┐ │
│ │ Connection Pool│ │
│ └───────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│ createEntityManager()
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│EntityManager │ │EntityManager │ │EntityManager │
│ (요청1) │ │ (요청2) │ │ (요청3) │
│ 스레드 공유X │ │ 스레드 공유X │ │ 스레드 공유X │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────┐
│ 영속성 컨텍스트 │
│ (엔티티 저장/관리 환경) │
└─────────────────────────────────────────────────┘핵심 특징
| 구분 | EntityManagerFactory | EntityManager |
|---|---|---|
| 생성 비용 | 매우 높음 | 낮음 |
| 생성 횟수 | 애플리케이션당 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();