영속성 컨텍스트를 설명하기 전에 먼저 Entity와 EntityManager를 먼저 알고 가야한다.
엔티티는 영속성을 가진 객체로 DB 테이블에 보관할 대상을 의미한다.
즉, 영속성 컨텍스트에 속한 객체를 말한다 볼 수 있다.
엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일을 처리한다.
엔티티를 관리하는 일종의 가상의 데이터베이스로 생각하면 편하다.
엔티티 매니저는 영속성 컨텍스트와 1대1 또는 1대N 관계를 가진다.
따라서 엔티티 매니저는 영속 컨텍스트에 접근하여 엔티티에 대한 DB 작업을 제공한다.
그렇다면 영속성 컨텍스트란 무엇인가?
JPA 명세에 따르면, 영속성 컨텍스트는 영속성 엔티티 인스턴스들의 모음이다.
그리고 엔티티의 생명주기를 관리한다.
쉽게 말해, 영속성 컨텍스트는 엔티티의 CRUD를 담당하면서 저장했거나 불러온 엔티티를 기억하는 1차 캐시 역할을 한다.

아까도 말했듯 영속성 컨텍스트는 일종의 1차 캐시 역할을 한다.
그렇기에 애플리케이션에서 동일한 엔티티를 여러 번 조회 시, DB를 거치지 않고도 기억하고 있던 엔티티를 돌려줄 수 있다.
또한, 캐싱된 엔티티를 활용해서 애플리케이션에서 엔티티 변경시에 기존과 바뀐 내용이 있는지 파악하기 쉽다.
즉, 엔티티 변경에 대한 관리가 쉽다고 볼 수 있다.
그리고 캐싱을 통해서 같은 엔티티를 여러 번 조회하더라도 동일성을 보장해준다.
엔티티의 생성, 수정, 삭제를 위해서 트랜잭션을 시작
애플리케이션이 엔티티 매니저에게 트랜잭션의 시작과 엔티티 상태변경을 차례로 요청
이후 엔티티 매니저에게 커밋을 요청하면 이 변경사항이 한꺼번에 SQL로 변환되어서 DB로 전송
위와 같은 전략을 쓰기 지연이라 하고, 이때 영속성 컨텍스트는 엔티티 상태 변경사항을 저장하는 트랜잭션 내 쓰기 지연 캐시로 작동한다.
영속성 컨텍스트는 일종의 논리적 개념이라 볼 수 있다.
이 말은 즉, 영속성 컨텍스트는 실존하지 않는 것이라는 의미이다.
트랜잭션 내에서 사용되는 엔티티를 기억하고 그 엔티티의 생명주기를 관리한다면,
그것이 바로 영속성 컨텍스트라 할 수 있는 것이다.
그리고 엔티티 매니저는 영속성 컨텍스트를 사용할 수 있는 메서드를 제공하는 인터페이스이다.
💜 Hibernate의 PersistenceContext, StatefulPersistenceContext
- PersistenceContext
- Hibernate에서 영속성 컨텍스트의 동작을 정의하는 핵심 클래스 중 하나
- 이 클래스는 엔티티의 상태를 관리하고 DB와의 상호작용을 최적하하기 위해 캐시로 사용된다.
- 엔티티를 메모리에 저장하여 동일한 트랜잭션 내에서 동일한 객체를 재사용할 수 있게 하며,
flush()혹은commit()시점에 변경된 내용을 DB에 반영한다.
- StatefulPersistenceContext
- PersistenceContext의 구현체 중 하나로, 실제 영속성 컨텍스트의 상태를 관리한다.
- 엔티티를 추적하고 관리하는 상태 유지 영속성 컨텍스트로 Session에서 사용하는 기본적인 구현체이다.
- 상태를 관리하는 영속성 컨텍스트로, 트랜잭션 동안 엔티티의 상태를 유지한다.
엔티티는 영속성 컨텍스트에 의해 생명주기가 관리된다.
이 생명주기는 다음과 같은 4가지 상태로 나눌 수 있다.

위에서 볼 수 있듯이 영속성 컨텍스트와 관련 있는 영속, 삭제 상태는 플러시를 거쳐 데이터베이스와 동기화가 되는 대상이다.