본문 바로가기
Java/spring batch

[Spring Batch] 한 개의 Step에 여러 개의 Processor의 다중 적용이 필요할 경우(CompositeProcessor, 예제 포함)

by Jayson Jeong 2023. 1. 18.

Chunk 방식을 적용할 경우 ItemReader, ItemProcessor, ItemWriter를 이용한 배치처리가 가능하다. 

이때 ItemProcessor를 다중 적용할 수 있는 방법인 CompositeItemProcessor에 대해 소개하겠다.

 

CompositeItemProcessor

CompositeItemProcessor

 

CompositeItemProcessor 코드를 보면 List<ItemProcessor> delegates 객체를 확인 할 수 있다.

Step 생성 시 CompositeItemProcessor에 작업을 실행하길 원하는 ItemProcessor들을 작업 순서에 따라 List로 구현한 후

delegates에 적용하면 list 순서대로 Processor 작업이 진행된다.

 

 

해당 내용을 기반으로 적용해 실행해보도록 하겠다.

A의 값을 1부터 10까지 갖고 있는 JbgroundNumber 객체가 10 개가 있고

AddProcessor 작업에서는 B 값을 랜덤으로 추가

SumProcessor 작업에서는 A와 B 값을 더해 Result에 입력한다.

public class JbgroundNumber {

    private int a;
    private int b;
    private int result;

}
public CompositeItemProcessor<JbgroundNumber, JbgroundNumber> createProcessor() throws Exception {
        CompositeItemProcessor<JbgroundNumber, JbgroundNumber> compositeItemProcessor = new CompositeItemProcessor<>();
        compositeItemProcessor.setDelegates(Arrays.asList(new AddItemProcessor<>(), new SumItemProcessor<>()));
        compositeItemProcessor.afterPropertiesSet();
        return compositeItemProcessor;
    }

 

실행결과

 

Job 설정 예제

@Configuration
@EnableBatchProcessing
public class CompositeJobConfiguration {

    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;


    public CompositeJobConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }


    @Bean
    public Job composite() throws Exception {
        return jobBuilderFactory.get("composite")
                .incrementer(new RunIdIncrementer())
                .preventRestart() //중단 시 재시작 방지
                .start(compositeStep())
                .build();
    }

    public Step compositeStep() throws Exception {
        return stepBuilderFactory.get("composite")
                .<JbgroundNumber, JbgroundNumber>chunk(100)
                .reader(new JbgroundReader<>())
                .processor(createProcessor())
                .writer(new JbgroundWriter<>())
                .build();
    }

    public CompositeItemProcessor<JbgroundNumber, JbgroundNumber> createProcessor() throws Exception {
        CompositeItemProcessor<JbgroundNumber, JbgroundNumber> compositeItemProcessor = new CompositeItemProcessor<>();

        //방법 1
        compositeItemProcessor.setDelegates(Arrays.asList(new AddItemProcessor<>(), new SumItemProcessor<>()));
        compositeItemProcessor.afterPropertiesSet();

        //방법 2
//        List<ItemProcessor<JbgroundNumber, JbgroundNumber>> list = new ArrayList<>();
//        list.add(new AddItemProcessor<>());
//        list.add(new SumItemProcessor<>());
//        compositeItemProcessor.setDelegates(list);
//        compositeItemProcessor.afterPropertiesSet();

        return compositeItemProcessor;
    }
}

 

전체 소스 보기

https://github.com/JeongJiSang/spring-batch-sample.git