01. 영속성 컨텍스트

엔티티를 영구 저장하는 환경으로, 논리적인 개념이다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. 영속성 컨텍스트에 영속된 엔티티는 JPA 에서 관리한다.

🧩 엔티티의 생명주기

출처: 자바 ORM 표준 JPA 프로그래밍 - 기본편 (인프런)

생명주기설명
비영속 (new/transient)영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
영속 (managed)영속성 컨텍스트에 관리되는 상태
준영속 (detached)영속성 컨텍스트에 저장되었다가 분리된 상태
삭제 (removed)삭제된 상태
  • 객체가 영속성 컨텍스트에 들어가면 1차 캐시로 저장된다. (1차 캐시는 트랜잭션이 종료되면 사라짐)

  • 영속성 컨텍스트의 객체는 동일성을 보장한다.

  • 쓰기 지연([트랜잭션]커밋을 해야 SQL문 실행), 변경 감지(엔티티 데이터에 변동이 생기면 update 쿼리를 실행), 지연 로딩(객체를 미리 조회하지 않고 필요할 때 select 쿼리를 수행하여 가져온다.) 기능을 제공한다.

🧩 플러시 (Flush)

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 작업을 말함.

  • 변경이 감지되면 ‘쓰기 지연 SQL 저장소’에 등록하고 그 쿼리를 데이터베이스에 전송한다.

Flush 호출 방식설명
em.flush()커밋 전에 직접 호출한다.
트랜잭션 커밋플러시가 자동 호출된다.
JPQL 쿼리 실행플러시가 자동 호출된다.
  • 플러시는 영속성 컨텍스트를 비우는 작업이 아님 ! 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업이다.

🧩 준영속 상태

  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached) 된 상태이다.

  • 영속성 컨텍스틑가 제공하는 기능(1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩) 을 사용하지 못한다.

준영속 상태로 만드는 방법설명
em.detach(entity)특정 엔티티만 준영속 상태로 전환한다.
em.clear()영속성 컨텍스트를 완전히 초기화한다.
em.close()영속성 컨텍스트를 종료한다.