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)
- 비영속(Transient): 객체는 생성됐지만 JPA와 관련 없음
- 영속(Persistent): persist() 호출 → 영속성 컨텍스트에 등록
- 준영속(Detached): 영속성 컨텍스트에서 분리된 상태 (detach())
- 삭제(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 |