
문제: 텔레그램 봇 직접 만든 개발기 — 결론부터
짧게 답하면: Node.js(Express) + Telegraf 라이브러리 + OpenAI(또는 Claude) API를 사용하면 ‘사용자 질문에 상태를 체크하고 외부 API를 호출해 응답하는’ 텔레그램 봇을 빠르게 만들 수 있습니다. 제가 실제로 만든 샘플은 2시간 설정, 기본 자동응답·명령·로그 저장(파일·Airtable 가능)까지 포함했습니다.
왜 이 조합을 선택했나?
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를 사용하세요.
다음 행동(실행 가능한 체크리스트)
- Telegram BotFather에서 토큰 생성
- 로컬에 Node 프로젝트 초기화(npm init) → telegraf 설치
- 예제 코드 복사·붙여넣기 → .env에 키 추가 → node index.js 실행
- 테스트 채팅 후 로그/오류 확인, 캐시·큐 적용
내가 추천하는 구성(초급→운영 전환 로드맵)
- 초급(프로토타입): Node.js + Telegraf + OpenAI(테스트 모델)
- 중급(비용/성능 조정): 캐시(AWS ElastiCache 또는 in-memory), BullMQ 큐, 모델 축소
- 운영: Cloud Run + Cloud Logging, 모니터링(Prometheus/Sentry), 요금 경보
참고 링크
마무리: 짧은 권장 행동
바로 실행해보세요. 위 예제 복사 → .env 세팅 → node로 실행하면 ‘텔레그램 봇 직접 만든 개발기’의 핵심을 30분 내 체험할 수 있습니다. 이후 캐시와 큐를 하나씩 추가해 안정성과 비용을 개선하세요.
면책사항
사용한 API·요금·모델 이름은 작성 시점 기준이며 자주 변경됩니다. 운영 전 공식 문서를 확인하시고, 본문 중 일부 기능은 환경·버전 차이로 동작이 달라질 수 있습니다.
관련 링크
- 관련 태그 더 보기
- 카테고리 더 보기
- 검색 결과 더 보기
- 참고 링크
