엔티티 매니저 팩토리와 엔티티 매니저
일반적인 데이터베이스를 사용하고 있는 애플리케이션에서는 하나의 엔티티 매니저 팩토리를 생성해 사용한다.
엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장이다. 처음 만들어지는 시점에 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 올 때마다 엔티티 매니저를 생성한다.
엔티티 매니저는 DB연결이 필요한 시점(보통 트랜잭션 시작되는 경우)에 커넥션 풀에 있는 connection을 얻는다.

그림을 보면 EntityManager1 과 EntityManager2가 보인다.
이중 EntityManager2는 connection을 사용하고 EntityManager1 은 사용하지 않는데, EntityManager는 데이터베이스 연결이 꼭 필요한 시점까지 connection을 얻지 않는다. connection을 얻는 시점은 보통 트랜잭션을 시작할 때 커넥션을 획득한다.
그리고 JPA는 EntityManagerFactory를 생성할 때 Connection pool 도 만드는데 이게 가능한 이유는 우리가 persistence.xml에 DB정보를 미리 적어놓고 EntityManagerFactory는 persistence.xml를 참조해서 객체를 생성하기 때문에 가능하다.
엔티티 매니저 팩토리가 엔티티 매니저를 사용하는 이유
엔티티 매니저 팩토리는 생성시점에 DB 커넥션 풀을 생성하기 때문에 공장을 만드는 비용이 매우 크다.
그러나 엔티티 매니저를 만드는 비용은 거의 들지 않으므로, 엔티티 매니저 팩토리는 필요에 따라 엔티티 매니저를 생성하여 사용한다.
엔티티 매니저 팩토리는 여러 쓰레드가 동시에 접근해도 안전하여 서로 다른 스레드 간 공유해도 문제가 없다. 하지만 엔티티 매니저는 여러 쓰레드가 동시 접근하면 동시성 문제가 발생하기에 쓰레드간 공유를 하면 안된다.
✨ 정리
엔티티 매니저 팩토리
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
- 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번 생성하고 공유해서 사용한다.
- 엔티티 매니저 팩토리는 스레드 세이프(Thread Safe)하다.
- Persistence.createEntityManagerFactory("tudiiii")를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다. → 엔티티 매니저 팩토리를 persistence.xml를 참조해서 객체를 생성한다.
엔티티 매니저
EntityManager em = emf.createEntityManager();
- 엔티티 매니저는 엔티티를 DB 에 등록/수정/삭제/조회(CRUD) 하는 역할이며, 엔티티와 관련된 일을 처리하는 엔티티 관리자이다.
- 엔티티 매니저는 엔티티 매니저 팩토리를 통해 생성되며 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안된다.
- 엔티티 매니저는 보통 데이터베이스 ****트랜잭션 단위로 생성하고, 트랜잭션이 끝나는 시점에 종료시킨다.
- spring boot + spirng data를 사용하면 Application이 시작될 때 EntityManager를 자동으로 bean에 등록하고 우리가 알지 못하는 사이에 가져다 쓴다.
참고
'spring 🍀 > spring-data-jpa' 카테고리의 다른 글
JPA N+1 문제 해결과정 ( join fetch + CountQuery) (0) | 2023.11.23 |
---|---|
JPA 프록시와 지연로딩/즉시로딩 (1) | 2023.11.23 |
JPA의 Entity는 기본 생성자가 왜 반드시 필요할까? (1) | 2023.11.20 |
엔티티 생명주기 - 비영속, 영속, 준영속, 삭제 (0) | 2023.11.20 |
영속성 컨텍스트란? (0) | 2023.11.18 |
엔티티 매니저 팩토리와 엔티티 매니저
일반적인 데이터베이스를 사용하고 있는 애플리케이션에서는 하나의 엔티티 매니저 팩토리를 생성해 사용한다.
엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장이다. 처음 만들어지는 시점에 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 올 때마다 엔티티 매니저를 생성한다.
엔티티 매니저는 DB연결이 필요한 시점(보통 트랜잭션 시작되는 경우)에 커넥션 풀에 있는 connection을 얻는다.

그림을 보면 EntityManager1 과 EntityManager2가 보인다.
이중 EntityManager2는 connection을 사용하고 EntityManager1 은 사용하지 않는데, EntityManager는 데이터베이스 연결이 꼭 필요한 시점까지 connection을 얻지 않는다. connection을 얻는 시점은 보통 트랜잭션을 시작할 때 커넥션을 획득한다.
그리고 JPA는 EntityManagerFactory를 생성할 때 Connection pool 도 만드는데 이게 가능한 이유는 우리가 persistence.xml에 DB정보를 미리 적어놓고 EntityManagerFactory는 persistence.xml를 참조해서 객체를 생성하기 때문에 가능하다.
엔티티 매니저 팩토리가 엔티티 매니저를 사용하는 이유
엔티티 매니저 팩토리는 생성시점에 DB 커넥션 풀을 생성하기 때문에 공장을 만드는 비용이 매우 크다.
그러나 엔티티 매니저를 만드는 비용은 거의 들지 않으므로, 엔티티 매니저 팩토리는 필요에 따라 엔티티 매니저를 생성하여 사용한다.
엔티티 매니저 팩토리는 여러 쓰레드가 동시에 접근해도 안전하여 서로 다른 스레드 간 공유해도 문제가 없다. 하지만 엔티티 매니저는 여러 쓰레드가 동시 접근하면 동시성 문제가 발생하기에 쓰레드간 공유를 하면 안된다.
✨ 정리
엔티티 매니저 팩토리
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
- 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번 생성하고 공유해서 사용한다.
- 엔티티 매니저 팩토리는 스레드 세이프(Thread Safe)하다.
- Persistence.createEntityManagerFactory("tudiiii")를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다. → 엔티티 매니저 팩토리를 persistence.xml를 참조해서 객체를 생성한다.
엔티티 매니저
EntityManager em = emf.createEntityManager();
- 엔티티 매니저는 엔티티를 DB 에 등록/수정/삭제/조회(CRUD) 하는 역할이며, 엔티티와 관련된 일을 처리하는 엔티티 관리자이다.
- 엔티티 매니저는 엔티티 매니저 팩토리를 통해 생성되며 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안된다.
- 엔티티 매니저는 보통 데이터베이스 ****트랜잭션 단위로 생성하고, 트랜잭션이 끝나는 시점에 종료시킨다.
- spring boot + spirng data를 사용하면 Application이 시작될 때 EntityManager를 자동으로 bean에 등록하고 우리가 알지 못하는 사이에 가져다 쓴다.
참고
'spring 🍀 > spring-data-jpa' 카테고리의 다른 글
JPA N+1 문제 해결과정 ( join fetch + CountQuery) (0) | 2023.11.23 |
---|---|
JPA 프록시와 지연로딩/즉시로딩 (1) | 2023.11.23 |
JPA의 Entity는 기본 생성자가 왜 반드시 필요할까? (1) | 2023.11.20 |
엔티티 생명주기 - 비영속, 영속, 준영속, 삭제 (0) | 2023.11.20 |
영속성 컨텍스트란? (0) | 2023.11.18 |