728x90
개요
기존에는 Spring Batch 4.x.x 버전으로 개발하다가 최근에 5.1.2 버전으로 변경하면서
Spring Batch 5.1
What's New in Spring Batch 5.1
- Dependencies upgrade
- Virtual Threads support
- Memory management improvement in the JpaltemWriter
- New synchronized decorators for item readers and writers
- New Cursor-based Mongoltem Reader
- Bulk inserts support in MongoltemWriter
- New item reader and writer for Redis
- Automatic configuration of JobRegistryBeanPostProcessor
- Ability to start a job flow with a decision
- Ability to provide a custom JobKeyGenerator
- New documentation based on Antora
주요 변경 사항
Dependeencies upgrade
- Spring Framework 6.1.0
- Spring Data 3.2.0
- Spring Kafka 3.1.0
Virtural Threads support
Spring Batch에 Job 생성 시 Thread를 직접 관리하지는 않지만 Spring Framework 6.1에서는 Virtual Threads를 기반으로 한 새로운 TaskExecutor구현이 도입되어 사용된다.
Mongo Reader / Writer
Reader
- MongoItemReader는 skip을 사용한 페이징으로 적인 규모에 데이터 조회에 적합함
- skip을 사용한 페이징으로 대량의 데이터에서는 조회 성능이 저하됨
- MongoCursorItemReader는 페이징 대신 cursor 기반으로 데이터를 조회하여 대규모 데이터 수집에 적합.
Writer
- MongoItemWriter는 upsert, delete 두 개의 오퍼레이션을 제공
- 신규로 insert 오퍼레이션은 Bulk insert를 위해 제공한다.
- 기존 upsert를 사용한 저장보다 속도 상승
New item reader and writer for Redis
Redis를 사용한 RedisItemReader, RedisItemWriter 제공
Code Migration
Transaction manager bean exposure/configuration
// Sample with v4
@Configuration
@EnableBatchProcessing
class MyStepConfig {
@Autowired
private StepBuilderFactory stepBuiderFactory;
@Bean
Step myStep() {
return this.stepBuiderFactory.get("myStep")
.tasklet(...) // or .chunk()
.build();
}
}
// Sample with v5
@Configuration
@EnableBatchProcessing
class MyStepConfig {
@Bean
Tasklet myTasklet() {
return new MyTasklet();
}
@Bean
Step myStep(JobRepository jobRepository, Tasklet myTasklet, PlatformTransactionManager transactionManager) {
return new StepBuilder("myStep", jobRepository)
.tasklet(..., transactionManager) // or .chunk(chuckSize, transactionManager)
.build();
}
}
JobBuilderFactory and StepBuilderFactory bean exposure/configuration
// Sample with v4
@Configuration
@EnableBatchProcessing
class MyJobConfig {
@Autowired
private JobBuilderFactory jobBuiderFactory;
@Bean
Step myJob(Step step) {
return this.jobBuiderFactory.get("myJob")
.start(step)
.build();
}
}
// Sample with v5
@Configuration
@EnableBatchProcessing
class MyJobConfig {
@Bean
Job myJob(JobRepository jobRepository, Step step) {
return new JobBuilder("myJob", jobRepository)
.start(step)
.build();
}
}
All implementataions of ItemWriter were updated to use the Chunk API instead of List
public insterface ItemWriter<T> {
/**
* Process the supplied data element. Will not be called with any null items
* in normal operation.
*
* @param items items to be written
* @throws Exception if there are erros. The framework will catch the
* exception and convert rethrow it as appropriate.
*/
void writer(List<? extends T> items) throws Exception;
}
public interface ItemWriter<T> {
/**
* Process the supplied data element. Will not be called with any null items
* in normal operation.
*
* @param chunk of items to be written. Must not be {@code null}.
* @throws Exception if there are erros. The framework will catch the
* exception and convert rethrow it as appropriate.
*/
void writer(@NotNull Chunk<? extends T> chunk) throws Exception;
}
주요 코드 변경 사항
- Job @Bean 생성 : JobBuilder, StepBuilder를 사용하여 Job객체를 생성한다.
- Step 구성에 TransactionManager 객체 설정 필요
- ItemWriter 객체는 모두 Chunk 객체의 items() 메서드 호출로 item 조회
참고
'dev > spring' 카테고리의 다른 글
[Spring] Data Commons Auditing MongoDB (0) | 2024.08.26 |
---|---|
[Spring Batch] - AbstractPagingItemReader 조심하기 (0) | 2024.08.21 |
[Spring] Flyway DB Migration (0) | 2024.08.05 |
Java JVM - Checkpoint Restore (CRaC) (0) | 2024.07.20 |
[Spring] Springdoc-openapi 사용하여 API 문서 만들기 (0) | 2024.07.16 |