본문 바로가기
Spring|Spring-boot/Spring Batch

Spring Batch Architecture

by oncerun 2021. 2. 27.
반응형

www.tutorialspoint.com/spring_batch/spring_batch_architecture.htm

 

Spring Batch - Architecture - Tutorialspoint

Spring Batch - Architecture Following is the diagrammatic representation of the architecture of Spring Batch. As depicted in the figure, the architecture contains three main components namely, Application, Batch Core, and Batch Infrastructure. Application

www.tutorialspoint.com

 

 

 

스프링 배치 아키텍처의 구성도입니다.

 

job과 step을 생성만 했는데 스프링 배치가 실행됐습니다. 

스프링 배치는 job타입의 빈이 생성되면 job Launcher객체에 의해 job을 수행합니다. 

그럼  job은 step을 수행하게 될 것입니다.

 

이  Job Repository는 DB, Memory에 스프링 배치가 실행될 수 있도록 배치의 메타데이터를 관리하는 클래스입니다.

 

 Job은 N개의 Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있다. 

스텝은 순서대로 시작되기 때문이다.

 

Step의 실행 단위는 크게 2가지로 나누어진다.

 

  chunk 기반 step은 하나의 큰 덩어리를 n개씩 나눠서 실행합니다.

  tast 기반 step은 하나의 작업을 기반으로 실행합니다.

 

 

Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter가 존재합니다.

 여기서 Item은 배치 처리 대상 객체를 의미합니다.

  • ItemReader는 배치 처리 대상 객체를 읽어 ItemProcessor 또는 ItemWriter에게 전달합니다. DB 혹은 입력값 혹은 파일에서 Item을 읽겠죠.

  • ItemWriter는 배치 처리 대상 객체를 처리한다. DB 업데이트를 하거나 처리 대상 사용자에게 알림을 보낸다.

  • ItemProcessor는 input 객체를 output 객체로 filtering 또는 processing 해 ItemWriter에게 전달합니다.

    • 순서는 다음과 같을 겁니다. ItemReader에서 읽은 데이터를 수정 또는 ItemWriter 대상인지 filtering 한다.

    • ItemProcessor는 optional 하다.

    • ItemProcessor가 하는 일을 ItemReader 또는 ItemWriter가 대신할 수 있다

 

만약 수만 개의 데이터를 처리할 능력이 된다면 Tasklet을 사용하며,  그렇지 않다면 chunk로 분할해서 처리할 수 있습니다.

 

 

Tasklet을 사용한 Task 기반 처리

 - 배치 처리 과정이 비교적 쉬운 과정에 쉽게 사용할 수 있다.

 - 대량 처리를 하는 경우 더 복잡해진다.

 - 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합

 

Chunk를 사용한 chunk기반 처리

 - ItemReader, ItemPorcessor, ItemWriter의 관계 이해가 필요하다.

 - 대량 처리를 하는 경우 Tasklet 보다 비교적 쉽게 구현

 - 만개 데이터를 천 개씩 10개 덩어리로 수행한다면 tasklet은 만개를 한 번에 혹은 수동으로 천 개씩 분할

 

chunk 기반일 경우 reader에서 null을 return 할 때까지 step이 반복됩니다. 즉 처리할 데이터가 없을 때까지 합니다.

itemReader와 itemProcessor는 하나씩 , ItemWriter은 List형태

@Slf4j
@Configuration
public class ChunkProcessConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;


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

    @Bean
    public Job chunkProcessingJob(){
        return jobBuilderFactory.get("chunkProcessingJob")
                .incrementer(new RunIdIncrementer())
                .start(this.taskBaseStep())
                .next(this.chunkBaseStep())
                .build();

    }

    @Bean
    public Step chunkBaseStep(){
        return  stepBuilderFactory.get("chunkBaseStep")
                .<String,String>chunk(10) //<InputType,OutputType>
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .build();

    }

    private ItemWriter<String> itemWriter() {
        return items -> log.info("chunk item size : {}", items.size());

    }

    //item을 가공하거나, writer로 넘길지 말지 결정 null일경우 writer로 넘어가지 않음
    private ItemProcessor<String, String> itemProcessor() {
        return item -> item + ", Spring Batch";
    }

    private ItemReader<String> itemReader() {
        return new ListItemReader<>(getItems()); //100개 String list
    }

    @Bean
    public Step taskBaseStep() {
        return stepBuilderFactory.get("taskBaseStep")
                .tasklet(this.tasklet()) //tasklet으로 100개 한번에 처리
                .build();

    }

    private Tasklet tasklet() {
        return (contribution, chunkContext) -> {
            List<String> items = getItems();
            log.info("task item size : {}",
                    items.size());
            return RepeatStatus.FINISHED;
        };
    }

    private List<String> getItems() {
        List<String> items  = new ArrayList<>();

        for (int i =0; i < 100; i++){
            items.add(i + "hello");
        }
        return items;
    }

}

 

반응형

'Spring|Spring-boot > Spring Batch' 카테고리의 다른 글

Spring Batch ItemReader  (0) 2021.03.06
Spring Batch Parameter  (0) 2021.02.28
Spring Batch step 작성해보기  (0) 2021.02.27
Spring Batch Job Repository  (0) 2021.02.27
Batch Hello World  (0) 2021.02.27

댓글