728x90

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

JPA가 엔티티 객체를 관리하는 일종의 메모리(1차 캐시) 공간
데이터베이스(DB)와 자바 객체(Entity) 사이에서 중간다리 역할을 함

 


🧠 쉽게 말하면?

개념 역할
Persistence Context JPA가 엔티티를 보관하고 관리하는 공간 (1차 캐시)
DB 실제 데이터를 저장하는 창고
Entity 우리가 다루는 자바 객체 (예: Member, Post, Article 등)

 


📦 비유로 이해하기

💼 캐비닛 = 영속성 컨텍스트
📄 문서 = 엔티티 객체
🏢 창고 = 데이터베이스
  • 문서를 바로 창고(DB)에서 꺼내지 않고
  • 먼저 캐비닛(영속성 컨텍스트)에서 꺼내서 확인하고
  • 수정이 일어나면 나중에 한 번에 창고(DB)에 반영

 


💡 주요 특징

기능 설명
1차 캐시 동일 트랜잭션 안에서는 DB에서 불러온 엔티티를 캐시에 저장해두고 재사용
엔티티의 동일성 보장 같은 엔티티는 항상 같은 객체를 반환 (== 비교 가능)
변경 감지(Dirty Checking) 객체의 값이 변경되면 JPA가 감지하고 DB에 자동 반영
지연 로딩(Lazy Loading) 실제로 필요한 시점에 DB를 조회함
Flush 변경 사항을 DB에 반영하는 시점 (트랜잭션 commit 시 자동 flush)

 


📌 예제 코드

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
}

// 등록
Member member = new Member();
member.setName("Jieun");

// 아직 DB 저장 아님
em.persist(member); // 영속성 컨텍스트에 저장됨

// 조회
Member found = em.find(Member.class, member.getId());
// 캐시(영속성 컨텍스트)에서 가져옴. DB 접근 안함!

 


🔄 생명주기 (Entity Lifecycle)

  1. 비영속(Transient): 객체는 생성됐지만 JPA와 관련 없음
  2. 영속(Persistent): persist() 호출 → 영속성 컨텍스트에 등록
  3. 준영속(Detached): 영속성 컨텍스트에서 분리된 상태 (detach())
  4. 삭제(Removed): remove() 호출 → 삭제 대상

 


💥 자주 묻는 질문

질문 답변
persist() 하면 DB에 저장됨? ❌ X. → 영속성 컨텍스트에 저장됨. DB 반영은 flush() 또는 트랜잭션 종료 시
find() 할 때 DB 가나? ❌ X. → 1차 캐시에 있으면 DB에 접근하지 않음
값만 바꾸면 DB에도 반영됨? ✅ O. → 변경 감지(Dirty Checking) 로 자동 반영됨

 

 


📊 정리 요약

용어 정의
영속성 컨텍스트 엔티티 객체를 관리하는 메모리 공간 (1차 캐시)
persist() 영속성 컨텍스트에 등록
flush() 변경 내용을 DB에 반영
dirty checking 엔티티 값 변경을 감지하고 자동으로 SQL 생성
find() 1차 캐시에 있으면 DB에 접근하지 않음
엔티티 동일성 보장 동일 트랜잭션 내 같은 객체를 반환 (==)

 

 

 

 


 

728x90

'프로그래밍 > Spring' 카테고리의 다른 글

✅ Write-Behind (쓰기 지연) 란?  (0) 2025.04.07
⚾️ JPA 1차 캐시 (First-Level Cache) 완전 정복  (0) 2025.04.07
🌱 Spring Data JPA 완전 정복 가이드  (0) 2025.04.04
ORM이란?  (0) 2025.04.04
JDBC란?  (0) 2025.04.04