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 적용 방식
# ~ 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이 변경되었다.
Reference
https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide
'Framework > Spring' 카테고리의 다른 글
공식 문서를 통해 스프링 배치(Spring Batch)에 대해 간략하게 알아보기 (0) | 2021.06.20 |
---|