스프링배치에서 대용량 데이터 처리를 위해서는 데이터의 정합성을 유지하기 위한 Transaction 처리가 필요합니다.
이번 포스트에서는 Spring Batch에서 Transaction 처리를 위해 사용하는 TransactionManager를 살펴보겠습니다.
TransactionManager란?
TransactionManager는 Spring에서 제공하는 인터페이스로, 데이터베이스와 같은 외부 리소스를 사용할 때, 이를 관리하는 역할을 합니다. Spring Batch에서는 Job과 Step에서 이러한 외부 리소스를 사용할 때, TransactionManager를 사용하여 데이터의 정합성을 유지합니다.
Spring Batch의 Transaction 처리
Spring Batch에서는 Job과 Step에서 Transaction 처리를 위해 TransactionManager를 사용합니다. 이를 위해서, Spring에서 제공하는 PlatformTransactionManager 인터페이스를 구현한 객체를 사용합니다. Spring Batch에서는 Job을 실행하기 전에 JobRepository를 이용하여 JobExecution을 생성합니다. 이때, JobExecution은 PlatformTransactionManager를 이용하여 Transaction 처리를 합니다. 마찬가지로, Step 실행 시에도 PlatformTransactionManager를 이용하여 Transaction 처리를 합니다.
PlatformTransactionManager 구현체 종류와 특징
DataSourceTransactionManager
- DataSource를 이용한 Transaction 처리를 위한 구현체입니다.
- JDBC를 사용하는 경우에 주로 사용됩니다.
- DataSourceTransactionManager는 PlatformTransactionManager 인터페이스를 구현하고 있습니다.
장점
- JDBC를 이용하여 데이터를 처리할 때, 매우 유용합니다.
- 단순하고 사용하기 쉽습니다.
단점
- DataSource를 직접 다루기 때문에, ORM 프레임워크인 JPA와는 호환성이 떨어집니다.
- DataSource를 직접 다루기 때문에, 같은 TransactionManager를 사용하는 경우에도 다른 DataSource를 이용하는 경우 처리가 어렵습니다.
예시 코드
아래는 DataSourceTransactionManager를 이용한 코드 예시입니다.
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
JpaTransactionManager
- JPA를 이용한 Transaction 처리를 위한 구현체입니다.
- EntityManagerFactory를 사용합니다.
- JpaTransactionManager는 PlatformTransactionManager 인터페이스를 구현하고 있습니다.
장점
- JPA를 이용하여 데이터를 처리할 때, 매우 유용합니다.
- JPA의 EntityManagerFactory를 이용하기 때문에, 다양한 JPA 구현체와 호환성이 좋습니다.
단점
- EntityManagerFactory를 이용하기 때문에, EntityManagerFactory를 생성하는 시점에 DataSource를 미리 설정해야 합니다.
- JPA의 EntityManagerFactory를 직접 다루기 때문에, DataSourceTransactionManager와 비교하여 구현이 복잡합니다.
예시 코드
아래는 JpaTransactionManager를 이용한 코드 예시입니다.
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
HibernateTransactionManager
- Hibernate를 이용한 Transaction 처리를 위한 구현체입니다.
- SessionFactory를 사용합니다.
- HibernateTransactionManager는 PlatformTransactionManager 인터페이스를 구현하고 있습니다.
장점
- Hibernate를 이용하여 데이터를 처리할 때, 매우 유용합니다.
- Hibernate의 SessionFactory를 이용하기 때문에, 다양한 Hibernate 버전과 호환성이 좋습니다.
단점
- SessionFactory를 이용하기 때문에, SessionFactory를 생성하는 시점에 DataSource를 미리 설정해야 합니다.
- Hibernate의 SessionFactory를 직접 다루기 때문에, DataSourceTransactionManager와 비교하여 구현이 복잡합니다.
예시 코드
아래는 HibernateTransactionManager를 이용한 코드 예시입니다.
@Bean
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
ResourcelessTransactionManager
ResourcelessTransactionManager는 JUnit 테스트와 같이 트랜잭션을 처리할 때, DB 연결 없이 트랜잭션을 처리할 때 사용하는 TransactionManager입니다.
데이터베이스 연결을 필요로 하지 않아, 데이터베이스를 사용하지 않는 테스트 케이스를 작성할 때 매우 유용합니다. 즉, 메모리 상에서 데이터를 처리하며, 테스트 실행 후 데이터를 롤백할 수 있습니다.
장점
- 데이터베이스 연결을 필요로 하지 않아 테스트 데이터의 삽입/삭제/변경 작업이 빠르게 처리됩니다.
- 메모리 상에서 데이터 처리가 이루어지므로, DBMS의 성능에 영향을 받지 않습니다.
단점
- 데이터베이스 연결을 사용하지 않으므로, 실제 데이터베이스에서 발생할 수 있는 문제를 재현하기 어렵습니다.
- 메모리 상에서 처리되기 때문에, 메모리 사용량이 높아질 수 있습니다.
예시 코드
ResourcelessTransactionManager를 사용한 예시 코드는 다음과 같습니다.
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
return factory.getObject();
}
@Bean
public ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
//...
}
Spring Batch는 대용량 데이터를 처리하기 위한 프레임워크로, 데이터의 정합성을 유지하기 위해서는 Transaction 처리가 필요합니다. 이를 위해 Spring에서 제공하는 TransactionManager를 사용합니다. Spring Batch에서는 Job과 Step에서 Transaction 처리를 위해 PlatformTransactionManager 인터페이스를 구현한 객체를 사용합니다. 이를 통해, 대용량 데이터 처리를 하면서도 데이터의 정합성을 유지할 수 있습니다.
'Backend > Spring' 카테고리의 다른 글
Spring에서 컴포넌트 스캔과 의존관계 자동 주입 해보기 (0) | 2023.10.29 |
---|---|
Spring batch 속도 향상하는 방법 (0) | 2023.02.28 |
테스트 케이스 돌리니 TestEngine with ID 'junit-vintage' failed to discover tests 오류가 뜨는 경우 (0) | 2021.11.06 |
[Spring] HTTP Range Requests 를 이용한 비디오 스트리밍 만들기(Video Streaming) (0) | 2021.02.07 |
[Thymeleaf]HTML Form 태그로 서버에 Multipart 형식의 데이터 전송하기(+로그인 인증문제 해결) (0) | 2021.02.03 |