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

<aside> 🌴 JPA가 제공하는 기능은 크게 아래로 나눌 수 있다.

엔티티 매니저(EntityManager) → 말그대로 ‘엔티티 관리하는 관리자’

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

EntityManagerFactory 는 EntityManager 를 만드는 ‘공장’ 이다!

// createEntityManagerFactory 는 비용이 아주 많이 든다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");

JPA 는 애플리케이션이 사용하는 엔티티 클래스의 메타데이터를 처리하고 유지한다. → META-INF/persistence.xml 에 있는 정보를 바탕으로 EntityManagerFactory를 생성!

<persistence-unit name="jpabook" >
		<properties>
				<property name="javax.persistence.jdbc.driver"
									value="org.h2.Driver"/>
				<property name="javax.persistence.jdbc.user"
									value="sa"/>
				<property name="javax.persistence.jdbc.password"
									value=""/>
				<property name="javax.persistence.jdbc.url"
									value="jdbc:h2:tcp://localhost/~/test"/>
				...
</persistence-unit>

이제부터 필요할 때마다 EntityManagerFactory 에서 EntityManager 를 생성하면 된다.

// EntityManager 생성 -> 비용이 거의 안든다.
EntityManager em = emf.createEntityManager();

<aside> 🌴 EntityManagerFactory 는 여러 스레드가 동시에 접근해도 안전하다! → 서로 다른 스레드 간에 공유 O

</aside>

<aside> 🌴 EntityManager 는 여러 스레드가 동시에 접근하면 안된다! → 동시성 문제 발생! → 스레드 간 공유 절대 XX

</aside>