EntityManagerFactory와 EntityManager
- EntityManager는 JPA에서 Entity를 저장하고, 수정하고, 삭제하고, 조회하는 등 Entity와 관련된 모든 일을 처리해준다.
- 개발자 입장에서는 EntityManager는 Entity를 저장하는 가상의 데이터베이스로 생각하면 된다.
- 데이터베이스를 하나만 사용하는 어플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다.
- EntityManagerFactory에서 필요할 때 마다 EntityManager를 생성하여 사용하면 된다.
- EntityManagerFactory로부터 EntityManager를 생성하는데에는 비용이 거의 들지 않는다.
- 다만 EntityManagerFactory를 만드는 데에는 비용이 상당히 크다.
- 따라서 EntityManagerFactory는 DB당 하나만 만들어서 전체에서 공유하여 사용하도록 설계되어 있다.
- 또한 EntityManagerFactory는 여러 스레드에서 동시에 접근해도 안전하므로(Thread-Safe) 스레드간에 공유하여 사용하여도 무방하다.
- 그러나 EntityManager는 여러 스레드에서 공유하여 사용하면 동시성 문제가 발생하므로 스레드간에 공유하여 사용하면 절대 안된다.

- 위 그림을 보면, EntityManagerFactory에서 다수의 Entity를 생성했다.
- EntityManager1은 DB커넥션을 사용하지 않고 있는데, EntityManager2는 커넥션을 사용하고 있다.
- EntityManager는 DB연결이 필요한 시점까지 커넥션을 맺지 않으며, Transaction을 시작할 때 커넥션을 획득한다.
- Hibernate와 같은 JPA 구현체들은 EntityManagerFactory를 생성할 때(대개 어플리케이션이 기동되어 Bean으로 등록될 때) 커넥션 풀을 만들어놓고 필요 시 마다 할당하여 사용하도록 한다.
영속성 컨텍스트란?
- 영속성 컨텍스트(Persistence Context)란 Entity를 영구 저장하는 환경이라는 뜻으로, Entity를 EntityManager로 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리한다.
- 영속성 컨텍스트는 EntityManager를 생성할 때 하나 만들어지며, EntityManager를 통하여 접근 및 관리할 수 있다.
Entity의 생명주기
Entity에는 4가지 상태가 존재한다.