일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- OS
- 파이썬
- Proxy
- Algorithm
- Spring
- 컴퓨터구조
- Heap
- IT
- C
- c언어
- 자료구조
- design pattern
- redis
- spring webflux
- JPA
- Data Structure
- 네트워크
- Java
- 운영체제
- 알고리즘
- 디자인 패턴
- Kafka
- mongoDB
- JavaScript
- 백준
- MySQL
- react
- MSA
- Galera Cluster
- 자바
- Today
- Total
시냅스
Spring Boot 3++ 를 위한 Spring Batch migration 요약 본문
이 글에서는 Spring 6, Spring boot 3++ 를 사용하면서 spring batch 5 로 업그레이드 할 때 migration 을 위한 내용을 요약합니다.
주로 사용 방법에 대해서만 상술하니 자세한 내용은 아래의 공식문서를 참고하시기 바랍니다.
Job, Step v4
// Sample with v4
@Configuration
@EnableBatchProcessing
public class MyStepConfig {
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Bean
public Job myJob(Step step) {
return this.jobBuilderFactory.get("myJob")
.start(myStep)
.build();
@Bean
public Step myStep() {
return this.stepBuilderFactory.get("myStep")
.tasklet(..) // or .chunk()
.build();
}
}
기존 v4 에서는 builder factory 내부에서 repository, transaction manager 를 내부적으로 사용하고 있었습니다.
다만, datasource 를 여러개로 구성하거나 custom 이 필요할 때에는 위와 같은 설정을 따를 수 없으므로
v5 부터는 아래와 같이 명시적으로 표현하는 설정으로 바뀌었습니다.
Job, Step v5
@RequiredArgsConstructor
@Configuration
public class BatchConfig {
private final int CHUNK_SIZE = 5;
private final TestTasklet testTasklet;
@Bean
public Job testJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new JobBuilder("testJob", jobRepository)
.start(testStep(jobRepository, transactionManager))
.build();
}
@Bean
public Step testStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("testStep", jobRepository)
.tasklet((contribution, chunkContext) -> {
System.out.println("TestBatchApplication executed");
return RepeatStatus.FINISHED;
}, transactionManager).build();
}
@Bean
public Step testStep2(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("testStep2", jobRepository)
.tasklet(testTasklet, transactionManager)
.build();
}
@Bean
// reader 와 processor, writer 는 딱히 바뀐 게 없음
public Step testStep3(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("testStep3", jobRepository)
.<TestEntity, TestEntity>chunk(CHUNK_SIZE, transactionManager)
.build();
}
class TestEntity {
}
@Component
class TestTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
return null;
}
}
}
여러가지 패턴으로 작성하였지만, builder factory 대신 각각의 builder 로 바뀌엇고,
repository, transactionManager 를 명시적으로 주입하기만 하면 됩니다.
또한 @EnabledBatchProcessing 애노테이션이 필수가 아니게 되었습니다.
DefaultBatchConfiguration
@EnabledBatchProcessing 이 내부적으로 빈을 등록하던 것을
DefaultBatchConfiguration 을 통해 명시적인 커스텀을 할 수 있게 하는 방식으로 변경되었습니다.
@Configuration
public class MyBatchApplication extends BatchConfiguration {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory) {
return jobBuilderFactory.get("job")
// define job
.build();
}
}
위와 같이 선언한 뒤 필요한 항목을 override 하여 사용하면 됩니다.
override 할 수 있는 항목은 아래와 같습니다.
- jobRepository
- jobLauncher
- jobExplorer
- jobRegistry
- jobOperator
- getDataSource
- getRansactionManager
- getValidateTransactionState
- getIsolationLevelForCreate
- getCharset
- ... etc
Job Parameter
// v4
[+|-]parameterName(parameterType)=value
// v5
parameterName=parameterValue,parameterType,identificationFlag
parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'
한정적인 데이터 타입만을 지원했던 v4 와는 달리 v5 와 같은 형식을 통해 여러가지 데이터 타입을 지원하도록 변경되었습니다.
위와 같은 설정들을 통해 batch 는 더욱 확장성있는 애플리케이션으로 진화할 수 있습니다.
아래의 공식문서를 통해 더 자세한 내용을 알아보시기 바랍니다.
끝!
https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide
'Java, Spring' 카테고리의 다른 글
Spring WebFlux 이해하기 - Reactive Streams (0) | 2024.02.03 |
---|---|
JVM, Spring 에서의 시스템 변수와 환경변수 이해 (0) | 2023.11.28 |
Spring 동시성 문제 해결 (비관적 락, Redis 분산락을 적용한 Annotation AOP) (0) | 2023.07.23 |
JWT 대신 Session 을 쓰는 이유 (Redis Session Clustering, Spring Security) (2) | 2023.07.17 |
HikariCP 설정과 유의사항 (0) | 2023.05.03 |