
로드맵 Phase 4, 디스코드 봇 차례예요. Phase 2에서 만든 코드 리뷰(review.py)와 블로그 QnA(ask.py)를 새로 짜지 않고, 그대로 불러와서 디스코드 슬래시 커맨드로 노출하는 게 오늘의 핵심이었어요.
kodex-discord-bot 폴더를 kodex-code-review-agent와 형제 디렉터리로 두고, sys.path에 에이전트 폴더를 추가해서 review.py / ask.py를 그대로 import 했어요. 코드를 복사하지 않고 함수만 가져다 쓰는 구조라, 나중에 에이전트 쪽 로직이 바뀌면 봇도 자동으로 최신 버전을 쓰게 돼요.
AGENT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "kodex-code-review-agent"))
sys.path.insert(0, AGENT_DIR)
import ask
import review
커맨드는 두 개로 나눴어요.
/review code:<코드> [file:<첨부>] [lang:ko|en] — 코드 리뷰/ask question:<질문> — 벨로그 글 기반 QnAGemini 호출은 몇 초 걸릴 수 있는데, 디스코드는 3초 안에 응답 안 하면 인터랙션이 만료돼요. 그래서 커맨드를 받자마자 interaction.response.defer()로 "생각 중" 표시부터 보내고, 완료되면 followup.send()로 실제 결과를 보내는 방식으로 처리했어요. 결과가 길면(1900자 초과) 메시지 대신 .md 파일로 첨부하게 만들었어요.
Discord Developer Portal에서 애플리케이션과 봇을 만들고 토큰을 발급받았어요. 초대 링크는 OAuth2 URL Generator에서 bot, applications.commands 스코프만 켜고, 권한도 딱 필요한 것만 골랐어요.
관리자 권한 같은 건 전혀 필요 없어서 처음부터 최소 권한으로 초대했어요.
Developer Portal에 로그인하자마자 화면이 통째로 하얗게 크래시됐어요.
NotFoundError: Failed to execute 'removeChild' on 'Node':
The node to be removed is not a child of this node.
우리 봇 코드 문제인가 싶어서 잠깐 당황했는데, 스택 트레이스를 보니 discord.com 자체의 프론트엔드 리액트 코드에서 난 에러였어요. 디스코드 웹 클라이언트의 렌더링 버그였던 거예요. 새로고침 몇 번, 시크릿 창으로 다시 열기로 해결됐어요 — 우리 프로젝트와는 무관한 이슈였다는 게 확인되니 그제서야 안심.
pip install -r requirements.txt
python bot.py
터미널에 로그인 성공 메시지가 뜨고 나서, 실제 서버에서 두 커맨드를 다 테스트했어요.
/ask "..."로 질문하니 벨로그 Day1, Day2 글 중 관련도 높은 조각을 찾아서, 그 내용을 근거로 답하고 출처 링크까지 붙여줬어요. RAG 파이프라인이 실서비스 환경에서도 그대로 작동한다는 걸 확인한 순간이었어요.
/review는 일부러 버그를 심은 함수로 테스트했어요.
def get_average(numbers):
total = 0
for n in numbers:
total = n # total += n 이어야 함
return total / len(numbers)
def find_max(numbers):
max_value = 0 # 음수만 있으면 잘못된 결과
for n in numbers:
if n > max_value:
max_value = n
return max_value
숨겨둔 버그 2개(누적 오류, 음수 최댓값 오류)는 물론이고, 제가 언급하지 않은 ZeroDivisionError 위험까지 잡아냈고, sum() / max()를 활용한 개선 코드까지 제안해줬어요.
Phase 4의 핵심(에이전트 ↔ 디스코드 연결)이 끝났어요. 새 로직을 하나도 안 짜고, 기존 에이전트를 그대로 재사용해서 인터페이스만 하나 추가한 게 이번 작업의 포인트예요.
로드맵 Phase 4 마무리 단계예요. usage.py로 이미 집계하고 있는 API 호출 수를 활용해서 사용량 제한을 걸고, 필요하면 포트폴리오 사이트의 챗 위젯에도 같은 제한 로직을 적용할 예정이에요.