Spring Batch ‐ 스프링 배치 반복 및 오류 제어 처리 - dnwls16071/Backend_Summary GitHub Wiki

📚 Repeat

  • Spring Batch는 얼마나 작업을 반복해야하는지 알려줄 수 있는 기능을 제공한다.
  • 특정 조건이 충족될 때까지 Job 또는 Step을 반복하도록 배치 애플리케이션을 구성할 수 있다,
  • 스프링 배치에서는 Step의 반복과 Chunk 반복을 RepeatOperation을 사용해서 처리한다.
  • 기본 구현체로 RepeatTemplate를 제공한다.

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

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

📚 FaultTolerant

  • 스프링 배치는 Job 실행 중에 오류가 발생할 경우 장애를 처리하기 위한 기능을 제공하며 이를 통해 복원력을 향상시킬 수 있다.
  • 오류가 발생해도 즉시 Step이 종료되지않으며 Retry 혹은 Skip 기능을 활성화함으로써 내결함성 서비스가 가능하도록 한다.
  • 프로그램 내결함성을 위해 Skip과 Retry 기능을 제공한다.

📚 Skip

  • Skip은 데이터를 처리하는 동안 설정된 Exception이 발생했을 경우, 해당 데이터 처리를 건너뛰는 기능이다.
  • 데이터의 사소한 오류에 대해 Step의 실패처리 대신 Skip을 함으로써, 배치 수행의 빈번한 실패를 줄일 수 있게 된다.
  • ItemReader는 예외가 발생하면 해당 아이템은 스킵하고 계속 진행한다.
  • ItemProcessor와 ItemWriter는 예외가 발생하면 Chunk의 처음으로 돌아가서 스킵된 아이템을 제외한 나머지 아이템들을 가지고 처리하게 된다.

  • Skip 기능은 내부적으로 SkipPolicy를 통해서 구현되어 있다.
  • Skip 가능 여부를 판별하는 기준
    • 스킵 대상에 포함된 예외인지 여부
    • 스킵 카운터를 초과했는지 여부

[SkipPolicy]

  • Skip 정책에 따라 아이템의 Skip 여부를 판단하는 클래스
  • 스프링 배치가 기본적으로 제공하는 SkipPolicy 구현체 클래스가 있으며 직접 생성해서 사용 가능하다. 내부적으로 Classifier 클래스들을 활용한다.

📚 Retry

  • Retry는 ItemProcessor, ItemWriter에서 설정된 Exception이 발생할 경우 지정한 정책에 따라 데이터 처리를 재시도하는 기능이다.
  • Skip과 마찬가지로 Retry를 함으로써 배치 수행의 빈번한 실패를 줄일 수 있게 한다.
  • Retry 기능은 RetryPolicy를 통해 구현되어있다.
  • Retry 기능 여부를 판별하는 기준
    • 재시도 대상에 포함된 예외인가?
    • 재시도 카운터를 초과했는가?

[RetryPolicy]

  • 재시도 정책에 따라 아이템의 retry 여부를 판단하는 클래스
  • 기본적으로 제공하는 RetryPolicy 구현체들이 있으며 필요한 경우 직접 생성해서 사용할 수 있다.
  • RetryPolicy와 BackOffPolicy를 사용해서 재시도 정책을 설정한다.
  • BackOffPolicy
    • 다시 재시도하기까지 지연 시간을 설정
    • 처리시간이 긴 데이터가 있을 경우 BackOffPolicy로 재시도 시간 간격을 조정할 수 있다.
  • RetryCallback과 RecoveryCallback을 호출해서 재시도 로직을 수행한다.

📚 Skip & Retry 아키텍처

[ItemReader에서의 아키텍처]

[ItemProcessor에서의 아키텍처]

[ItemWriter에서의 아키텍처]