텔레그램 봇 직접 만든 개발기: Node.js + OpenAI로 채팅·자동응답 시스템 구축하기

문제: 텔레그램 봇 직접 만든 개발기 — 결론부터

짧게 답하면: Node.js(Express) + Telegraf 라이브러리 + OpenAI(또는 Claude) API를 사용하면 ‘사용자 질문에 상태를 체크하고 외부 API를 호출해 응답하는’ 텔레그램 봇을 빠르게 만들 수 있습니다. 제가 실제로 만든 샘플은 2시간 설정, 기본 자동응답·명령·로그 저장(파일·Airtable 가능)까지 포함했습니다.

예제 코드 복사해서 바로 실행하기

다음 단계: 로컬로 빠르게 실험하려면 아래 예제 코드 복사 → .env 설정 → node index.js 실행

왜 이 조합을 선택했나?

Telegraf는 텔레그램 봇용으로 생태계가 잘 갖춰져 있고, Express나 서버리스(Cloud Run, Vercel)로 배포하기 쉬워요. OpenAI나 Anthropic(Claude)은 자연어 처리와 대화 상태 관리를 맡기면 개발 반복을 크게 줄여 줍니다.

제가 직접 해본 핵심 셋업(요약)

  • 환경: Node.js 18, npm, Git
  • 라이브러리: telegraf, axios, dotenv, express(선택)
  • 외부 서비스: Telegram Bot Token(봇파더), OpenAI API Key, 로그용 Airtable(선택)
  • 기능: /start, /help, 자연어 질문 → GPT 응답, 명령으로 외부 API(예: 환율) 호출

구체적 예제: 최소용 텔레그램 봇 코드

아래 예제는 실제로 작동하는 최소 구현(간단화). .env에 TELEGRAM_TOKEN, OPENAI_API_KEY를 넣고 실행하세요.

// index.js (요약)
require('dotenv').config();
const { Telegraf } = require('telegraf');
const axios = require('axios');
const bot = new Telegraf(process.env.TELEGRAM_TOKEN);

bot.start(ctx => ctx.reply('안녕하세요! 질문을 입력하면 GPT가 답합니다.'));

bot.on('text', async ctx => {
  const userText = ctx.message.text;
  ctx.reply('질문 확인 중...');
  try {
    const res = await axios.post('https://api.openai.com/v1/chat/completions', {
      model: 'gpt-4o-mini',
      messages: [{ role: 'user', content: userText }]
    }, {
      headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` }
    });
    const reply = res.data.choices?.[0]?.message?.content || '응답을 못 받았습니다.';
    ctx.reply(reply);
  } catch (e) {
    console.error(e.message);
    ctx.reply('오류 발생: 관리자에게 문의하세요.');
  }
});

bot.launch();

주의: OpenAI 모델 이름과 요금제는 수시로 바뀝니다. 테스트 전 공식 문서 확인을 권합니다.

비교: 주요 선택지와 차이

아래 표는 구현 난이도, 비용(상대적), 확장성 관점에서 간단 비교입니다.

옵션 구현 난이도 실시간 처리 비용 확장성/장점
Telegraf + OpenAI 낮음 중간(모델 사용량에 따라) 빠른 프로토타입, 풍부한 NLP
python-telegram-bot + Hugging Face 중간 낮음~중간(자체 호스팅 가능) 비용 절감, 모델 선택 자유
Node + Webhook(Express) + Google Cloud Run 중간 운영비 존재 확장성 좋음, 서버리스 배포

어떤 경우에 무엇을 선택할까(추천 대상)

  • 빠르게 프로토타입 -> Telegraf + OpenAI
  • 비용 제어가 중요 -> Hugging Face 모델 직접 호스팅
  • 높은 트래픽 예상 -> Cloud Run + 로드밸런서

제가 막혔던 지점과 해결법

문제: 텔레그램 메시지를 연속 처리할 때 OpenAI 호출이 병목되어 타임아웃 발생.

해결: 작업 큐(예: BullMQ)로 API 호출을 직렬화하거나, 사용자에게 ‘응답 대기중’ 메시지를 보내고 비동기 콜백으로 처리했습니다. 또한 요청당 토큰수를 줄여 비용과 지연을 낮췄습니다.

실전 예: 환율 조회 명령 추가하기 (구체적)

명령 /rate USDKRW를 입력하면 공개 환율 API를 호출해 답하도록 구현했습니다. 예시는 환율 API로 exchangerate.host를 사용했고, 응답 캐시(1분)로 과다 호출을 막았습니다.

// 환율 처리 예시 (요약)
if (msg.startsWith('/rate')) {
  const [_, pair] = msg.split(' ');
  const cached = cache.get(pair);
  if (cached) return reply(cached);
  const r = await axios.get(`https://api.exchangerate.host/latest?base=${pair.slice(0,3)}&symbols=${pair.slice(3)}`);
  const value = r.data.rates[pair.slice(3)];
  cache.set(pair, value, 60); // 60초 캐시
  reply(`${pair}: ${value}`);
}

비교 요약 테이블(기능 관점)

기능 Telegraf+OpenAI python+HF
대화형 응답 품질 높음 중~높음(모델에 따라)
배포 편의성 높음 중간
비용 제어 중간 높음(절감 가능)

자주 묻는 질문

1) 서버 없이 텔레그램 봇을 운영할 수 있나요?

가능합니다. Vercel/Cloud Run에 Webhook으로 배포하면 서버리스 형태로 운용합니다. 다만 장기 연결(Long polling)보다는 웹훅이 권장됩니다.

2) 비용을 절감하려면 어떻게 하나요?

응답 길이(토큰) 제한, 모델을 gpt-4 대신 gpt-4o-mini 또는 GPT-3.5로 낮추기, 캐시 적용, 사용자 당 호출량 제한이 효과적입니다.

한 가지 흔한 실수

실수: 봇 토큰이나 OpenAI 키를 코드에 하드코딩. 결과: 키 유출로 비용 폭증 가능. 반드시 .env와 환경변수, 그리고 Git에 올릴 때는 .gitignore를 사용하세요.

다음 행동(실행 가능한 체크리스트)

  1. Telegram BotFather에서 토큰 생성
  2. 로컬에 Node 프로젝트 초기화(npm init) → telegraf 설치
  3. 예제 코드 복사·붙여넣기 → .env에 키 추가 → node index.js 실행
  4. 테스트 채팅 후 로그/오류 확인, 캐시·큐 적용

내가 추천하는 구성(초급→운영 전환 로드맵)

  • 초급(프로토타입): Node.js + Telegraf + OpenAI(테스트 모델)
  • 중급(비용/성능 조정): 캐시(AWS ElastiCache 또는 in-memory), BullMQ 큐, 모델 축소
  • 운영: Cloud Run + Cloud Logging, 모니터링(Prometheus/Sentry), 요금 경보

참고 링크

마무리: 짧은 권장 행동

바로 실행해보세요. 위 예제 복사 → .env 세팅 → node로 실행하면 ‘텔레그램 봇 직접 만든 개발기’의 핵심을 30분 내 체험할 수 있습니다. 이후 캐시와 큐를 하나씩 추가해 안정성과 비용을 개선하세요.

면책사항

사용한 API·요금·모델 이름은 작성 시점 기준이며 자주 변경됩니다. 운영 전 공식 문서를 확인하시고, 본문 중 일부 기능은 환경·버전 차이로 동작이 달라질 수 있습니다.

관련 링크

글쓴이 용기

AI 코딩 에이전트로 직접 빌드하는 개발자. Claude Code·Codex 실사용 후기와 빌더 일지를 씁니다.

지식창고