반응형
영속성 컨텍스트(Persistence Context)는 JPA에서 엔티티 객체를 관리하는 공간(1차 캐시)으로, 엔티티의 상태를 추적하고 변경 사항을 자동으로 데이터베이스에 반영하는 역할을 한다.
JPA의 핵심 개념 중 하나이며, EntityManager에 의해 관리된다.
영속성 컨텍스트의 주요 특징
① 엔티티 생명주기 관리
영속성 컨텍스트는 엔티티 객체를 다음과 같은 4가지 상태로 관리한다.
상태 | 설명 |
비영속 (New, Transient) | 영속성 컨텍스트에 관리되지 않는 객체 (DB와 연결 X) |
영속 (Managed, Persistent) | 영속성 컨텍스트에 의해 관리되는 객체 (변경 감지 O) |
준영속 (Detached) | 영속성 컨텍스트에서 분리된 객체 (변경 감지 X) |
삭제 (Removed) | 삭제가 예약된 상태 (DB에서 삭제됨) |
② 1차 캐시 (First-Level Cache)
- EntityManager는 엔티티를 조회할 때 1차 캐시에 먼저 저장한 후, 같은 엔티티를 다시 조회하면 DB에서 가져오는 것이 아니라 캐시된 엔티티를 반환한다.
- 성능 최적화에 도움을 줌.
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 엔티티 조회 → DB에서 가져오고, 1차 캐시에 저장
Member member1 = em.find(Member.class, 1L);
// 같은 엔티티 재조회 → 1차 캐시에서 반환 (DB 조회 안 함)
Member member2 = em.find(Member.class, 1L);
System.out.println(member1 == member2); // true
③ 동일성 보장
- 같은 트랜잭션 내에서는 같은 ID를 가진 엔티티는 하나만 유지된다.
- 조회 시마다 새 객체를 생성하는 것이 아니라, 이미 로딩된 엔티티를 반환한다.
④ 변경 감지 (Dirty Checking)
- 영속성 컨텍스트에 관리되는 엔티티는 트랜잭션이 커밋될 때 자동으로 변경 사항을 감지하고 업데이트한다.
- flush() 또는 commit() 시점에 변경된 필드를 찾아 자동으로 UPDATE 쿼리를 실행한다.
⑤ 쓰기 지연 (Write-Behind) & 지연 SQL 저장소
- persist()를 호출해도 즉시 INSERT SQL이 실행되지 않고, 쓰기 지연 SQL 저장소(버퍼)에 저장됨.
- commit() 시점에 한꺼번에 DB에 반영(즉, 배치 처리 가능).
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Member member = new Member();
member.setName("JPA User");
em.persist(member); // INSERT SQL이 바로 실행되지 않음
em.getTransaction().commit(); // 여기서 INSERT SQL 실행
반응형
'Backend > JPA' 카테고리의 다른 글
JPA - 영속 상태와 준영속 상태의 차이 및 준영속 상태 만드는 방법 (0) | 2025.02.12 |
---|---|
JPA - flush()란? (0) | 2025.02.12 |