📦 영속성 컨텍스트(Persistence Context)란?
- JPA에서 Entity 객체를 저장하고 관리하는 1차 캐시 역할의 공간
EntityManager가 영속성 컨텍스트에 접근하는 수단- 같은 트랜잭션 내에서 같은 객체 인스턴스 반환
- DB와 자동으로 동기화되는 관리 상태를 유지
🧱 구조적 특징

눈에 보이지 않는 논리적 공간
Entity Manager를 통해서 영속성 컨텍스트에 접근
EntityManager.persist(entity);Entity(객체)를 영속성 컨텍스트에 영속(저장)함
👤 Entity란?
- JPA에서 테이블과 매핑되는 저장 가능한 클래스

@Entity 어노테이션 사용💡 영속성 컨텍스트를 쓰는 이유
1차 캐시
→ 같은 객체 여러 번 조회해도 DB에 접근 안 함
변경 감지 (Dirty Checking)
→ setName()만 해도 커밋 시 SQL UPDATE 자동 실행
쓰기 지연 (Write-Behind)
→ 여러 persist()를 모아서 한번에 SQL 실행
연관 관계 자동 처리
→ getCompany() 등으로 연결된 객체 자동 조회
동일성 보장
→ 같은 트랜잭션 안에서는 == 비교 결과도 true
🔄 Entity 상태
- 비영속 → 영속 → 준영속 → 삭제의 단계
📘 1. 비영속 (New / Transient)

Tutor tutor = new Tutor(1L, "wonuk", 100); // 그냥 객체일 뿐
→ DB와 전혀 관계 없음
→ em.persist() 하기 전 상태
📗 2. 영속 (Managed)

em.persist()를 통해 영속성 컨텍스트에 등록된 상태em.persist(tutor); // 영속 상태 진입
✅ 트랜잭션 커밋 시 실제 INSERT 쿼리 실행
transaction.commit(); // 여기서 SQL 실행됨
→ 실행 전: persist 전
→ 실행 후: persist 후
→ DB에 INSERT 발생은 커밋 시점
📙 3. 준영속 (Detached)
🔌 만드는 방법
| 방법 | 설명 |
|---|---|
em.detach(entity) | 특정 엔티티만 분리 |
em.clear() | 전체 컨텍스트 초기화 |
em.close() | 컨텍스트 자체 종료 |
⚠️ 준영속 상태에서는 JPA가 변경 감지를 하지 않음 → DB 반영 불가
🗑️ 4. 삭제 (Removed)
em.remove() 호출로 삭제 예약 상태em.remove(tutor);
→ 아직 DB에서 제거된 것은 아님 → 트랜잭션 커밋 시 DELETE 실행
🎯 생명주기 정리
| 상태 | 설명 | JPA 관리 여부 |
|---|---|---|
| 비영속 | 단순 객체, DB와 무관 | ❌ |
| 영속 | 컨텍스트에 등록, DB 반영 대상 | ✅ |
| 준영속 | 관리 종료된 객체 | ❌ |
| 삭제 | 삭제 예약 상태 | ✅ (커밋 시 DELETE) |
🧠 요약 정리
| 구분 | 설명 |
|---|---|
| 🗃️ 영속성 컨텍스트 | JPA가 Entity 객체를 저장하고 관리하는 1차 캐시 |
| 📊 Entity 상태 | 비영속 → 영속 → 준영속 → 삭제 |
| 📈 영속 상태 장점 | 변경 감지, 캐싱, 동일성 유지, 자동 SQL |
| 🧹 상태 전환 방법 | persist, detach, remove 등으로 상태 변경 |