[Spring] 영속성 컨텍스트 (1)

이연우·2025년 7월 28일

TIL

목록 보기
67/100

📦 영속성 컨텍스트(Persistence Context)란?

  • JPA에서 Entity 객체를 저장하고 관리하는 1차 캐시 역할의 공간
    • EntityManager가 영속성 컨텍스트에 접근하는 수단
    • 같은 트랜잭션 내에서 같은 객체 인스턴스 반환
    • DB와 자동으로 동기화되는 관리 상태를 유지

🧱 구조적 특징

  • 눈에 보이지 않는 논리적 공간

  • Entity Manager를 통해서 영속성 컨텍스트에 접근

    • EntityManager.persist(entity);
  • Entity(객체)를 영속성 컨텍스트에 영속(저장)


👤 Entity란?

  • JPA에서 테이블과 매핑되는 저장 가능한 클래스

  • 일반적으로 @Entity 어노테이션 사용
  • 하나의 Entity는 하나의 DB 테이블에 매핑

💡 영속성 컨텍스트를 쓰는 이유

  1. 1차 캐시
    → 같은 객체 여러 번 조회해도 DB에 접근 안 함

  2. 변경 감지 (Dirty Checking)
    setName()만 해도 커밋 시 SQL UPDATE 자동 실행

  3. 쓰기 지연 (Write-Behind)
    → 여러 persist()를 모아서 한번에 SQL 실행

  4. 연관 관계 자동 처리
    getCompany() 등으로 연결된 객체 자동 조회

  5. 동일성 보장
    → 같은 트랜잭션 안에서는 == 비교 결과도 true


🔄 Entity 상태

  • 비영속 → 영속 → 준영속 → 삭제의 단계

📘 1. 비영속 (New / Transient)

  • 아직 영속성 컨텍스트와 관계없는 상태
Tutor tutor = new Tutor(1L, "wonuk", 100); // 그냥 객체일 뿐

→ DB와 전혀 관계 없음
em.persist() 하기 전 상태

📗 2. 영속 (Managed)

  • em.persist()를 통해 영속성 컨텍스트에 등록된 상태
  • JPA가 객체를 추적, 변경 감지, SQL 자동 반영 가능
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 등으로 상태 변경

0개의 댓글