본문 바로가기
JPA

[JPA] JPA 내부 구조 (1) - 영속성 컨텍스트, 엔티티 생명주기

by 개발현욱 2023. 5. 28.

김영한-JPA

본 포스팅의 이미지 저작권은 자바 ORM 표준 JPA 프로그래밍 - 기본편 (김영한) 강의에 있습니다.

EntityManagerFactory와 EntityManager

emf와_em.png

  1. 고객이 서비스를 요청함
  2. 고객이 요청 할 때마다, EntityManagerFactory는 EntityManager를 생성
  3. EntityManager는 내부적으로 Database Connection을 사용해서 DB를 사용한다.

영속성 컨텍스트 (Persistence Context)

  • 엔티티를 영구 저장하는 환경
  • 영속성 컨텍스트는 눈에 보이지 않는, 논리적인 개념이다.
  • 엔티티 매니저(EntityManager)를 통해 영속성 컨텍스트에 접근한다.

엔티티의 생명주기 (Entity Lifecycle)

entity_생명주기.png

비영속 (new/transient)

비영속.png
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

// 비영속 상태
Member member = new Member();  
member.setId(101L);  
member.setName("HelloJPA");

new 키워드를 통해 새로운 객체를 생성한 상태가 이에 해당한다.

영속 (managed)

영속.png
영속성 컨텍스트에 관리 되는 상태

// 영속 상태 (managed)  
em.persist(member);

EntityManager의 persist 메소드로 객체를 영속 상태로 전환한다.

!!주의할 점!!
persist를 한 시점에서 DB에 직접 저장되지는 않는다.
-> persist를 한 시점부터, 영속성 컨텍스트 내부의 1차 캐시에 객체가 저장된다.
트랜잭션을 commit한 시점에 insert 쿼리로 DB에 직접 반영하게 된다.
자세한 내용은 후술 할 1차 캐시 참조!

준영속 (detached)

영속성 컨텍스트에 저장되었다가 분리된 상태

// 준영속 상태 (detached)
em.detach(member);

EntityManager의 detach 메소드로 객체를 준영속 상태로 전환한다.

삭제 (removed)

실제 DB에서 삭제를 요청하는 상태

// 삭제 상태 (removed)
em.remove(member);

EntityManager의 remove 메소드로 객체를 삭제 상태로 전환한다.

728x90
반응형