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

영속성 컨텍스트


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

<시나리오>

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

엔티티 매니저 팩토리

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

엔티티 매니저

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

영속성 컨텍스트란!?

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

EntityManger.persist(member);

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

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


엔티티의 생명주기

엔티티의 4가지 상태

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

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

비영속(new/transient)

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

영속(managed)

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

EntityManager.persist(member)

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

준영속(detached)

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

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

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

삭제

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

EntityManager.remove(entity)

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

0개의 댓글