『스프링 배치 완벽 가이드』를 바탕으로 공부한 내용을 정리한 글입니다.
대량 처리가 필요로 하는 비즈니스 작업인 배치 작업은 아래와 같은 특성들을 가지고 있다.
스프링 배치는 엔터프라이즈 시스템의 일상적인 운영에 필수적인 강력한 배치 애플리케이션을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크이다.
배치 처리 프로세스를 표현한다. 스프링 배치에서는 아래 객체들을 통해 관리한다.
Job을 구성하는 단계를 표현한다. 스프링 배치에서 step의 실행을 StepExecution 형태로 관리한다.
Step을 구성하는 작업에 대한 인터페이스는 다음과 같다.
ItemReader, ItemProcessor, ItemWriter로 등록된 스텝은 작업을 묶어서 수행할 아이템 갯수를 chunk로 지정해 chunk로 지정한 갯수만큼 읽기와 처리 작업을 수행한 후 1번의 ItemWriter의 쓰기 작업을 수행하고 chunk 단위의 커밋과 롤백을 수행하는 것이 특징이다.
스프링 배치를 사용하기 위해서는 실행할 잡과 잡을 구성하는 스텝을 빈으로 등록해야 한다.
spring boot의 기본 설정을 통해 등록한 잡이 SimpleJobLauncher를 통해 자동으로 실행되는데 아래와 같은 방법들을 통해 실행되는 잡을 변경할 수 있다.
spring.batch.job.name=job_name
java -jar demo.jar --job.name=job_name
spring.batch.job.enabled=false
jobLauncher.run(job(), jobParameters);
스프링 배치 잡을 관리하는 JobRepository를 사용하기 위한 RDB 설정 빈(Datasource, PlatformTransactionManager)이 필요하다.
@Configuration
@RequiredArgsConstructor
public class BatchConfig extends DefaultBatchConfigurer {
@Override
public void setDatasource(Datasource datasource) {
// 별도로 설정을 안하면 인메모리 맵을 통한 잡 레포지터리가 설정된다.
}
@Bean
public Job job(Step step) {
return new JobBuilder("job")
.preventRestart()
.start(step1())
.next(step2())
.build();
}
@Bean
public Step step1() {
return new StepBuilder("step1")
.<String, String>chunk(10)
.reader(reader())
.processor(processor())
.writer(write())
.build();
}
@Bean
public Step step2() {
return new StepBuilder("step2")
.tasklet(tasklet())
.build();
}
JobParameters를 매개변수로 참조하는 빈의 생성을 JobParameters가 전달되는 잡이나 스텝의 실행 시점으로 지연시켜 명령이나 다른 소스에서 받아들인 JobParameters를 주입받을 수 있다.
JobExecution 또는 StepExecution의 속성으로 잡이 실행되고 있는 동안 저장하고 있는 상태 정보를 잡이나 스텝 간에 공유가 가능하게 한다.
@Bean
@JobScope
public Job job(Step step) {
return new JobBuilder("job")
.tasklet(step(null))
.build();
}
스프링 배치 작업을 구성하는 스텝에 대한 병렬 처리로 작업 성능을 개선할 수 있다.