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() | 영속성 컨텍스트를 종료한다. |