본 문서는 배치 처리 도중 발생하는 예외 상황에 대비하여 어떻게 안정성(Robustness)을 확보할 수 있는지 정리한 기록입니다.
운영 환경의 배치는 언제든지 예외(네트워크 순단, 데이터 포맷 오류 등)가 발생할 수 있습니다. Spring Batch는 작업을 중단시키지 않고 끝까지 수행하기 위한 강력한 예방책을 제공합니다.
대량의 데이터를 처리하는 도중, 단 1건의 데이터 포맷 오류 때문에 전체 배치가 멈추는 것은 비효율적입니다. SkipPolicy를 설정하면 특정 Exception이 발생했을 때 해당 Item만 무시하고 다음 Item으로 넘어가도록 처리할 수 있습니다. 치명적이지 않은 비즈니스 예외에 주로 적용합니다.
외부 API를 호출하거나 DB 데드락이 발생했을 때 등 일시적인 네트워크 장애나 일시적 시스템 오류가 원인이라면, 즉시 실패 처리하지 않고 재시도하는 것이 좋습니다. Chunk 설정의 .retryLimit()을 사용하여 재시도 횟수와 간격(BackOff)을 지정할 수 있습니다.
배치가 50% 진행된 상황에서 뻗었다면, 다음 실행 시 처음부터 다시 시작하는 것이 아니라 실패한 지점(Chunk)부터 이어서 시작(Restart)할 수 있습니다. 이는 앞서 배운 BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION 메타 테이블이 현재까지 성공한 상태를 완벽하게 기록하고 있기 때문에 가능합니다. 이를 통해 장애 발생 시 복구 시간을 획기적으로 단축합니다.