이번 글에서는 배치 작업 간에 파라미터로 받는 방법에 대해 알아보겠습니다.
스프링 배치를 적용하면 자동적으로 DB에 9개의 테이블이 생기는데요, 배치의 Job과 Step이 이곳들에 기록됩니다. 하지만 실제 프로젝트를 진행할 때에는 별도의 테이블을 만들어 관리하는 게 좋습니다.
이제 배치 프로그램을 만들텐데요, 방식은 기존과 거의 동일합니다. 클래스 내부에 Job과 Step을 반환하는 매서드를 만듭니다. 하지만 이번엔 매서드의 파라미터를 통해 Step과 Tasklet을 등록해보겠습니다.
@Configuration
@RequiredArgsConstructor
public class ValidatedParamJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job validatedParamJob(Step validatedParamStep) {
return jobBuilderFactory.get("validatedParamJob")
.incrementer(new RunIdIncrementer())
.start(validatedParamStep)
.build();
}
@Bean
@JobScope
public Step validatedParamStep(Tasklet validatedParamTasklet) {
return stepBuilderFactory.get("validatedParamStep")
.tasklet(validatedParamTasklet)
.build();
}
@Bean
@StepScope
public Tasklet validatedParamTasklet(@Value("#{jobParameters['fileName']}") String fileName) {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("fileName = " + fileName);
System.out.println("validated Param Tasklet");
return RepeatStatus.FINISHED;
}
};
}
보면 Tasklet을 만드는 매서드를 보면 fileName이라는 파라미터가 담기는 걸 볼 수 있습니다. 이 파라미터는 RunConfiguration에서 테스트 등록해줍니다.
그리고 이 파라미터가 올바른 파일 형태인지도 검증할 수 있습니다. 먼저 검증 역할을 할 클래스를 만드는데요, 이 클래스는 JobParametersValidator 인터페이스를 상속합니다. 그리고 validate() 매서드를 오버라이딩해 fileName이라는 이름의 파라미터를 변수로 받아 파일이 csv로 끝나는지 확인합니다. csv는 테스트를 위해 임의로 지정한 것이고 외에 무엇이든 가능합니다.
public class FileParamValidator implements JobParametersValidator {
@Override
public void validate(JobParameters parameters) throws JobParametersInvalidException {
String fileName = parameters.getString("fileName");
if (!StringUtils.endsWithIgnoreCase(fileName, "csv")) {
throw new JobParametersInvalidException("This is Not csv File");
}
}
}
그런 다음 해당 검증 클래스를 Job에 등록해주면 되는데요, 배치는 검증을 Job 단에서 실행합니다.
@Bean
public Job validatedParamJob(Step validatedParamStep) {
return jobBuilderFactory.get("validatedParamJob")
.incrementer(new RunIdIncrementer())
.validator(new FileParamValidator())
.start(validatedParamStep)
.build();
}
그런데 만약 검증 클래스를 여러 개로 두고 사용하고 싶다면 아래의 방법을 사용하면 됩니다.
private CompositeJobParametersValidator multiValidator() {
CompositeJobParametersValidator validator = new CompositeJobParametersValidator();
validator.setValidators(Arrays.asList(new FileParamValidator1(), new FileParamValidator2()));
return validator;
}
@Bean
public Job validatedParamJob(Step validatedParamStep) {
return jobBuilderFactory.get("validatedParamJob")
.incrementer(new RunIdIncrementer())
.validator(multiValidator())
.start(validatedParamStep)
.build();
}
다음 글에서는 Job의 시작과 뒤에 동작을 추가할 수 있는 Listener에 대해 알아보겠습니다.