같이 만들기

2026년 5월 23일·5개 메시지

친구와 함께 디스코드 봇을 개발하고 배포할 때 생기는 실무적 문제와 이를 예방·해결하는 방법을 정리했다. GitHub을 이용한 협업 워크플로우, 비밀 정보 관리, CI/CD로 호스팅 배포하는 방법을 중심으로 설명한다.

증상

  • 코드 병합 시 충돌이 자주 발생하고 기능 버전이 뒤섞인다.
  • 개발 환경마다 동작이 달라 로컬에서는 정상이나 배포환경에서 오류가 난다.
  • 실수로 봇 토큰이나 비밀 키를 리포지토리에 커밋해 보안 사고 위험이 생긴다.
  • 배포 권한 관리가 없어 누군가가 의도치 않게 서비스 중단을 유발한다.

원인

  • 분명한 브랜칭 전략과 리뷰 프로세스가 미비하다.
  • 환경 변수와 시크릿을 코드에 직접 포함하거나 .env 파일을 커밋한다.
  • CI나 자동화된 테스트 없이 수동으로 배포한다.
  • 호스팅 접근 정보(SSH 키, API 토큰) 관리를 중앙화하지 않아 권한 제어가 불명확하다.

해결 방법

1단계: GitHub 기반 협업 기초 구성

  • 리포지토리 기본 설정

    • .gitignorenode_modules, .env 등을 추가한다.
    • 환경 예시 파일은 /.env.example로 저장해 실제 비밀 값은 커밋하지 않는다.
    • package-lock.json 또는 yarn.lock을 커밋해 일관된 의존성을 유지한다.
  • 브랜치 전략 & 코드 리뷰

    • main(또는 master)은 보호(branch protection)하고 직접 푸시 금지.
    • 기능별 브랜치(feature/xxx)에서 작업하고 Pull Request(PR)로 병합.
    • PR 템플릿과 리뷰 규칙을 만들어 코드 품질 확보.
  • 권한 및 소유자

    • CODEOWNERS로 특정 경로에 대한 리뷰어를 지정.
    • 민감한 설정 변경은 2인 이상의 승인 요구하도록 브랜치 보호 구성.
  • 환경 변수 관리

    • .env에 토큰 저장 금지. 로컬은 .env 사용하되 절대 커밋하지 않음.
    • GitHub Secrets에 BOT_TOKEN, SSH_PRIVATE_KEY 등 등록.

예시 .env.example

DISCORD_TOKEN=
NODE_ENV=development

간단한 Node.js 디스코드 봇 (discord.js) 예

// index.js
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });

const token = process.env.DISCORD_TOKEN;
if (!token) throw new Error('DISCORD_TOKEN이 설정되어야 합니다.');

client.once('ready', () => console.log(`Logged in as ${client.user.tag}`));
client.login(token);

2단계: CI/CD와 배포 자동화 (호스팅 연동)

  • CI 파이프라인

    • PR마다 npm ci → 린트 → 테스트를 실행해 품질 보장.
    • workflow에서 취약점 스캔이나 의존성 검사 추가 고려.
  • 배포 자동화

    • 성공한 main 병합 시 자동 배포.
    • GitHub Actions에 호스팅 접근 정보(예: SSH_PRIVATE_KEY)를 시크릿으로 등록.
    • 호스팅 공급자로는 디스호스트 같은 호스팅을 사용 가능하며, 배포 키나 Docker 이미지를 이용해 안전하게 배포한다.

예시 GitHub Actions 워크플로(SSH로 배포)

name: CI & Deploy
on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '18'
      - run: npm ci
      - run: npm test
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v0.1.7
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /path/to/app
            git pull
            npm ci --production
            pm2 restart bot || pm2 start index.js --name bot
  • 개발환경 통일

    • Docker 개발 컨테이너 혹은 devcontainer를 구성해 로컬 환경 차이를 줄인다.
    • npm ci와 락파일로 모든 개발자가 동일한 의존성 사용.
  • 비상 복구와 롤백

    • 배포 시 버전 태그 사용(v1.2.0)으로 빠른 롤백 가능.
    • 점진적 배포(블루/그린 또는 Canary)를 도입하면 서비스 중단 위험 감소.

마무리

GitHub 기반의 명확한 브랜치·리뷰 규칙, 환경 변수의 안전한 관리, CI/CD 자동화로 협업 안정성과 배포 신뢰도를 높일 수 있다. 디스코드 봇 개발은 코드 품질과 비밀 관리, 배포 자동화에 투자하면 더 적은 트러블로 빠르게 확장 가능하다.