-
Spring Batch 3.0 이상에서 JPA 사용시 PlatformTransactionManager 설정Spring/Spring 2023. 6. 1. 18:05
소개
Spring Batch는 대용량 데이터 처리를 위한 강력한 프레임워크이다. 특히 Spring Batch 3.0 이상에서는 JPA를 사용하여 데이터베이스와 상호작용할 때 적절한 트랜잭션 관리가 중요하다. Spring Batch 3.0 이상에서 JPA를 사용할 때 PlatformTransactionManager를 설정하는 방법에 대해 알아보자.
Spring Batch와 JPA 트랜잭션 관리
Spring Batch에서 JPA를 사용하여 데이터베이스와 상호작용할 때는 JPA 트랜잭션 관리자를 사용하는 것이 적절하다. Spring Batch는 기본적으로 JDBC를 사용하지만, JPA와 함께 사용할 때는 JpaTransactionManager를 설정해야 한다. 이를 통해 JPA 엔티티의 상태를 관리하고, 데이터베이스 변경 사항을 트랜잭션 범위 내에서 처리할 수 있다.
트랜잭션 관리자 설정
Spring Batch에서 배치 작업과 JPA를 사용할 때 두 가지 트랜잭션 관리자를 설정할 수 있다:
- JdbcTransactionManager: 주로 Spring Batch의 메타데이터를 관리하는 데 사용된다.
- JpaTransactionManager: JPA 엔티티를 관리하고 데이터베이스 작업을 처리하는 데 사용된다.
설정 예시
아래는 Spring Batch에서 JdbcTransactionManager와 JpaTransactionManager를 설정하는 예시이다.
Spring Batch 작업 설정
Spring Batch 작업을 설정할 때는 각 Step에서 적절한 트랜잭션 관리자를 설정해야 한다. JPA를 사용하여 데이터를 처리하는 경우 JpaTransactionManager를 설정하고, 배치 메타데이터를 관리할 때는 JdbcTransactionManager를 사용할 수 있다.
Sample
Spring Batch에서 JdbcTransactionManager와 JpaTransactionManager를 사용하는 이유는 각기 다른 데이터 접근 기술과 트랜잭션 관리 방식에 최적화된 트랜잭션 관리자를 사용함으로써 성능과 안정성을 향상시키기 위함이다. 두 트랜잭션 관리자는 각각의 역할에 맞게 최적화되어 있다. 아래에 그 이유를 상세히 설명하겠다.
JdbcTransactionManager
- 주된 사용 목적: 주로 Spring Batch 메타데이터를 관리하는 데 사용된다.
- 특징:
- 가볍고 빠름: JDBC를 직접 사용하기 때문에 JpaTransactionManager에 비해 더 가볍고 빠른 트랜잭션 관리가 가능하다.
- 직접적인 JDBC 사용: 단순한 SQL 쿼리를 통해 데이터베이스 작업을 처리하며, JPA의 복잡한 캐싱이나 컨텍스트 관리 없이 직접적인 데이터베이스 접근이 가능하다.
- 적은 오버헤드: JPA의 엔티티 매핑, 캐시 관리 등의 오버헤드가 없기 때문에 Spring Batch 메타데이터와 같이 단순한 데이터베이스 작업에는 적합하다.
JpaTransactionManager
- 주된 사용 목적: JPA 엔티티를 관리하고 데이터베이스 작업을 처리하는 데 사용된다.
- 특징:
- 객체 지향적 데이터베이스 작업: JPA를 통해 객체 지향적으로 데이터베이스 작업을 수행할 수 있으며, 엔티티 매핑과 ORM을 활용할 수 있다.
- 엔티티 관리 및 영속성 컨텍스트: 영속성 컨텍스트를 통해 엔티티의 상태를 관리하고, 데이터베이스와의 동기화를 효율적으로 처리할 수 있다.
- 복잡한 트랜잭션 관리: 복잡한 트랜잭션 관리가 필요한 경우, 예를 들어, 여러 엔티티 간의 관계를 관리하거나 복잡한 비즈니스 로직을 수행할 때 유용하다.
이유 및 이점
- 최적화된 성능:
- JdbcTransactionManager는 단순한 데이터베이스 작업에 적합하여 오버헤드가 적고 빠른 처리 속도를 제공한다.
- JpaTransactionManager는 JPA의 복잡한 기능을 지원하면서도 객체 지향적 접근 방식을 제공하여 복잡한 트랜잭션을 관리할 수 있다.
- 책임 분리:
- Spring Batch의 메타데이터와 비즈니스 로직에서 사용하는 도메인 엔티티는 각각 다른 요구사항을 가지므로, 각각의 요구에 맞는 트랜잭션 관리자를 사용하는 것이 바람직하다.
- 유연성:
- 서로 다른 트랜잭션 관리자를 사용함으로써 애플리케이션이 보다 유연하게 동작할 수 있으며, 특정 작업에 최적화된 방법을 사용할 수 있다.
Spring Batch에서 JdbcTransactionManager와 JpaTransactionManager를 나누어 사용하는 이유는 각 데이터 접근 방식의 특성과 요구사항에 맞게 최적화된 트랜잭션 관리자를 사용함으로써 성능을 극대화하고, 코드의 복잡도를 줄이며, 책임을 명확히 분리하기 위함이다.
HikariCP
각 transactionManager에 dataSource 설정시 hikariCP 설정도 고려해보자.
HikariCP 설정
HikariCP는 고성능 JDBC 연결 풀로, 빠르고 가벼운 연결 관리 기능을 제공한다. minimumIdle 및 maximumPoolSize 외에도 성능과 안정성을 향상시키기 위해 추가로 설정할 수 있는 몇 가지 중요한 옵션들이 있다.
기본 설정 옵션
- minimumIdle: 풀에서 유지할 최소 유휴 연결 수.
- maximumPoolSize: 풀에서 유지할 최대 연결 수.
추가 설정 옵션
- idleTimeout: 유휴 연결을 유지할 최대 시간(밀리초).
- maxLifetime: 풀에서 유지될 수 있는 연결의 최대 수명(밀리초).
- connectionTimeout: 풀에서 연결을 얻기 위해 기다릴 최대 시간(밀리초).
- validationTimeout: 풀에서 연결의 유효성을 검사하는 데 사용할 최대 시간(밀리초).
- leakDetectionThreshold: 연결 누수를 감지하기 위한 임계값(밀리초).
- poolName: 연결 풀의 이름.
'Spring > Spring' 카테고리의 다른 글
Spring Cloud Kubernetes: ConfigMap 변경 시 전체 서비스 갱신 (0) 2024.01.10 Spring Batch에서 Job Completed 이후 종료되지 않을때 (0) 2023.09.09 SubscribeOn , PublishOn (31) 2021.12.23 Reactor List가 비어있을 때의 switchIfEmpty와 defaultIfEmpty (0) 2021.10.14 스프링 @Transactional과 잠금 (0) 2021.08.11