Framework/Spring

Spring Batch 5.x에 적응하기

TwinParadox 2024. 3. 3. 11:24
728x90

0. 이 글의 발단

Spring Batch 작업을 하다가 필요한 내용을 찾다 보니, 4.x랑 5.x가 내용이 꽤나 많이 바뀐 것 같아 작성하였다.

사실, 버전 마이그레이션을 하려고 했던 부분은 아닌데 어차피 확인해보고 싶은 내용은 버전과 무관한 부분이어서, 학습하는 김에 바뀐 버전에서는 어떻게 활용해야 하는지 정리해보려고 한다. 훗날 마이그레이션 작업을 할 일이 있거나, 새로운 코드를 작성할 때 빠진 내용이 있다면 이 글에 붙여나갈 계획이다.

 

이 글은 어디까지나, 탐색 형식으로 버전 마이그레이션에 대해 탐구한 내용이라서 모든 내용을 다루고 있지 않고 일부 놓친 부분이 있을 수 있으므로, 공식 마이그레이션 가이드를 참고하는 것을 권장한다.

 

(혹시나, 글에 오류가 있거나 문제가 있다면 지적은 언제나 환영합니다.)

 

 

주요 특징

@EnableBatchProcessing &  DefaultBatchConfiguration

Springboot 2.x, Spring Batch 4.x에서 배치 작업 관련된 Bean을 편하게 등록하기 위해서는 이 어노테이션을 사용했지만, 5.x부터는 필수가 아니게 되었다. 사용하지 않더라도 Bean으로 등록된다.

단, BatchAutoConfiguration 하위에 @ConditionalOnMissingBean이 추가되었기 때문에 필요에 따라서 이 부분에 변경이 있으면 하위의 Bean도 등록되지 않아 수동 등록이 필요하다.

/*...*/
@ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class)
/*...*/
public class BatchAutoConfiguration {
/*...*/
}

 

 

DefaultBatchConfiguration extends 해서 사용하기

@EnableBatchProcessing을 사용하지 않고 DefaultBatchConfiguration 클래스를 상속받아 처리가 가능하다.

해당 클래스 내부에는 데이터 소스나, 트랜잭션 매니저 등에 대한 protected method가 여러 가지 있어서 이를 커스터마이즈해서 활용 가능하다.

@Configuration
public class MyJobConfig extends DefaultBatchConfiguration {

    @Bean
    public Job myJob(JobRepository jobRepository, Step step) {
        return new JobBuilder("myJob", jobRepository)
                .start(step)
                .build();
    }
    
    @Override
    protected Charset getCharset() {
        return StandardCharsets.UTF_8;
    }
   
   /* getDataSource, getTransactionManager... 등 다양한 protected method 제공
    * 필요 시, override하여 사용
    */

}

 

 

주의사항

DefaultBatchConfiguration은 @EnableBatchProcessing과 같이 사용할 수 없다.

 

 

JobBuilderFactory & StepBuilderFactory 와의 작별

Spring Batch 4.x에선 이 BuilderFactory로 Job과 Step을 편하게 만들 수 있었지만, 5.0부터는 deprecated 되었다.

이 두 가지는 각각 JobBuilder, StepBuilder를 사용해서 직접 생성해주는 형태로 바뀌었다.

Job과 Step을 명시적으로 생성함에 따라, JobRepository, TransactionManager 또한 명시적으로 표시해야 한다.

// Sample with v4
@Configuration
@EnableBatchProcessing
public class MyJobConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Bean
    public Job myJob(Step step) {
        return this.jobBuilderFactory.get("myJob")
                .start(step)
                .build();
    }

}

// Sample with v5
@Configuration
@EnableBatchProcessing
public class MyJobConfig {

    @Bean
    public Job myJob(JobRepository jobRepository, Step step) {
        return new JobBuilder("myJob", jobRepository)
                .start(step)
                .build();
    }

}
// Sample with v4
@Configuration
@EnableBatchProcessing
public class MyStepConfig {

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step myStep() {
        return this.stepBuilderFactory.get("myStep")
                .tasklet(..) // or .chunk()
                .build();
    }

}

// Sample with v5
@Configuration
@EnableBatchProcessing
public class MyStepConfig {

    @Bean
    public Tasklet myTasklet() {
       return new MyTasklet();
    }

    @Bean
    public Step myStep(JobRepository jobRepository, Tasklet myTasklet, PlatformTransactionManager transactionManager) {
        return new StepBuilder("myStep", jobRepository)
                .tasklet(myTasklet, transactionManager) // or .chunk(chunkSize, transactionManager)
                .build();
    }

}

 

 

 

JobParameter Type

다양한 JobParameter type을 제공한다.

4.x에서는 Long, Double, String, Date만을 제공하고 있었으나 5.0부터는 Generic을 사용할 수 있어 커스텀한 타입으로 설정이 가능하다.

JobParameter 클래스 변경사항

 

 

JobParameter 적용 방식

# ~ 4.x
parameterName(parameterType)=parameterValue

# 5.0 ~ with DefaultJobParametersConverter
parameterName=parameterValue,parameterType,identifiactionFlag
sample.date=2024-03-01,java.time.LocalDate

# 5.0 ~ with JsonJobParametersConvereter
parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'

 

이러한 변경이 적용되면서, 당연하게도(?) BATCH_JOB_EXECUTION_PARAMS DDL이 변경되었다.

BATCH_JOB_EXECUTION_PARAMS DDL 변경사항

 

 

 

Reference

https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide

728x90
728x90