영속성 컨텍스트(Persistence Context)
JPA에서 Entity를 영구 저장하고 관리하는 작업을 수행하는 공간
Java의 ORM, JPA는 무엇인가?
식별자
로 구분EntityManager
로 Entity를 영속성 컨텍스트
에서 관리EntityManager
는 Entity를 관리해 DB와 애플리케이션 사이에서 객체를 생성/수정/삭제하는 역할을 함EntityManagerFactory
는 엔티티 매니저를 만드는 곳EntityManager
를 사용@PersitenceContext
EntityManager em;
Entity의 생명주기 모델
✅new
, transient
: Entity가 방금 인스턴스화되었으며 Persistence Context(PC)와 연결되지 않음. 할당된 식별자가 없고 데이터베이스와 관계 없는 상태
Author author = new Author();
author.setFirstName("Thorben");
author.setLastName("Janssen");
managed
로 변경되고 현재 PC에 연결됨✅managed
, persistent
: Entity에 연관된 식별자가 있고 PC와 연관된 상태
Author author = new Author();
author.setFirstName("Thorben");
author.setLastName("Janssen");
em.persist(author);
Author author = em.find(Author.class, 1L);
em.merge(author);
✅detached
: Entity에 연관된 식별자가 있지만 더이상 PC와 연관되지 않은 상태(일반적으로 PC가 닫혔거나, 인스턴스가 PC에서 쫓겨난 상황)
em.detach(author);
✅removed
: Entity에 연관된 식별자가 있고 PC와 연관되어 있지만 데이터베이스에서 제거하도록 예약되어 있는 상태
removed
로 변경됨em.remove(author);
영속성 컨텍스트의 이점
영속성 컨텍스트를 기반으로 JPA가 제공하는 기능으로는 1차 캐시, 스냅샷, 동일성 보장, SQL 쓰기 지연, 변경 감지, 지연 로딩이 있다.
영속성 컨텍스트는 내부에는 캐시가 있는데 이를 1차 캐시라고 부름
Member member = new Member();
member.setId("member1");
em.persist(member);
Member findMember = em.find(Member.class, "member1");
Member findMember2 = em.find(Member.class, "member2");
em.update(entity); // 이와 같은 업데이트 코드 없이
member.setId("member1"); // 이와 같이 변경하는 경우 자동 업데이트
변경 감지가 동작하는 이유는 1차캐시의 특징 중 하나인 스냅샷 덕분이다. 1차 캐시에 데이터를 등록해둘 때, Entity에 대한 초기 상태의 스냅샷을 저장해두는데 Entity가 변경되면 초기 상태의 스냅샷과 상태를 비교해 달라진 부분에 대한 Update Query가 최종적으로 DB에 반영된다.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a==b); // 동일성 비교 True
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(memberA);
em.persist(memberB);
// 여기까지 INSERT SQL을 DB에 보내지 않는다.
// 커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
// or entityManager의 flush()를 통해 쿼리 적용
transaction.commit(); // 트랜잭션 커밋
참고자료
33기 DO SOPT 서버 파트 3차 세미나 자료(배포 불가)
Chapter 3. Persistence Contexts
Entity Lifecycle Model in JPA & Hibernate
[JPA] Java Persist API 내부 동작 방식
스프링 데이터 JPA, 5분 만에 알아보기