정의
사용하는 이유
핵심 역할 및 특징

1차 캐시
영속성 컨텍스트 내부에 존재하는 메모리 저장소로, 엔티티의 식별자(@Id)를 키(Key)로, 엔티티 객체 자체를 값(Value)으로 보관한다.
동일한 트랜잭션 범위 내에서는 '단기 기억 장치' 역할을 수행하여 데이터베이스와의 통신 횟수를 비약적으로 줄인다.
동작 원리
영속 엔티티의 동일성(Identity) 보장
영속성 컨텍스트는 동일한 트랜잭션 내에서 조회하는 엔티티의 '참조 값'이 동일함을 보장한다. 이는 우리가 자바의 List나 Map에서 객체를 꺼낼 때와 똑같은 원리로 작동한다.
보장 가능한 이유
a와 b는 메모리 상의 같은 지점을 가리키게 된다. 따라서 a == b 비교 시 항상 true가 반환되며, 애플리케이션 전반에서 데이터의 일관성이 깨지지 않도록 보호한다.영속 엔티티의 동일성(Identity)을 보장해야하는 이유
단일 진실 공급원(Single Source of Truth)을 제공하기 위함이다.트랜잭션을 지원하는 쓰기 지연 (Transactional Write-behind)
엔티티의 생성, 수정, 삭제 요청이 발생할 때마다 즉시 데이터베이스에 쿼리를 보내지 않고, 영속성 컨텍스트 내부의 '쓰기 지연 SQL 저장소'에 차곡차곡 모아두었다가 트랜잭션이 커밋되는 순간 한꺼번에 실행하는 기술이다.
동작 원리
em.persist(entity)와 같은 명령이 실행되면, 엔티티는 1차 캐시에 저장됨과 동시에 해당 작업을 수행하기 위한 SQL(INSERT, UPDATE, DELETE 등)이 생성된다.tx.commit())하는 순간, JPA는 저장소에 모인 모든 쿼리를 데이터베이스에 한꺼번에 보낸다(Batching).변경 감지(Dirty Checking)
엔티티의 필드값이 변경되면 이를 자동으로 감지하여 트랜잭션 종료 시점에 업데이트 쿼리를 실행한다. 개발자가 명시적인 수정 명령(update 등)을 내리지 않아도 데이터의 최신 상태를 유지하며, 객체 지향적인 프로그래밍을 가능하게 한다.
동작 원리
지연 로딩(Lazy Loading)
실제 객체가 사용되는 시점까지 데이터 조회를 늦추는 기법이다. 연관된 데이터를 즉시 조회하지 않고 가짜 객체(Proxy)로 대체해 두었다가, 실제 데이터가 필요한 순간에만 DB를 조회하여 성능을 최적화한다.
동작 원리
영속성 컨텍스트 핵심 역할의 이점 및 실무 적용 사례
1차 캐시 (First-level Cache)
영속 엔티티의 동일성(Identity) 보장
트랜잭션을 지원하는 쓰기 지연 (Transactional Write-behind)
변경 감지 (Dirty Checking)
지연 로딩 (Lazy Loading)
동작 원리 및 엔티티 생명주기 (Entity Lifecycle)

비영속 (New/Transient)
영속 (Managed)
준영속 (Detached)
삭제 (Removed)
플러시 (Flush)
JPA 엔티티 생명주기 제어 메서드 상세 분석
엔티티 등록 및 관리 (Registration)
관리 대상 제외 및 분리 (Severance)
상태 복구 및 병합 (Re-linking)
데이터 삭제 (Deletion)
데이터 조회 (Retrieval)
데이터 동기화 (Synchronization)
트레이드 오프
주의 사항
| 요소 | 관리 범위 | 주요 이점 |
|---|---|---|
| 1차 캐시 | 트랜잭션 단위 | 객체 동일성 보장, 재조회 성능 향상 |
| 스냅샷 | 트랜잭션 단위 | 변경 사항 자동 감지 (개발 편의성) |
| 쓰기 지연 저장소 | 트랜잭션 단위 | 네트워크 통신 최적화 (Batch 처리) |
| 프록시 | 객체 단위 | 불필요한 데이터 로딩 방지 (메모리 절약) |
| 2차 캐시 | 애플리케이션 단위 | 전역적인 DB 부하 감소 |
| 구분 | JPA 캐시 (1차/2차) | Redis (전역 캐시) | MySQL 캐시 (버퍼 풀) |
|---|---|---|---|
| 위치 | 애플리케이션 내부 (Java 메모리) | 애플리케이션 외부 서버 | 데이터베이스 서버 내부 |
| 데이터 형태 | 자바 객체 (Entity) | 키-값 (다양한 데이터 구조) | 데이터 페이지 (파일 블록) |
| 공유 범위 | 해당 서버 내부만 공유 | 모든 서버가 공통으로 공유 | 해당 DB를 쓰는 요청만 공유 |
| 관리 주체 | 개발자 및 ORM 프레임워크 | 개발자가 직접 로직 설계 | DB 엔진이 알아서 관리 |