Programing/Spring
영속성 컨텍스트 - Entity 생명주기 및 캐시
블스뜸
2025. 5. 15. 17:49
영속성 컨텍스트 (Persistence Context)
- Entity 객체를 영속 상태로 관리하는 일종의 캐시 공간.
- 저장된 Entity는 데이터베이스와 자동 동기화됨.
- 동일 트랜잭션 내에서는 동일한 객체 유지.
Entity
- 데이터베이스에서 저장 가능한 데이터의 집합.
- JPA에서는 데이터베이스 테이블을 나타내는 클래스.
- 애플리케이션과 데이터베이스 사이의 Entity 관리 작업 공간.
Entity 생명주기
- 비영속 (new/transient): 영속성 컨텍스트가 모르는 새로운 상태, 데이터베이스와 무관.
- 영속 (managed): 영속성 컨텍스트에 저장 및 관리되는 상태, 데이터베이스와 동기화.
- 준영속 (detached): 영속성 컨텍스트에 저장되었다가 분리되어 더 이상 관리되지 않는 상태.
- 삭제 (removed): 영속성 컨텍스트에 의해 삭제로 표시된 상태, 트랜잭션 종료 후 데이터베이스에서 제거.
| 상태 | 영속성 컨텍스트 관리 | 데이터베이스 연관 | 복구 가능성 |
실제 DB 반영 시점
|
| 비영속 (New/Transient) | X | X | - | - |
| 영속 (Managed) | O | O | O | 트랜잭션 Commit |
| 준영속 (Detached) | X | O (이전 식별자) | Merge 가능 | 트랜잭션 Commit |
| 삭제 (Removed) | O (삭제 상태) | O (삭제 대기) | X | 트랜잭션 Commit |
캐시 레벨
- 1차 캐시 (First-Level Cache):
- 위치: 영속성 컨텍스트 내부.
- 범위: 하나의 영속성 컨텍스트 (일반적으로 하나의 트랜잭션 범위).
- 동작: Entity 조회 또는 영속화 시 영속성 컨텍스트 내부에서 먼저 확인, 존재 시 데이터베이스 접근 없이 캐시에서 반환. 트랜잭션 종료 시 소멸.
- 2차 캐시 (Second-Level Cache):
- 위치: 영속성 컨텍스트 외부, 여러 영속성 컨텍스트 간 공유 가능.
- 범위: 애플리케이션 레벨 또는 EntityManagerFactory 레벨.
- 목적: 여러 트랜잭션에 걸쳐 자주 사용되는 Entity 캐싱, 데이터베이스 접근 횟수 감소, 성능 향상.
- 구현: JPA 표준 기능, 구현체(Hibernate, EclipseLink 등)에 따라 설정 및 동작 방식 상이, 별도 캐시 제공자 연동 가능.
- 3차 캐시:
- JPA 표준 용어 아님.
- 문맥에 따라 애플리케이션 레벨 광범위 캐싱 또는 외부 분산 캐시 시스템 등을 비유적으로 지칭할 수 있음.
결론: 1차 캐시는 트랜잭션 범위 내, 2차 캐시는 애플리케이션 레벨에서 동작하는 캐시이며, 3차 캐시는 JPA 표준 용어가 아님. 캐시 레벨은 트랜잭션 시작 시점이 아닌 데이터 저장 및 관리 범위에 따라 구분됨.
// 비영속
Tutor tutor = new Tutor(1L, "wonuk", 100);
// 영속, 1차 캐시에 저장
em.persist(tutor);
// 1차 캐시에서 조회 (DB 조회 없음)
Tutor findTutor = em.find(Tutor.class, 1L);
- Entity는 먼저 1차 캐시에 저장되고, 동일 트랜잭션 내에서 같은 Entity 요청 시 DB 조회 없이 1차 캐시에서 반환되어 성능 향상.
- 1차 캐시는 동일 트랜잭션 내에서만 유효하며, 요청 종료 및 트랜잭션 종료 시 영속성 컨텍스트와 함께 소멸됨.