반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

간단한 개발관련 내용

SPRING-DATA-JPA 사용할 때 EntityManagerFactory와 EntityManager 관리 본문

Framework/JPA

SPRING-DATA-JPA 사용할 때 EntityManagerFactory와 EntityManager 관리

vincenzo.dev.82 2025. 2. 4. 15:52
반응형

Spring Data JPA를 사용할 때, Spring 컨테이너가 EntityManagerFactory와 EntityManager의 생명주기 및 관리를 담당합니다. 주요 관리 방식은 다음과 같습니다.


1. EntityManagerFactory의 관리

  • 싱글톤 빈(Singleton Bean):
    EntityManagerFactory는 애플리케이션 전체에서 단 한 번 생성되는 싱글톤 빈으로 관리됩니다. 보통 Spring Boot의 경우, 자동 구성(auto-configuration)에 의해 데이터 소스와 JPA 설정을 기반으로 EntityManagerFactory가 생성됩니다.
  • 공유:
    모든 Repository나 Service 계층은 동일한 EntityManagerFactory를 공유하며, 이 팩토리를 통해 EntityManager 인스턴스가 생성됩니다.

2. EntityManager의 관리

  • 트랜잭션 범위 내 관리:
    EntityManager는 스레드에 안전하지 않으므로, 일반적으로 트랜잭션 범위 내에서 생성되고 사용됩니다. Spring은 트랜잭션 매니저(예: JpaTransactionManager)를 통해 트랜잭션이 시작될 때 EntityManager를 생성하여 해당 스레드에 바인딩하고, 트랜잭션이 종료되면 자동으로 닫습니다.
  • ThreadLocal 바인딩:
    Spring은 AOP나 TransactionInterceptor를 활용해, 현재 스레드에 EntityManager를 바인딩합니다. 이를 통해 Repository나 Service 계층에서 @PersistenceContext 어노테이션을 사용하면, 현재 트랜잭션에 맞는 EntityManager가 주입됩니다.
  • 자동 해제:
    트랜잭션 범위를 벗어나면, Spring이 EntityManager를 자동으로 종료(close)하여 리소스 누수를 방지합니다.

3. Spring Data JPA와 Repository

  • Repository 추상화:
    Spring Data JPA의 Repository 인터페이스는 내부적으로 EntityManager를 주입받아 동작합니다. 개발자는 EntityManager를 직접 관리할 필요 없이 Repository 인터페이스를 통해 데이터 접근 로직을 구현할 수 있습니다.
  • 트랜잭션 관리:
    Spring Data JPA는 기본적으로 각 Repository 메서드를 호출할 때, 트랜잭션을 자동으로 시작하고 종료하는 트랜잭션 경계를 설정합니다. 따라서 EntityManager의 생성과 종료는 트랜잭션 관리에 의해 투명하게 이루어집니다.

결론

  • EntityManagerFactory:
    Spring 컨테이너가 애플리케이션 시작 시 생성하여 싱글톤으로 관리하며, 모든 데이터 접근 컴포넌트에 공유됩니다.
  • EntityManager:
    트랜잭션 범위 내에서 생성되고, ThreadLocal에 바인딩되어 Repository나 Service 계층에 주입됩니다. 트랜잭션 종료 시 자동으로 닫혀 리소스 관리가 이루어집니다.

이러한 관리 방식 덕분에 Spring Data JPA를 사용할 때는 개발자가 직접 EntityManager의 생성, 바인딩, 종료 등을 신경 쓰지 않고, 비즈니스 로직에 집중할 수 있게 됩니다.

반응형