가이드 / Spring Batch
Spring Batch 실패를 디스코드·슬랙으로
알림 받는 가장 쉬운 방법
Spring Batch에는 두 종류의 사고가 있습니다. 잡이 돌다가 실패하는 것, 그리고 더 무서운 — 잡이 아예 실행조차 안 되는 것. 스케줄러 설정이 꼬였거나, 배포가 잘못됐거나, 서버가 내려가 있으면 로그조차 남지 않습니다. 로그가 없으니 로그 기반 알림도 무용지물이죠.
하트비트 방식은 이 두 경우를 모두 잡습니다: 잡이 성공할 때마다 신호를 보내고, 신호가 제때 안 오면 알림을 받는 겁니다. 실행이 안 됐어도(신호 없음), 실패했어도(신호 없음) 알림이 옵니다.
1. 모니터 만들기
BatchWatch 무료 가입후 모니터를 만들고(예: “일일 정산”, 매일 오전 3시, 허용 지연 20분) Ping URL을 받습니다.
2. JobExecutionListener 등록
잡 성공 시 ping을 보내는 리스너를 하나 만듭니다:
@Component
public class BatchWatchListener implements JobExecutionListener {
private static final String PING_URL =
"https://batch.hkch.co.kr/p/YOUR_TOKEN";
private final RestClient restClient = RestClient.create();
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
restClient.get().uri(PING_URL).retrieve().toBodilessEntity();
} else {
// 실패를 즉시 보고 (허용 지연을 기다리지 않음)
restClient.get().uri(PING_URL + "/fail").retrieve().toBodilessEntity();
}
}
}잡 설정에 리스너를 연결합니다:
@Bean
public Job dailySettlementJob(JobRepository jobRepository,
Step settlementStep,
BatchWatchListener batchWatchListener) {
return new JobBuilder("dailySettlementJob", jobRepository)
.listener(batchWatchListener)
.start(settlementStep)
.build();
}3. 끝 — 이제 이런 알림이 옵니다
🔴 [BatchWatch] 일일 정산
작업이 실패(fail ping)를 보고했습니다.
마지막 정상 실행: 2026-08-03 03:07
🟢 [BatchWatch] 일일 정산
정상 상태로 복구되었습니다. (장애 시간: 약 42분)핵심은 스케줄러가 안 돌아도 알림이 온다는 점입니다. @Scheduled가 죽었든, 쿠버네티스 크론잡이 안 떴든, 서버가 통째로 내려갔든 — 신호가 안 오면 BatchWatch가 예정 시각 + 허용 지연 후에 알려줍니다. APM이나 로그 수집기 없이, 의존성 추가 없이 HTTP 한 번으로요.
수행 시간까지 재고 싶다면
beforeJob에서 /start를 호출하면 시작~완료 수행 시간이 기록되고, 대시보드에서 실행 이력을 한눈에 볼 수 있습니다:
@Override
public void beforeJob(JobExecution jobExecution) {
restClient.get().uri(PING_URL + "/start").retrieve().toBodilessEntity();
}배치 3개까지 무료로 감시하세요
무료로 시작하기 →