자바/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