AI 에이전트가 디스코드에서도 답한다 (Day 10)

도로의 이것저것·2026년 8월 3일

AI에이전트

목록 보기
10/15

로드맵 Phase 4, 디스코드 봇 차례예요. Phase 2에서 만든 코드 리뷰(review.py)와 블로그 QnA(ask.py)를 새로 짜지 않고, 그대로 불러와서 디스코드 슬래시 커맨드로 노출하는 게 오늘의 핵심이었어요.

1. 로직은 그대로, 인터페이스만 하나 더

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:<질문> — 벨로그 글 기반 QnA

Gemini 호출은 몇 초 걸릴 수 있는데, 디스코드는 3초 안에 응답 안 하면 인터랙션이 만료돼요. 그래서 커맨드를 받자마자 interaction.response.defer()로 "생각 중" 표시부터 보내고, 완료되면 followup.send()로 실제 결과를 보내는 방식으로 처리했어요. 결과가 길면(1900자 초과) 메시지 대신 .md 파일로 첨부하게 만들었어요.

2. 디스코드 봇 생성

Discord Developer Portal에서 애플리케이션과 봇을 만들고 토큰을 발급받았어요. 초대 링크는 OAuth2 URL Generator에서 bot, applications.commands 스코프만 켜고, 권한도 딱 필요한 것만 골랐어요.

  • 메시지 보내기
  • 파일 첨부
  • 빗금 명령어 사용 (슬래시 커맨드)

관리자 권한 같은 건 전혀 필요 없어서 처음부터 최소 권한으로 초대했어요.

3. 오늘의 삽질

Developer Portal에 로그인하자마자 화면이 통째로 하얗게 크래시됐어요.

NotFoundError: Failed to execute 'removeChild' on 'Node':
The node to be removed is not a child of this node.

우리 봇 코드 문제인가 싶어서 잠깐 당황했는데, 스택 트레이스를 보니 discord.com 자체의 프론트엔드 리액트 코드에서 난 에러였어요. 디스코드 웹 클라이언트의 렌더링 버그였던 거예요. 새로고침 몇 번, 시크릿 창으로 다시 열기로 해결됐어요 — 우리 프로젝트와는 무관한 이슈였다는 게 확인되니 그제서야 안심.

4. 로컬 실행 & 실전 테스트

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 호출 수를 활용해서 사용량 제한을 걸고, 필요하면 포트폴리오 사이트의 챗 위젯에도 같은 제한 로직을 적용할 예정이에요.

profile
AI 서비스 기획•개발자 취업 준비생 입니다

0개의 댓글