자바/JPA

엔티티 매니저 팩토리, 엔티티 매니저, 영속성 컨텍스트, 생명주기

망재이 2023. 7. 9. 17:58

★ 엔티티 매니저 팩토리와 엔티티 매니저

  • 엔티티 매니저 팩토리 : 엔티티 매니저를 만드는 공장, 보통 하나의 데이터베이스 당 하나의 엔티티 매니저 팩토리를 생성!
//공장 만들기, 비용이 많이 듦
EntityManagerFactory emf = 
	Persistence.createEntityManagerFactory("jpaMain");
//persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory 생성
  • 필요할 때마다 엔티티 매니저 팩토리에서 엔티티 매니저를 생성
  • 보통 하나의 트랜젝션 당 하나의 매니저 생성!
  • 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 되지만, 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안됨

 

★ 영속성 컨텍스트

  • JPA를 이해하는 데 가장 중요한 용어
  • '엔티티를 영구 저장하는 환경'
  • em.persist(member); : 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장한다는 뜻!
    -> persist를 할때 데이터베이스에 저장되는게 아님! 엄연히 말하면 영속성 컨텍스트에 저장이 된다는 뜻이고 데이터베이스에 저장되는 건 보통 트랜젝션을 커밋하는 순간
  • 영속성 컨텍스트는 논리적 개념이며 눈에 보이지 않음
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있음

 

★ 엔티티의 생명주기

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

⭐︎ 비영속 : 객체를 생성만 하고 저장하지 않은 상태. 데이터베이스와 전혀 관련이 없는 상태

//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

⭐︎ 영속 : 영속성 컨텍스트에 의해 관리된다는 뜻

//객체를 저장한 상태(영속)
em.persist(member);

⭐︎ 준영속 : detach() 함수를 호출하여 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 관리하지 않도록 만든 상태

* close()를 호출해서 영속성 컨텍스트를 닫거나 clear()를 호출해서 영속성 컨텍스트를 초기화해도 관리하던 엔티티는 준영속 상태가 됨

//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);

 

⭐︎ 삭제

//객체를 상태한 상태(삭제)
em.remove(member);
728x90