Spring boot, JPA (1) - Entity Manager란?

Spring boot JPA Entity Manager
김주혁's avatar
Dec 03, 2024
Spring boot, JPA (1) - Entity Manager란?
 

Entity Manager


 
엔티티 매니저(Entity Manager)는 데이터베이스와의 연결을 추상화한 세션의 일종입니다. JPA의 EntityManager와 Hibernate의 Session은 같은 역할을 합니다. Entity Manage가 하는 역할:
  • 데이터베이스 연결 관리
  • 트랜잭션 관리
  • CRUD 연산 수행
 
실제 구현으로는 JPA EntityManager는 인터페이스이며, Hibernate Session은 EntityManager의 구현체입니다. 내부적으로 데이터베이스 커넥션을 얻어와서 사용합니다.
 
주요 특징으로는
  • Thread Safety하지 않아서, 공유해서 사용하면 안됩니다.
  • 데이터 베이스 트랜잭션 단위로 생성하고 폐기하는 것이 일반적 입니다.
  • 내부적으로 DB 커넥션 풀을 사용해서 실제 물리적 연결을 관리합니다.
 
Entity 매니저의 실제 동작은 다음과 같습니다.
notion image
  1. 애플리케이션 시작 단계
      • 애플리케이션이 시작되면 EntityManagerFactory가 생성됩니다.
      • EntityManagerFactory는 데이터베이스당 단 하나만 생성되며, persistence.xml의 설정 정보, DB 접속 정보, 엔티티 매핑 정보를 보관합니다.
  1. 엔티티 매니저와 영속성 컨텍스트
      • EntityManagerFactory는 필요할 때마다 EntityManager를 생성합니다.
      • EntityManager가 생성될 때마다 각각의 영속성 컨텍스트가 함께 생성됩니다.
      • EntityManager를 통해 영속성 컨텍스트에 접근하고 관리할 수 있습니다.
  1. 데이터베이스 연결 관리
      • EntityManager 생성 시점에는 영속성 컨텍스트만 생성됩니다.
      • 실제 데이터베이스 작업(persist, flush 등)이 필요한 시점에 Connection Pool에서 커넥션을 가져옵니다.
      • 작업이 완료되면 사용한 커넥션을 Connection Pool에 반환합니다.
 

Thread Safety하게 사용하는 방법


 
@PersistenceContext 어노테이션을 사용하면 Spring Container가 Entity Manager를 Proxy로 감싸서 관리하기 때문에 Thread Safety 하게 사용할 수 있습니다.
  1. @PersistenceContext로 주입되는 EntityManager는 실제 EntityManager가 아닌 프록시입니다.
  1. 이 프록시는 트랜잭션 시작 시점에 실제 EntityManager를 생성합니다.
  1. 트랜잭션이 종료되면 EntityManager도 함께 종료됩니다.
 
@Repository public class UserRepository { @PersistenceContext private EntityManager em; // 실제로는 프록시가 주입됨 public void save(User user) { em.persist(user); // 트랜잭션 시작 시점에 실제 EntityManager 생성 } }
 
각 트랜잭션마다 Thread Local을 사용하여 스레드마다 독립적인 엔티티 매니저를 할당하기때문에 Thread Safety 합니다.
 
Share article

vlogue