프레임워크(Framework)/Spring

[Spring Batch] 스프링 배치 StepContribution 이해하기 - Spring boot 2.x

잇트루 2023. 7. 6. 19:39
반응형

StepContribution

StepContribution은 Chunk 기반 Tasklet에서 Chunk 프로세스의 변경 사항을 버퍼링 한 후 StepExecution 상태를 업데이트하는 도메인 객체다.

  • Chunck 커밋 직전에 StepExecution의 apply 메서드를 호출하여 상태를 업데이트한다.
  • ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 StepExecution에 적용할 수 있다.

 

 

StepContribution의 구조

  • readCount : 성공적으로 read한 아이템 수
  • writeCount : 성공적으로 write한 아이템 수
  • filterCount : ItemProcessor에 의해 필터링된 아이템 수
  • parentSkipCount : 부모 클래스인 StepExecution의 총 skip 수
  • readSkipCount : read에 실패하여 스킵된 횟수
  • writeSkipCount : write에 실패하여 스킵된 횟수
  • processSkipCount : process에 실패하여 스킵된 횟수
  • ExitStatus : 실행결과를 나타내는 클래스로 종료코드를 포함(UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED)
  • stepExecution : StepExecution 객체

 

StepContribution 클래스

public class StepContribution implements Serializable {

    private volatile int readCount = 0;

    private volatile int writeCount = 0;

    private volatile int filterCount = 0;

    private final int parentSkipCount;

    private volatile int readSkipCount;

    private volatile int writeSkipCount;

    private volatile int processSkipCount;

    private ExitStatus exitStatus = ExitStatus.EXECUTING;

    private volatile StepExecution stepExecution;

    ...
}

 

 

StepContribution 실행 흐름

  1. 먼저 TaskletStep이 시작되면 StepExecution 객체를 생성한다.(각 Step마다 생성)
  2. StepExecution이 내부적으로 StepContribution을 생성한다.
  3. 이후 TaskletStep의 기본 구현체인 ChunkOrientedTasklet을 호출한다.
    • Chunk 기반의 프로세스는 ItemReader, ItemProcessor, ItemWriter를 다룬다.
    • ItemReader는 item을 읽고, 스킵한 내용을 기록한 후 ItemProcessor에 넘긴다.
    • ItemProcessor는 ItemReader로부터 전달받은 내용을 가공, 필터링 등의 처리하고 ItemWriter에 넘긴다. (filterCount, processSkipCount 등을 기록한다.)
    • ItemWriter는 ItemProcessor로부터 전달받은 item에 대해 쓰기 작업을 수행한다.(writeCount, writeSkipCount 등을 기록한다.)
  4. 각 ItemReader, ItemProcessor, ItemWriter의 기록한 내용을 수행한 시점마다 StepContribution에 저장된다.
  5. StepContribution은 최종적으로 ItemReader, ItemProcessor, ItemWriter로부터 전달받은 내용과 ExitStatus 등의 값을 StepExecution에 업데이트한다.

 

StepExecution의 apply 메서드

public synchronized void apply(StepContribution contribution) {
    readSkipCount += contribution.getReadSkipCount();
    writeSkipCount += contribution.getWriteSkipCount();
    processSkipCount += contribution.getProcessSkipCount();
    filterCount += contribution.getFilterCount();
    readCount += contribution.getReadCount();
    writeCount += contribution.getWriteCount();
    exitStatus = exitStatus.and(contribution.getExitStatus());
}

Chunk 기반의 Tasklet을 작성하지 않으면 ItemReader, ItemProcessor, ItemWriter 등의 저장 정보는 실행되지 않아 Count 정보가 모두 0인 상태로 저장될 것이다.

반응형