JPA의 영속성 컨텍스트(Persistence Context)는 JPA의 핵심 기능 중 하나로, 데이터베이스와 애플리케이션 사이의 객체 상태를 효율적으로 관리하는 1차 캐시이자 변경 감지 매커니즘이다.
JPA에서 엔티티 객체를 저장하고 관리하는 메모리상의 작업 공간이다.
쉽게 말하면, DB와의 직접 통신 없이도 엔티티의 상태를 관리할 수 있게 해주는 캐시이자 트래킹 영역이다.
EntityManager가 관리하는 엔티티는 영속성 컨텍스트에 저장되며,
JPA는 이 컨텍스트를 통해 객체 상태를 추적하고 DB 반영을 자동으로 처리한다.
| 기능 | 설명 |
|---|---|
| 1️⃣ 1차 캐시 | 같은 엔티티를 여러 번 조회해도 DB 쿼리 한 번만 실행 (메모리 캐싱) |
| 2️⃣ 동일성 보장 | 같은 ID의 엔티티는 하나의 인스턴스로 관리 (== 비교 가능) |
| 3️⃣ 변경 감지(Dirty Checking) | 엔티티 값 변경 시 flush() 또는 트랜잭션 종료 시 자동으로 update SQL 실행 |
| 4️⃣ 지연 로딩(Lazy Loading) | 실제 DB 접근은 필요한 시점에만 발생 (프록시 사용) |
| 5️⃣ 트랜잭션 범위 관리 | 트랜잭션 범위 내에서 엔티티 생명 주기를 관리함 (persist, merge, remove 등) |
| 6️⃣ Flush | 변경된 내용을 SQL로 변환해 DB에 반영함 (단, commit 전까진 트랜잭션 안 종료됨) |
@Transactional
public void updateUserName(Long userId) {
User user = entityManager.find(User.class, userId); // DB에서 가져옴 → 1차 캐시에 저장됨
user.setName("New Name"); // setter로 값 변경 (변경 감지됨)
// 트랜잭션 끝나는 시점 → 변경 사항 자동 감지 → update SQL 실행됨
}
✔ 여기서 user.setName(...)만 했을 뿐인데, update 쿼리가 나가는 건 영속성 컨텍스트가 변경을 추적하기 때문이다.