본문 바로가기
dev/spring

[Spring Batch] 5.1.2 Features

by igooo 2024. 8. 21.
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 조회

 

참고