본문 바로가기
Backend/JPA

JPA - 영속성 컨텍스트 (Persistence Context) 특징

by 재성스 2025. 2. 11.
반응형

영속성 컨텍스트(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 실행
반응형