Discord 봇 개발 회고: 문제 공지 메시지 자동화하기

soleil_lucy·2025년 5월 10일
3
post-thumbnail

프로젝트 개요

프로젝트 이름

study assistant

study-assistant라는 봇의 이름은 assistant보조원이라는 뜻을 가지고 있어, 스터디 참여자들을 대신해 문제를 공지하는 등 스터디를 보조하는 역할을 반영합니다. 이 봇은 현재로서는 문제 공지 기능만 구현되어 있지만, 앞으로 더 다양한 역할을 맡을 수 있다는 기대감을 담아 assistant라는 단어를 사용하여 study-assistant라고 명명했습니다.

목적

디스코드 봇을 사용하여 스터디 운영에 도움이 되고자 합니다.

시작 동기

현재 알고리즘 스터디를 디스코드에서 운영 중입니다. 매주 모임 후, 다음 주까지 풀어야 할 문제 공지를 수동으로 작성하는 데 약 5분이 걸렸습니다. 다른 서버에서 디스코드 봇을 이용해 출석 체크나 자동 응답을 하는 것을 보고, 간단한 슬래시 명령어로 이 작업을 자동화하면 어떨까 생각했습니다. 그래서 이러한 수작업을 줄이기 위한 디스코드 봇 개발을 결정하게 되었습니다.

실제 알고리즘 스터디에 문제를 공지한 메시지

목표 설정

프로젝트 목표

알고리즘 스터디 구성원이 매주 풀어야 할 문제 목록을 정리하여 메시지로 작성하는 작업을 디스코드 봇 study-assistant가 대신 수행하도록 합니다.

해결하고자 했던 문제

기존에 사람이 수동으로 문제 목록을 작성하던 것을 자동화하여, 이 작업에 소요되는 시간을 절약하고자 합니다.

주요 요구사항

  1. 사용자가 알고리즘 스터디 서버의 디스코드 채널에서 /문제공지라는 슬래시 명령어를 입력하면, 봇이 이를 감지하여 문제 목록이 포함된 메시지를 채널로 전송합니다.
  2. 봇은 Google Sheets에 작성된 문제 중, 다음주까지 풀어야할 문제를 선별하여 공지합니다.
  3. 봇은 클라우드 환경에 배포되어, 로컬 환경에서 Bot 서버를 따로 실행하지 않아도 항상 작동 가능하도록 구현합니다.

기술 스택

사용 언어

  • JavaScript
    초기에는 TypeScript를 사용하려 했지만, discord.js의 공식 Type 정의를 찾기 어려워 JavaScript로 전환했습니다. discord.js 공식 문서에 나온 JavaScript 예제를 보고 라이브러리를 학습했기 때문에 우선은 JavaScript를 선택하여 개발하였습니다.

라이브러리

  • discord.js
    Node.js 환경에서 가장 널리 사용되는 디스코드 봇 라이브러리입니다. 커뮤니티가 크기 때문에, 오류가 발생했을 때 쉽게 도움을 받을 수 있겠다는 생각이 들어 선택했습니다.

    discord.js vs discraft | npmtrends

  • googleapis
    Google Sheets API를 사용하기 위한 라이브러리입니다.

런타임 환경

  • Bun
    Node.js보다 빠른 런타임으로 소개되어, 사용해보고 싶어 선택했습니다.

형상 관리

  • Git
    프로젝트의 버전 관리를 위해 사용하며, 모든 코드 변경 사항을 추적할 수 있습니다.

  • GitHub
    코드 저장소로 사용되어, 협업과 코드 리뷰를 효율적으로 수행합니다.

  • Sourcetree
    Git의 GUI 클라이언트로, 복잡한 Git 명령어를 쉽게 처리하고 시각적으로 이해할 수 있도록 돕습니다.

배포

  • Koyeb
  • Docker
    초기에는 GitHub Actions를 사용하여 배포를 시도했으나, Bot 서버의 특성상 대기 상태에서 진행되지 않는 문제가 있었습니다. 다른 개발자가 Koyeb과 Docker를 사용하여 성공적으로 배포하는 것을 확인하고, 이를 통해 안정적이고 지속적인 배포 환경을 구축하기로 결정했습니다.

코드 품질 및 정리

  • ESLint
  • Prettier
    코드 품질 관리와 일관성 있는 포맷을 위해, 익숙하고 널리 사용되는 도구들을 활용했습니다.

개발 과정

아키텍처

디스코드 서버에서 사용자에게 명령어를 입력하면, 이는 Koyeb에 배포된 Docker 컨테이너에서 실행 중인 봇으로 전달됩니다. Google Sheets API를 통해 필요한 데이터를 가져와 사용자에게 전달합니다.

진행 과정

1️⃣ 초기 개발 환경 설정

  • Bun 설치: 프로젝트를 시작하기 위해 Bun으로 초기 환경을 구성했습니다.
  • 라이브러리 추가: discord.js와 googleapis 등의 필수 라이브러리를 설치했습니다.
  • 디스코드 봇 설정: 디스코드 개발자 포털에서 봇을 생성하고, 테스트용 서버에 추가했습니다.
  • 버전 관리: Git을 사용하여 버전 관리 저장소를 초기화했습니다.

2️⃣ 기능 구현

  • 슬래시 명령어 구현(/문제공지): discord.js를 이용하여 슬래시 명령어를 처리할 수 있는 기본 기능을 추가했습니다.
  • 공지할 문제 데이터 가져오기: googleapis를 통해 Google Sheets에서 데이터를 가져오는 기능을 구현했습니다.

3️⃣ 테스트 및 디버깅

  • 로컬 환경에서 봇을 실행한 후, 수동 테스트를 통해 발견한 오류를 수정했습니다.

4️⃣ 배포

  • Koyeb과 Docker를 사용하여 클라우드 환경에 디스코드 봇을 배포했습니다.

트러블 슈팅

Discord Bot은 어떻게 배포할까?

디스코드 봇을 로컬 환경이 아닌 온라인에서 지속적으로 실행하기 위해 배포를 고민하게 되었습니다. 알고리즘 스터디원들과 함께 사용하기 위해 로컬 환경에만 두는 것은 부적절하다고 판단했기 때문입니다.

디스코드 봇을 배포 문제 해결 과정:

  • 배포 방법 탐색
    • 기존에 Vercel에 웹 애플리케이션만 배포했던 경험밖에 없어, 디스코드 봇 배포에 대한 개념이 부족하다 생각해 다른 사람들은 어떻게 했는지 조사했습니다. “How to deploy my Discord bot for free"와 같은 키워드로 배포 방법을 검색했습니다.
  • 방법 선택
    • 여러 자료를 검토한 후, 저와 동일하게 discord.js를 사용하고 Koyeb 이라는 무료 호스팅 서비스를 사용하여 봇을 배포한 한국의 한 개발자가 작성한 블로그 글을 참고하기로 했습니다. 참고 자료 보러가기
  • 결과
    • Koyeb을 통해 성공적으로 배포했습니다.

결과

study-assistant 깃허브 리포지토리 보러가기

study-assistant라는 디스코드 봇을 개발하고, Koyeb 플랫폼을 통해 무료로 배포했습니다.

주요 기능

문제 공지: 사용자가 /문제공지 슬래시 명령어를 입력하면, 봇은 다음 주에 풀어야 할 문제 목록을 자동으로 메시지로 공지합니다.

학습과 느낀 점

이번 주는 알고리즘 스터디 방학 기간이어서, 알고리즘 문제를 푸는 대신 스터디를 도와줄 디스코드 봇을 만들기로 했습니다. 갑작스럽게 시작한 프로젝트였기 때문에, 필요한 기능만 간단히 구현하여 배포하기로 했습니다. 코드 퀄리티나 테스트 코드는 고려하지 않고 빠르게 작업했지만, 완성된 결과물을 보니 뿌듯했습니다.

아직 디스코드 채널에 봇을 설치하지 않았지만, 다음 문제 공지는 이 봇을 통해 할 수 있을 것 같아 기대됩니다. 덕분에 문제 사이트에 일일이 들어가서 정보를 가져올 필요가 없게 되어 작업이 훨씬 편리해질 것 같습니다.

이번 프로젝트를 통해 배운 것은 다음과 같습니다:

  • discord.js 를 사용하여 디스코드 봇 만들기
  • Dockerfile 로 도커 이미지 생성 과정을 자동화하기
  • Koyeb을 사용하여 배포하기

향후 계획

이번에는 Discord 봇을 만드는 것이 목표였기 때문에 코드의 퀄리티에 크게 신경 쓰지 않았습니다. 현재 GitHub 리포지토리에 있는 코드를 보면, googleapi 라이브러리를 사용할 때 필요한 인증 정보를 별도의 모듈로 분리하지 않고 주요 기능이 구현된 코드와 동일한 파일에 정의되어 있습니다. 이를 모듈로 분리하는 등 읽기 쉬운 코드로 정리하고 싶습니다.

또한, 단위 테스트 코드를 작성하고자 합니다. 이번 프로젝트부터 테스트 코드 작성하는 습관을 기르고 싶기도 하고 코드 이해를 도와준다고 생각하여 작성해보려 합니다.

코드 정리가 완료되면, 기존의 JavaScript 코드를 TypeScript로 변환하려고 합니다. TypeScript는 강력한 타입 검사 기능을 제공하여, 코드 작성 시 타입 관련 오류를 조기에 발견하고 버그를 줄이는 데 도움을 줍니다. 그래서 JavaScript를 TypeScript로 전환하고자 합니다.

참고 자료

profile
여행과 책을 좋아하는 개발자입니다.

0개의 댓글