자동화 봇 브로드캐스트의 깨진 URL을 ID 기반으로 수정
목차
money-bot이 보내는 broadcast 메시지의 URL을 레거시 형식 /{slug}/에서 새로운 형식 /p/{id}/로 변경했다. 작은 것 같지만 자동화 시스템의 신뢰성을 크게 좌우하는 변경이었다.
왜 이 fix가 필요했나
자동화된 bot이 사용자들에게 메시지를 보낼 때, 그 안에 URL을 포함한다. 사용자가 그 링크를 클릭하면 의도한 페이지로 가야 한다. 당연해 보이지만, URL 형식이 시스템 아키텍처 변화를 따라가지 못하면 깨진 링크 지옥에 빠진다.
이 경우, 시스템이 slug 기반 라우팅에서 ID 기반 라우팅으로 전환되었는데, bot이 여전히 레거시 형식으로 URL을 생성하고 있었다. 즉:
- 새 시스템은 /p/{id}/ 형식의 엔드포인트만 지원
- 하지만 bot의 broadcast는 여전히 /{slug}/ 형식으로 URL 생성
- 사용자 수백 명에게 매일 깨진 링크 전달
이건 사용자 경험뿐 아니라 추적 가능성(trackability), 서비스 신뢰도, 심지어 재정 영향까지 미친다.
slug vs ID: 왜 ID 기반이 나은가
처음엔 slug를 쓰는 게 사람 친화적으로 보인다.
| 관점 | slug 기반 | ID 기반 |
|---|---|---|
| 가독성 | /{my-event-title}/ 직관적 |
/p/12345/ 덜 직관적 |
| 변경가능성 | 제목 변경 시 URL 깨짐 | ID는 불변식 |
| 동시성 | 같은 이름의 여러 항목 처리 복잡 | 항상 유일한 식별자 |
| 자동화 안정성 | 의존 문자열 처리, 에러 위험 높음 | 단순 정수 처리 |
자동화 시스템, 특히 bot이 생성하는 링크는 수년 후에도 유효해야 한다. slug는 비즈니스 로직에 따라 변경될 수 있지만, ID는 처음 생성된 순간 영원한 식별자다. 따라서 broadcast 같은 장기 저장/전송 메커니즘에서는 ID를 쓰는 게 철칙이다.
money/generate.py에서 뭘 바꿨나
broadcast 메시지를 생성하는 로직이 있을 텐데, 여기서 URL을 조립하는 부분이 있다:
# Before: slug 기반
def generate_broadcast_url(item):
return f"/{item['slug']}/"
# After: ID 기반
def generate_broadcast_url(item):
return f"/p/{item['id']}/"
작은 변경처럼 보이지만, 이 함수가 매일 수백 수천 번 호출되고, 그 결과가 영구 기록(메시지 큐, 로그, 사용자 알림)으로 남는다. 따라서 한 번 고치면 앞으로의 모든 broadcast가 정상이 된다.
팀 관점에서의 의미
이런 fix는 흔히 세 가지 패턴 중 하나다:
- 기술 부채 상환: 시스템이 refactor됐는데, 의존 코드를 깜빡한 경우
- 사용자 버그 보고: "링크가 자꾸 깨져요"라는 신고가 들어온 후
- 자동화 감사: 배포 전 QA가 잡아낸 경우
어느 쪽이든, 자동화된 시스템은 사람의 손이 덜 갈수록 좋다. broadcast가 매일 자동으로 돈다면, 그 안의 URL 생성 로직이 한 번 깨지면 수개월 동안 사용자들이 깨진 링크를 받는다. 그래서 이런 부분은 deployment 후가 아니라 설계 단계부터 점검하는 게 중요하다.
앞으로 비슷한 자동화 시스템을 만들 때는:
- bot이 생성하는 모든 URL을 /{id}/ 형식으로 통일
- slug는 SEO나 UI에서만 쓰고, 자동화 로직에선 제외
- 배포 전 broadcast 메시지의 URL 형식이 현재 라우팅과 일치하는지 테스트
끝.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.