일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- nginx설치
- 자바스크립트
- 카프카 트랜잭션
- kafka
- APNS
- 디자인패턴
- 카프카
- Design Pattern
- 푸시 번역
- nginx설정
- php
- 웹사이트최적화기법
- JPA
- GCM
- nginx
- notification
- Java
- GCM 번역
- 푸시
- 성능
- 웹사이트 성능
- 웹사이트성능
- Push
- 페이스북 번역
- ddd
- graphql
- gcm 푸시 번역
- 도메인 주도 개발
- git
Archives
- Today
- Total
간단한 개발관련 내용
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의 생성, 바인딩, 종료 등을 신경 쓰지 않고, 비즈니스 로직에 집중할 수 있게 됩니다.
반응형