← 전체 글로 돌아가기

웹 개발

배치 작업에서 입력 값이 예상과 다를 때

정기적으로 실행되는 배치 작업이 데이터를 잘못 처리하거나, 특정 조건에서만 실패할 때 원인을 찾는 방법을 정리했다.

매일 자정에 실행되는 배치 작업이 있다. 대부분의 날에는 정상인데, 어떤 날은 데이터를 잘못 처리한다. 뭐가 다를까?

배치 작업은 일정 시간에 자동으로 실행되므로, 실제로 무엇이 들어갔고 뭐가 나왔는지 모르기 쉽다. 로그를 남기는 습관이 중요하다.

배치 작업의 입력 로그

배치 작업이 실행될 때마다:

  1. 시작 시간
  2. 처리할 데이터의 개수
  3. 처리 결과 (성공/실패)
  4. 끝난 시간과 소요 시간

이걸 모두 로그로 남긴다.

# 배치 작업 실행
2024-01-15 00:00:01 [BATCH_START] daily-report
2024-01-15 00:00:02 [INFO] Processing 1500 items
2024-01-15 00:05:30 [INFO] Processed 1500 items, 1498 succeeded, 2 failed
2024-01-15 00:05:31 [BATCH_END] duration=330s

이 로그를 보면, 처리 개수나 실패율이 변하는 패턴을 찾을 수 있다.

날짜와 시간대에 따른 변화

배치가 자정에 실행된다면, 그 시각에 특별한 일이 일어나는가?

  • 월요일 vs 다른 요일
  • 월 초 vs 월 말
  • 특정 주기 (매달 15일 등)

Cron 표현식을 다시 확인한다:

# 매일 자정 실행
0 0 * * * /path/to/batch.sh

# 매주 월요일 자정 실행
0 0 * * 1 /path/to/batch.sh

# 실제 실행 기록 확인
sudo grep CRON /var/log/syslog | tail -20

입력 데이터의 구성

배치가 처리하는 데이터가 정말 예상대로 들어가는가?

# 배치가 처리할 데이터 확인
SELECT COUNT(*) FROM items WHERE status='pending' AND created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);
# 로컬: 50개
# 운영: 5000개
# -> 데이터량이 다르면 처리 로직도 다르게 작동할 수 있다

특히 배치가 시간 범위를 쿼리한다면, 타임존이 일치하는가?

환경 변수 확인

Cron 환경은 일반 쉘과 다를 수 있다.

# Cron에서 사용하는 환경 변수
env | sort > /tmp/cron-env.txt

# 일반 쉘과 비교
env | sort > /tmp/shell-env.txt

diff /tmp/shell-env.txt /tmp/cron-env.txt

PATH, HOME, USER 등이 다를 수 있고, 이로 인해 스크립트가 다르게 작동할 수 있다.

수동 실행 vs 자동 실행

# 수동으로 배치 실행
/path/to/batch.sh

# 또는
cd /path/to && npm run batch

수동 실행 시에는 성공하는데 Cron에서는 실패한다면, 환경 차이가 있다는 뜻이다.

실제 확인 순서

  1. 배치 작업에 상세한 로그 추가 (입력 개수, 처리 결과, 시간)
  2. 배치 로그를 저장해서 패턴 분석 (날짜별, 요일별)
  3. 데이터량이 달라지는지 확인
  4. 수동 실행과 Cron 실행 비교
  5. 필요하면 Cron 스케줄 조정 (예: 피크 시간 피하기)

마지막으로, 배치 작업이 실패해도 누구도 알 수 없다면 가장 위험하다. 반드시 실패 시 알림이 가야 한다. 메일, Slack, 또는 모니터링 대시보드 등으로 즉시 알 수 있어야 한다.