조용히 죽는 기계를 먼저 아는 법
44·45장의 시나리오 일곱 개가 멈추거나 잘못 보내는 열 가지 이유를 알고, 헬스체크·에러 핸들러·재시도·중복 방지 키·일일 보고로 먼저 알게 만들고, 장애 런북(증상 → 원인 → 조치 → 재발 방지)을 쓰고, 일부러 깨뜨린 시나리오를 고치는 10·11부의 마지막 날.
들어가며 — 자동화의 실패는 소리가 나지 않는다
사람이 하는 일은 실패하면 안다 — 안 올렸으면 안 올린 것을 기억한다. 기계는 조용히 실패한다. 토큰이 만료돼 3주 동안 릴스가 안 올라갔는데 아무도 몰랐다, 세그먼트 조건이 잘못돼 같은 사람에게 D+7 메일이 매일 갔다, 한도가 차서 금요일 발행만 빠졌다. 자동화를 "만드는 것"보다 **"죽은 것을 아는 것"**이 운영이다.
오늘은 세 가지다. (1) 죽는 이유 열 가지를 미리 안다. (2) 죽으면 기계가 먼저 말하게 만든다 — 헬스체크 · 에러 핸들러 · 일일 보고. (3) 죽었을 때 5분 안에 고치는 런북을 쓴다. 그리고 과정(44~46)을 포트폴리오로 닫는다.
1. 조용히 죽는 열 가지 이유
| # | 원인 | 증상 (사람이 보는 것) | 감지 (기계가 보는 것) | 조치 |
|---|---|---|---|---|
| 1 | 토큰 · 인증 만료 (Instagram 60일 · OAuth 갱신 실패) | 발행이 안 됨 · 에러 401 | 헬스체크: 매일 API 호출 1회 → 실패 알림 · 만료 7일 전 알림 | 토큰 재발급 → 속성 교체 (코드 수정 없음) |
| 2 | 한도 초과 (Make ops · API 25/일 · Buffer 10건) | 월말에 멈춤 · 금요일만 빠짐 | ops 사용량 80% 알림 · 429 에러 | 상한 설계(44장) · 플랜 조정 · 큐 지연 |
| 3 | 형식 변경 (AI가 JSON 대신 산문 · 시트 열 이름 바뀜) | 파싱 에러 · 빈 캡션 발행 | JSON 검증 모듈 · 필수 필드 비면 중단 | 프롬프트 [형식] 강화 · 열 이름 고정 · 검수에서 걸림 |
| 4 | 중복 발송 (트리거 두 번 · 재시도가 두 번 보냄) | 같은 메일 둘 · 같은 릴스 둘 | 중복 방지 키(id + 단계) 시트에 기록 → 있으면 건너뜀 | 키 적용 · 재시도는 '보내기 전'까지만 |
| 5 | 시간대 (UTC · KST · 서머타임) | 21시 넘어 문자 발송 · 예약이 9시간 밀림 | 시나리오 시간대 KST 명시 · 발송 전 시간 필터 | 모든 모듈 KST · 필터 이중 |
| 6 | 외부 변경 (API 버전 · 사이트 구조 · 템플릿 반려) | 어제까지 되던 것이 안 됨 | 에러 메시지에 'deprecated' · 템플릿 상태 변경 알림 | 변경 로그 구독 · 월 1회 점검 |
| 7 | 데이터 품질 (주문 행에 날짜 없음 · 이메일 오타) | 세그먼트 0명 · 반송률 급등 | 입력 검증(필수 열 · 형식) · 반송률 5% 알림 | 40장 정제 규칙을 트리거 직후에 |
| 8 | 조건 오류 (D+7이 '매일 7일 이후 전부') | 한 사람에게 매일 발송 | 중복 키 + 수신자당 단계별 1회 규칙 | 조건을 '정확히 7일'로 · 테스트 데이터로 3일 돌려 보기 |
| 9 | 침묵 실패 (에러가 아닌데 결과가 비었다) | 0건 발행 · 0건 수집, 에러 없음 | 기대값 검사 — 금요일엔 발행 ≥ 1, 월요일 리포트엔 행 ≥ 7 | 기대값을 헬스체크에 |
| 10 | 사람 부재 (✅ 누를 사람이 휴가) | 검수 대기에 7일째 | 대기 48시간 초과 알림 → 백업 승인자 | 백업 승인자 · 대기 상한 |
9번이 가장 위험하다. 에러 핸들러는 에러만 잡는다. "아무 일도 안 일어남"은 에러가 아니다. 그래서 헬스체크는 "돌아갔나"가 아니라 **"기대한 결과가 있나"**를 본다.
미니 실습 — 우리 시나리오에 대입 (25분)
시나리오 7개(A~D 숏폼 · 이메일 · 알림톡 · 캘린더) × 열 가지 → 걸리는 칸에 O. 각 시나리오의 기대값(요일 · 건수) 한 줄.
평가 기준: 시나리오마다 기대값이 있는가. 9 · 10번을 빠뜨리지 않았는가.