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차 캐시는 동일 트랜잭션 내에서만 유효하며, 요청 종료 및 트랜잭션 종료 시 영속성 컨텍스트와 함께 소멸됨.