이번 글에서는
엔티티 매니저 팩토리, 엔티티 매니저, 영속성 컨텍스트의 개념, 엔티티의 생명 주기에 대해 알아보겠습니다.
이 시리즈 글은 김영한 님의 강의, 을 보고 적은 것임을 알려드립니다. (강추)

영속성 컨텍스트


먼저 알고 가기 : 엔티티 매니저 팩토리와 엔티티 매니저

image.png

<시나리오>

  1. 새로운 고객의 요청이 올때마다 엔티티 매니저 팩토리는 엔티티 매니저를 생성함
  2. 엔티티 매니저는 내부적으로 데이터베이스 커넥션을 사용해서 DB를 사용

엔티티 매니저 팩토리

  • 엔티티 매니저를 만드는 공장
  • 생성하는 비용이 커서 한 개만 만들어 애플리케이션 전체에서 공유
  • 여러 스레드가 동시에 접근해도 안전

엔티티 매니저

  • 엔티티의 CRUD 등 엔티티와 관련된 모든 일을 처리
  • 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안됨

영속성 컨텍스트란!?

영속성 컨텍스트란 엔티티를 영구 저장하는 환경 이라는 뜻이다.

EntityManger.persist(member);

이전 포스팅에서 이 코드는 member 엔티티를 저장한다고 했었다. 하지만 정확하게 얘기하면 데이터베이스에 저장하는게 아니라 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장하는 코드다.

영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나만 만들어진다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.


엔티티의 생명주기

엔티티의 4가지 상태

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속(managed): 영속성 컨텍스트에 관리되는 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

이제 각 상태에 대해 자세히 알아보자.

비영속(new/transient)

엔티티 객체가 생성된 순수 객체 상태
아직 영속성 컨텍스트나 데이터베이스와는 전혀 관계가 없는 상태

image.png

영속(managed)

엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장하면, 영속성 컨텍스트가 엔티티를 관리하므로 영속 상태가 된다.

image.png

EntityManager.persist(member)

위 코드를 수행하면 member 엔티티는 영속성 컨텍스트에 의해 관리되는 영속 상태가 됨
위 코드가 수행된다고 데이터베이스에 저장되는 것은 아님. (트렌잭션이 commit하는 시점에 영속성 컨텍스트에 있는 엔티티들에 대한 쿼리가 날라간다)

준영속(detached)

영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 됨

엔티티를 준영속 상태로 만들려면?

  • EntityManager.detach(entity) : 엔티티를 준영속 상태로 만듬
  • EntityManager.close() : 영속성 컨텍스트를 닫음
  • EntityManager.clear() : 영속성 컨텍스트를 초기화

삭제

엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제

EntityManager.remove(entity)

그림으로 보는 엔티티 생명주기

image.png