영속성 컨텍스트(Persistence Context) 는 애플케이션과 데이터베이스 사이에 있는 '가상'의 데이터베이스로 인스턴스로 존재하는 엔티티를 관리하고 영속화 시키는 논리적인 영역이다.

위와 같은 그림으로 사용자와 소통을 하면서 엔티티를 DB에 저장, 조회, 삭제, 수정할 수 있습니다. 이 때 어플리케이션 즉 사용자와 같이 소통을 할 수 있게 해주는 것을 엔티티 매니저(Entity Manager) 라고 한다.
영속성 컨텍스트를 좀 더 자세하게 보자면

1차 캐시와 쿼리문 저장소로 이루어져 있다.
영속성 컨텍스트가 관리하는 엔티티 정보를 관리하는 공간. 이 곳에 엔티티 정보를 보관해놓는 상태를 영속상태라고 한다. 아직 DB에 저장되기 전인 상태이다.
애플리케이션에서 요청한 쿼리문들을 한 번에 모아놓다가 엔티티 매니저에 의해 flush() 가 호출되면 DB에 접근하는 방식, 최대한 데이터베이스에 접근하는 횟수를 줄여 성능상의 이점을 가져가고 있다.

영속성 컨텍스트에서 1차 캐시를 사용하는데 이곳에는 HashMap 의 형태로 Key (@Id), Value(Entity) 의 형태로 저장된다. 아래 코드를 예시로 보자
Member member = new Member();
member.setId(1);
member.seUsername("유저1");
em.persist(member); // 엔티티 영속
em.find(Member.class, 1); // 조회
위 코드에서는 1이 Key 가 되는 것이고 Value는 "유저1" 이란 유저의 엔티티 그 자체가 저장된다.
Member a = em.find(Member.class, 1);
Member b = em.find(Member.class, 1);
System.out.println(a == b); // true 반환
위 코드와 같이 em.find() 를 이용해 1차 캐시에 있는 Entity 객체를 가져온다고 했을 때 둘 다 동일한 주소값을 가지고 있는 동일한 객체로 동일성을 보장한다.

엔티티 매니저 명령어중에는 Update 라는 메서드가 존재하지 않는다. 하지만 수정 관련한 기능을 제공하는데 이는 Snapshot 과 현재 엔티티를 비교하면서 수정된 사항이 있다면 Update 쿼리문을 날린다. 이러한 SnpaShot 은 @Id 로 불러와진다.

엔티티 생명주기를 공부한다면 아마 볼 수 밖에 없는 그림이라고 생각한다.
하나하나 살펴보자면
엔티티가 영속 되기전 객체가 생성된 상태
Member member = new Member();
엔티티가 영속성 컨텍스트에 의해 관리되고 있는 상태 아직 데이터베이스에 저장되기 전이다.
em.persist(member);
엔티티가 영속성 컨텍스트에 의해 관리되고 있다가 더이상 관리되지 않는 상태
em.detach(member); // 엔티티를 영속성 컨텍스트에서 분리
em.claer(); // 영속성 콘텍스트를 비움
em.close(); // 영속성 콘텍스트를 종료
이렇게 위 3가지 코드로 엔티티를 준영속 상태를 만들 수 있는데, 영속 상태에 올라간 순간 부터 식별자 @Id 가 생성되는 특징이 있다.
삭제 상태는 엔티티를 영속성 컨텍스트에서 관리하지 않게 되고, 해당 엔티티를 DB에서 삭제하는 DELETE 쿼리문을 보관하게 된다.