본 글에 앞서 JPA의 구동 방식과 EntityManager, EntityManagerFactory에 대해 잘 모른다면 아래 글을 먼저 참고하시는 것이 좋습니다.
[웹 개발/Jpa] -
[jpa] JPA구동 방식 + EntityManager, EntityManagerFactory 란?
영속성 컨텍스트를 이해하기에 앞서, JPA구동 방식 포스팅에서 EntityManager에 대해 알아보았지만 다시 짧게 요약하면, EntityManager는 엔티티를 관리하는 역할을 하여 데이터베이스에 CRUD를 할 수 있게 하는 JPA의 핵심적인 역할을 하는 녀석이다.
'엔티티매니저는 생성될 때 영속성 컨텍스트라는 것을 함께 생성해 이것을 통해 관리한다.' 라고 하였다. 이 말은 텍스트 그대로 엔티티매니저가 생성될 때 영속성 컨텍스트라는 것도 함께 생성이 된다는 것이다.
그렇다면 영속성 컨텍스트란 무엇일까?
JPA 학습에 있어 가장 중요한 것 2가지를 말한다면 아래와 같다고 한다.
- 객체와 관계형 데이터베이스 매핑하기
- 영속성 컨텍스트
1번은 DB를 어떻게 설계하고, 객체를 어떻게 설계하여 이 두 가지를 어떻게 JPA로 매핑해서 쓸 것인지에 대한 설계와 관련된 부분이라면 2번은 JPA가 어떻게 동작하는가?와 관련이 있다.
이것을 명확히 이해하면 JPA가 내부적으로 어떻게 동작하는지를 이해할 수 있다. 영속성 컨텍스트는 아래와 같은 특징이 있다.
💧객체를 관리하는데 사용되는 중요한 개념
💧JPA를 이해하기 위한 핵심요소
💧"엔티티를 영구 저장하는 환경"이라는 뜻
💧 EntityManager.persist(entity);
영속성 컨텍스트는 '엔티티를 영구 저장하는 환경'이라는 뜻이다. 엔티티매니저를 이용하여 인스턴스 변수를 em이라하였을때 데이터베이스의 데이터를 변경하는 코드를 작성하고 em.persist(entity)를 호출하여 엔티티를 넣었다.
//등록
Member member = new Member();
member.setId(2L);
member.setName("hello!JPAAAA");
em.persist(member);
그렇다면 em.persist()를 통해 db에 저장이 되는것일까? 정확히 말하면 그렇지 않다. persist()는 db에 저장하는 것이 아니라 엔티티를 영속성 컨텍스트에 저장한다는 의미이다. db에 반영되는 시점이 궁금하다면 바로 아래를 참조하자
그렇다면 db에 언제 반영되는것일까? 실제로 데이터베이스에 저장되는 시점은 트랜잭션이 커밋될 때이다. JPA는 트랜잭션 단위로 데이터베이스와의 작업을 처리하므로, persist()를 호출하더라도 그 변화는 트랜잭션이 커밋되는 시점에 데이터베이스에 반영된다.
-> 이 말은, 만일 트랜잭션이 롤백된다면 영속성 컨텍스트에 있는 변경 사항도 롤백되어 테이터베이스에는 아무런 영향을 미치지 않는다.
엔티티를 생성하면 그 안에 1:1로 영속성 컨텍스트라는 공간이 생성이 된다. 이를 아래와 같이 그림으로 그려보았다.

em.persist(entity)를 호출하게 되면 영속성 컨텍스트(persistence context)안에 객체를 저장하게 되는 것이다. 객체, 엔티티는 아래와 같은 생명주기를 가진다.
엔티티 객체가 생성되고, 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.
→ 처음에 멤버 객체를 생성한 직후의 상태로, new상태라 하고 비영속이라한다. 영속성 컨텍스트와 전혀 관계없는 상태이다.
→ entityManager.persist()를 사용하여 엔티티를 저장하면 영속 상태가 된다. 영어로는 managed. 영속성 컨텍스트에 의해 관리되는 상태이다. 이 상태에서 엔티티의 상태 변경이 자동으로 감지되고 데이터베이스와 동기화된다.
영속 상태의 엔티티가 영속성 컨텍스트에서 분리되어 더 이상 관리되지 않는 상태이다. 엔티티매니저의 detach()메서드를사용하거나 트랜잭션이 종료될 때 해당 엔티티는 준영속 상태로 전환된다.
엔티티가 삭제되는 상태이다. 엔티티매니저의 remove()메서드를 사용하여 엔티티를 삭제하면 해당 엔티티는 삭제 상태가 된다.
->삭제 상태의 엔티티는 영속성 컨텍스트에서 분리되고, 향후 엔티티의 상태 변경이나 삭제를 데이터베이스에 반영한다.
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한 / 인프런 강의