자동화 slecs

Discord 알림과 검수 루프를 모듈로 분리해 텔레봇에 붙인 이유

목차

오늘 telebot 쪽에 Discord 연동 두 개 모듈을 새로 붙였다. discord_post.pyreview_loop.py — 이름만 봐도 역할이 나뉘는 구조다.

왜 두 모듈을 따로 뗐나

처음엔 하나의 파일에 다 때려넣을 수도 있었다. 근데 "후고" 와 "상주 루프" 는 라이프사이클 자체가 다르다.

discord_post.py 는 단발성이다. 어떤 작업이 끝난 뒤 결과를 Discord 채널로 쏘는 것, 그게 전부다. 트리거가 오면 한 번 실행되고 종료된다. stateless 에 가깝고, 호출 측에서 필요한 데이터를 다 넘겨줘야 한다.

반면 review_loop.py 는 상주형이다. 뭔가를 지속적으로 감시하거나 폴링하면서 검수 조건이 충족되면 반응하는 구조. 이걸 같은 파일에 넣으면 나중에 두 흐름이 뒤섞이고, 테스트 짜기도 힘들어진다. "단발 알림" 과 "루프 감시" 는 책임이 다르니까 파일도 다르게 가는 게 맞다고 판단했다.

팀에 이 구조를 설명할 때도 이 분리 포인트를 먼저 짚었다. 모듈 이름만 봐도 어디에 뭘 손대야 하는지 직관적으로 보여야 코드리뷰도 빨라지고 온보딩 비용도 낮아진다.

두 모듈이 하는 일

telebot/
├── discord_post.py     # 작업 완료 후 결과 Discord 채널 POST (단발)
└── review_loop.py      # 검수 조건 감시 → 조건 충족 시 반응 (상주)
모듈 실행 방식 상태 주 역할
discord_post.py 이벤트 트리거 후 1회 실행 stateless 작업 결과 후고
review_loop.py 상주 / 폴링 또는 대기 루프 stateful 가능 검수 조건 감시

discord_post.py 쪽은 크게 고민이 없었다. Discord Webhook 이든 Bot API 든 메시지 페이로드 구성하고, 채널 ID 잡아서 쏘면 된다. 중요한 건 실패했을 때 조용히 죽지 않도록 에러를 충분히 올려주는 것. 후고가 안 가면 담당자가 "작업이 끝났는지" 를 모른 채로 넘어갈 수 있으니까.

review_loop.py 는 좀 더 신경 써야 하는 부분이 있다. 루프가 상주하는 구조면 — 예외가 터졌을 때 루프가 죽는지, 아니면 잡고 계속 돌아야 하는지 — 이 판단을 초기에 못 박아둬야 한다. 아무 처리 없이 while True 를 돌리면 처음엔 잘 돌다가 한 번 예외 나면 조용히 멈춰 있다. 그 상태로 아무도 모르고 있으면 최악이다.

# review_loop 에서 흔히 쓰는 방어 패턴 예시
while True:
    try:
        result = fetch_pending_reviews()
        if result:
            handle(result)
    except Exception as e:
        logger.error(f"review_loop error: {e}")
        # 루프 죽이지 않고 계속 — 단 알림은 남긴다
    finally:
        time.sleep(INTERVAL)

루프가 죽었을 때 알림을 따로 보낼지, 아니면 헬스체크 사이드로 붙일지는 운영 상황에 따라 다르다. 지금 단계에서는 일단 로그라도 남기는 걸 최우선으로 잡았다.

자동화 봇을 팀에 붙일 때 항상 생각하는 것

이런 자동화 모듈을 팀 워크플로우에 붙일 때 제일 자주 하는 실수가 있다. "잘 되면 편하겠지" 로 시작해서 알림이 너무 많거나 너무 없거나 둘 중 하나로 끝나는 것. 그래서 나는 항상 이 세 가지를 먼저 정한다:

  • 채널 분리: 후고 알림이랑 에러 알림이 같은 채널에 섞이면 금방 노이즈로 취급된다
  • 알림 빈도 제어: 루프 기반 봇은 중복 알림 방지 로직을 초기부터 박아야 한다
  • 침묵 감지: 루프가 정상적으로 살아있는지 확인하는 수단이 없으면, 죽어 있어도 모른다

이번 두 모듈은 그 첫 번째 레이어다. 기능이 붙을수록 구조가 복잡해지기 전에 책임 단위를 명확히 잡아놓는 게 나중 유지보수 비용을 크게 줄인다.


끝.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.