Spring boot, JPA (1) - Entity Manager란?
Spring boot JPA Entity Manager
Dec 03, 2024
Entity Manager
엔티티 매니저(Entity Manager)는 데이터베이스와의 연결을 추상화한 세션의 일종입니다. JPA의 EntityManager와 Hibernate의 Session은 같은 역할을 합니다. Entity Manage가 하는 역할:
- 데이터베이스 연결 관리
- 트랜잭션 관리
- CRUD 연산 수행
실제 구현으로는 JPA EntityManager는 인터페이스이며, Hibernate Session은 EntityManager의 구현체입니다. 내부적으로 데이터베이스 커넥션을 얻어와서 사용합니다.
주요 특징으로는
- Thread Safety하지 않아서, 공유해서 사용하면 안됩니다.
- 데이터 베이스 트랜잭션 단위로 생성하고 폐기하는 것이 일반적 입니다.
- 내부적으로 DB 커넥션 풀을 사용해서 실제 물리적 연결을 관리합니다.
Entity 매니저의 실제 동작은 다음과 같습니다.
- 애플리케이션 시작 단계
- 애플리케이션이 시작되면 EntityManagerFactory가 생성됩니다.
- EntityManagerFactory는 데이터베이스당 단 하나만 생성되며, persistence.xml의 설정 정보, DB 접속 정보, 엔티티 매핑 정보를 보관합니다.
- 엔티티 매니저와 영속성 컨텍스트
- EntityManagerFactory는 필요할 때마다 EntityManager를 생성합니다.
- EntityManager가 생성될 때마다 각각의 영속성 컨텍스트가 함께 생성됩니다.
- EntityManager를 통해 영속성 컨텍스트에 접근하고 관리할 수 있습니다.
- 데이터베이스 연결 관리
- EntityManager 생성 시점에는 영속성 컨텍스트만 생성됩니다.
- 실제 데이터베이스 작업(persist, flush 등)이 필요한 시점에 Connection Pool에서 커넥션을 가져옵니다.
- 작업이 완료되면 사용한 커넥션을 Connection Pool에 반환합니다.
Thread Safety하게 사용하는 방법
@PersistenceContext 어노테이션을 사용하면 Spring Container가 Entity Manager를 Proxy로 감싸서 관리하기 때문에 Thread Safety 하게 사용할 수 있습니다.
- @PersistenceContext로 주입되는 EntityManager는 실제 EntityManager가 아닌 프록시입니다.
- 이 프록시는 트랜잭션 시작 시점에 실제 EntityManager를 생성합니다.
- 트랜잭션이 종료되면 EntityManager도 함께 종료됩니다.
@Repository public class UserRepository { @PersistenceContext private EntityManager em; // 실제로는 프록시가 주입됨 public void save(User user) { em.persist(user); // 트랜잭션 시작 시점에 실제 EntityManager 생성 } }
각 트랜잭션마다 Thread Local을 사용하여 스레드마다 독립적인 엔티티 매니저를 할당하기때문에 Thread Safety 합니다.
Share article