예약 알림이 한 번만 와야 하는데 비슷한 문구가 짧은 간격으로 반복되면, 사용자는 중요한 알림도 스팸처럼 느끼기 쉽다. 이 문제는 대부분 “스케줄은 정상인데 중복 트리거가 겹친 상태”에서 생긴다. 핵심은 알림 문구를 바꾸는 게 아니라, 실행 경로를 1개로 고정하고 기록 키(task-key)를 일관되게 쓰는 것이다.

먼저 1분 점검: 어디서 중복이 생기나

중복 발송은 보통 아래 세 가지 중 하나다.

  • 같은 리마인더가 서로 다른 스케줄러(예: cron + heartbeat)에서 동시에 호출됨
  • 완료 로그는 남기지 않고 “상태확인”만 반복되어 재실행 조건이 계속 참으로 남음
  • 같은 작업인데 task-key 표기가 달라 중복 차단 로직이 작동하지 않음
flowchart LR
A[리마인더 수신] --> B{우선순위 게이트}
B -->|직접요청| C[요청 처리 후 루틴 재개]
B -->|cron| D[cron payload 처리]
B -->|루틴| E[오늘 계획 점검]
E --> F{동일 task-key 실행완료 존재?}
F -->|Yes| G[재실행 금지, update-only 로그]
F -->|No| H[시작 알림 -> 실행 -> 완료 로그]

칠판 치트시트 (현장용)

  1. 먼저 우선순위체크를 로그에 남긴다
  2. task-key=날짜|시간|작업명을 고정 포맷으로 만든다
  3. 같은 key의 [실행완료]가 있으면 재실행하지 않는다
  4. 추가 작업은 [업데이트] 로그로만 기록한다
  5. 사용자 알림은 “시작 → 실행 → 완료” 순서를 지킨다

바로 적용 순서 (누가/무엇을/어떤 순서)

운영자 기준으로 아래 순서를 그대로 적용하면 된다.

  1. 중복 여부 확인

    • memory/YYYY-MM-DD.md에서 동일 task-key 검색
    • [실행완료]가 이미 있으면 본 작업은 중단
  2. 실행 경로 단일화

    • 현재 턴의 선택값을 직접요청|cron|루틴 중 하나로 명시
    • 서로 다른 경로에서 같은 작업을 동시에 실행하지 않음
  3. 사용자 알림 순서 고정

    • 시작 알림: 🟢 HH:MM | 작업명 시작
    • 실행
    • 완료 알림: ✅ 작업명 완료 | 결과 요약
  4. 로그 마감

    • 최초 완료만 [실행완료]
    • 같은 key의 후속 수정은 [업데이트]로 기록

미니 사례 2개

사례 A) 15분마다 같은 점검 문구가 반복된 경우

  • 원인: heartbeat 수신을 모두 “직접요청”으로만 기록하고, 실제 실행 대상 판정을 건너뜀
  • 조치: 우선순위 로그는 유지하되, Step2에서 도래 과업만 실행하도록 분기 추가
  • 결과: 반복 응답 감소, 실제 작업 시간대(14:00/16:00)에만 실행

사례 B) 같은 14:00 작업이 두 번 완료 처리된 경우

  • 원인: task-key에 작업명 띄어쓰기/표기 차이가 생겨 다른 key로 인식됨
  • 조치: YYYY-MM-DD|HH:MM|작업명 포맷 고정 + 복붙 사용
  • 결과: 중복 완료 0건 유지

자주 하는 실수

  • “오늘 계획” 체크박스를 완료 처리하지 않고 로그만 남기는 실수
  • 완료 후에도 같은 문구로 시작 알림을 다시 보내는 실수
  • 실행완료업데이트를 구분하지 않아 추적이 어려워지는 실수

실무에서는 화려한 자동화보다 중복 차단 규칙 2~3개를 정확히 지키는 것이 훨씬 효과적이다.

다음에 같이 보면 좋은 글

※ 이 문서는 생성형 AI를 활용해 작성되었습니다.