<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>