1. Skip Logic이란?
- Spring Batch에서 Skip Logic은 step 처리 중 발생하는 예외를 처리하여 전체 step의 실패를 방지하는 중요한 기능입니다.
- 데이터 처리 과정에서 일부 레코드에 문제가 있더라도 전체 step 작업을 중단하지 않고 해당 레코드만 건너뛰고 계속 진행할 수 있게 해줍니다.
- 백만 건의 레코드 중 한두 건만 건너뛴다면 대수롭지 않을 수도 있습니다. 허나 백만 건 중 50만건을 건너뛴다면 뭔가 잘못된 것입니다.
- 기준을 정하는 것은 개발자의 몫입니다.
정보
Skip Logic은 데이터의 성격과 비즈니스 요구사항에 따라 신중하게 결정해야 합니다. 금융 데이터처럼 정확성이 중요한 경우에는 스킵을 허용하지 않는 것이 좋지만, 벤더 목록 같은 데이터에서는 일부 잘못된 형식의 레코드를 건너뛰는 것이 적절할 수 있습니다.
2. 기본 Skip 설정
2.1 Skip Limit 설정
- Spring Batch에서 Skip Logic을 사용하려면 먼저
faultTolerant()
를 활성화하고skipLimit()
를 설정해야 합니다. - 만약
skipLimit()
의 인자를 설정하지 않으면 기본값은 10입니다. 즉, 최대 10번의 예외 발생을 허용합니다.
기본 Skip 설정 예시
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(flatFileItemReader())
.writer(itemWriter())
.faultTolerant()
.skipLimit(10)
.skip(FlatFileParseException.class)
.build();
}
- 이 설정에서는
FlatFileParseException
이 발생할 때마다 해당 아이템을 건너뛰며, 최대 10개까지 스킵을 허용합니다.
2.2 Skip Limit의 동작 방식
경고
skipLimit에 도달하면 다음 예외가 발생할 때 Step이 실패합니다. 즉, 11번째 스킵할 예외가 발생하면 Step이 중단됩니다.
- Skip 카운트는 읽기(read), 처리(process), 쓰기(write) 단계별로 별도로 집계됩니다.
- 하지만 제한은 모든 스킵에 대해 전체적으로 적용됩니다
- 즉 읽기 단계에서 5개, 처리 단계에서 3개, 쓰기 단계에서 2개가 스킵되었다면 총 10개로 계산됩니다.
skipLimit()
을 명시적으로 설정하지 않으면 기본값은 10입니다