PSD( Private-Self-Development )

Spring Batch 반복 및 오류 제어 본문

Backend/Spring Batch

Spring Batch 반복 및 오류 제어

chjysm 2023. 4. 17. 16:11

1.  Repeat

  • 특정 조건이 충족 혹은 충족 전까지 Job 또는 Step 을 반복하도록 구성 가능 하다.
  • 스프링 배치에서는 Step, Chunk 반복을 RepeatOperation을 사용하여 처리하고 있다.
  • 기본 구현체로 RepeatTemplate를 제공한다.

 

반복을 종료할 것인지 여부를 결정하는 세 가지 항목 

  • RepeatStatus 
    • 처리가 끝났는지 판별하기 위한 열거형(Enum)
      • CONTINUALBE : 작업이 남아 있음
      • FINISHED : 더 이상의 반복 없음
  • CompletionPolicy 
    • RepeatTemplateiterate 메서드 안에서 반복 중단을 결정한다.
    • 실행 횟수 혹은 완료시기, 오류 발생 시 수행할 작업에 대한 반복 여부 결정 
    • 정상 종료를 알리는데 사용된다.
  • ExceptionHandler 
    • RepeatCallback 안에서 예외가 발생하면  RepeatTemplate ExceptionHandler를 참조하여 예외를 다시 던질지 결정한다.
    • 예외를 받아서 다시 던지게 되면 반복 종료
    • 비정상 종료를 알리는데 사용된다.

 

2.  FaultTolerant

  • Job 실행중 오류가 발생한 경우, 장애 처리를 위한 기능을 제공한다. 이를 통해 복원력을 향상시킬 수 있다.
  • Retry 혹은 Skip 기능을 활성화 하여 내결함성을 가진 서비스를 구현 가능하도록 해준다.
    • Skip
      • itemReader / ItemProcessor / ItemWriter 에 적용 가능
    • Retry 
      • temProcessor / ItemWriter 에 적용 가능
  • FaultTolerant 구조는 청크 기반
내결함성?
작업 진행 도중 에러가 발생하여도 
다른 작업은 정상 진행 되도록 하는 성질 
결함에 대한 내성

 

3.  Skip

  • 작업 실행 중 설정된 Exception 이 발생한 경우, 해당 데이터 처리를 건너뛰는 기능
  • 데이터의 사소한 오류에 대한 Step 실패 가 아닌 Skip 처리 함으로 써, 배치 수행의 빈번한 실패를 줄일 수 있게 한다.
  • Chunk Process 중간에 skip 된 경우, 다시 해당 Chunk 구간의 처음으로 돌아간 후 skip 된 내용은 제외하고 진행된다.
  • Skip 기능은 내부적으로 SkipPolicy 를 통해서 구현되어 있다.
    • SkipPolicy
      • AlwaysSkipItemSkipPolicy : 항상 skip
      • ExceptionClassifierSkipPolicy : 예외 대상을 분류하여 skip 여부 결정 
      • CompositeSkipPolicy : 여러 SkipPolicy 를 탐색하면서 skip 여부 결정 
      • LimitCheckingItemSkipPolicy(기본값) : Skip 카운터 및 예외 등록 결과에 따라 skip 여부 결정 
      • NeverSkipItemSkipPolicy : skip 을 하지 않는다.

예시

public Step step() {
    return stepBuilderFactory.get("step")
            .<I, O>chunk(10)
            .reader(ItemReader)
            .writer(ItemWriter)
            .falutTolerant()
            .skip(Class<? extends Throwable> type)  // 예외 발생 시 Skip 처리 할 Exception 타입 설정
            .skipLimit(int skipLimit)               // Skip 처리 한도 횟수 설정
            .skipPolicy(SkipPolicy skipPolicy)      // Skip 정책 설정
            .noSkip(Class<? extends Throwable> type)// 예외 발생 시 Skip 처리 하지 않을 Exception 타입 설정
            .build();
}

 

4.  Retry

  • 작업 실행 중(ItemReader 제외) 설정된 Exception 이 발생한 경우, 데이터 처리를 재시도 하는 기능 
  • Skip과 동일하게(대부분 동일 해당 상황에서의 처리가 다를 뿐) 배치 수행의 빈번한 실패를 줄일 수 있게 한다.
  • RetryPolicy
    • AlwaysRetryPolicy : 항상 재시도 
    • ExceptionClassifierRetryPolicy : 예외 대상을 분류하여 재시도 여부 결정 
    • CompositeRetryPolicy : 여러 RetryPolicy 를 탐색하면서 재시도 여부 결정 
    • SimpleRetryPolicy(기본값) : 재시도 카운터 및 예외 등록 결과에 따라 재시도 여부 결정 
    • MaxAttemptsRetryPolicy : 재시도 횟수에 따라 재시도 여부 결정 
    • TimeoutRetryPolicy : 주어진 시간동안 재시도 
    • NeverRetryPolicy : 최초 한번만 허용 
  • BackOffPolicy 
    • 다시 재시도 하기까지의 지연시간 설정 
    • 처리 시간이 긴 데이터가 있을 경우, BackOffPolicy 로 재시도 시간 간격을 조정하자.

 

예시

public Step step() {
    return stepBuilderFactory.get("step")
            .<I, O>chunk(10)
            .reader(ItemReader)
            .writer(ItemWriter)
            .falutTolerant()
            .retry(Class<? extends Throwable> type)                     // 예외 발생 시 retry 할 에외 타입 설정 
            .retryLimit(int skipLimit)                                  // retry 제한 횟수 설정 
            .retryPolicy(SkipPolicy skipPolicy)                         // retry 정책 설정 
            .noRetry(Class<? extends Throwable> type)                   // 예외 발생 시 retry 하지 않을 에외 타입 설정 
            .backOffPolicy(BackOffPolicy backOffPolicy)                 // 다시 retry 하기 까지의 시간 설정 
            .noRollback(Class<? extends Throwable> type)                // 예외 발생 시 rollback 하지않을 예외 타입 설정 
            .build();
}

 


참조

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard