일반적인 데이터베이스를 사용하고 있는 애플리케이션에서는 하나의 엔티티 매니저 팩토리를 생성해 사용한다. 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장이다. 처음 만들어지는 시점에 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 올 때마다 엔티티 매니저를 생성한다. 엔티티 매니저는 DB연결이 필요한 시점(보통 트랜잭션 시작되는 경우)에 커넥션 풀에 있는 connection을 얻는다.
출처 : 김영한님강의자료
엔티티 매니저 팩토리는 생성시점에 DB 커넥션 풀을 생성하기 때문에 공장을 만드는 비용이 매우 크다. 그러나 엔티티 매니저를 만드는 비용은 거의 들지 않으므로, 엔티티 매니저 팩토리는 필요에 따라 엔티티 매니저를 생성하여 사용한다.
엔티티 매니저 팩토리는 여러 쓰레드가 동시에 접근해도 안전하여 서로 다른 스레드 간 공유해도 문제가 없다. 하지만 엔티티 매니저는 여러 쓰레드가 동시 접근하면 동시성 문제가 발생하기에 쓰레드간 공유를 하면 안된다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("tudiiii");
EntityManager em = emf.createEntityManager();