Skip to content

필사 모드: 챗봇 프레임워크 2026 — Slack Bolt / discord.js / Discord.py (부활) / JDA / py-cord / Telegram / LINE / KakaoTalk 심층 가이드

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

프롤로그 — 챗봇은 도구가 아니라 인프라가 됐다

2018년쯤 챗봇은 "재미있는 사이드 프로젝트"였다. 2026년에는 다르다. 회사 슬랙에는 알림 봇·배포 봇·인시던트 봇·LLM 어시스턴트가 깔려 있고, 커뮤니티 디스코드에는 모더레이션 봇·역할 봇·티켓 봇·뮤직 봇이 깔려 있고, 카카오톡 비즈니스 채널에는 상담 봇·예약 봇·결제 봇이 깔려 있다. **챗봇은 도구가 아니라 사용자가 만나는 첫 인터페이스가 됐다.**

그런데 막상 봇을 만들려고 하면 막힌다. Slack 봇은 Bolt를 쓰면 되는데, Bolt Node·Bolt Python·Bolt Java 중 뭘 쓰지? Discord 봇은 discord.js를 쓰면 되는데, Python 사람한테 Node를 강요할 수는 없잖아 — Discord.py를 쓰면 되나? 그런데 Discord.py는 2021년에 deprecate 되지 않았나? 그러면 py-cord? nextcord? 한국 시장은? 카카오톡 채널 API는 어떻게 생겼지? 일본은 LINE Messaging API인데, 도쿄 팀이 KARTE Talk Bot을 쓰겠다면?

이 글은 2026년 현재 챗봇 프레임워크 지도를 그린다. 어떤 플랫폼·언어·라이선스·생존성을 갖고 있는지, 그리고 회사 슬랙·커뮤니티 디스코드·카톡 비즈니스를 만들 때 누가 무엇을 골라야 하는지까지.

1장 · 2026년 챗봇 프레임워크 지도 — 플랫폼 / 언어 별

먼저 큰 그림. **플랫폼**(슬랙·디스코드·텔레그램·…)과 **언어**(JS·Python·Java·Rust·…) 두 축으로 정리한다.

| 플랫폼 | Node.js | Python | Java | Rust | .NET |

| --- | --- | --- | --- | --- | --- |

| Slack | Bolt Node | Bolt Python | Bolt Java | (없음) | (없음) |

| Discord | discord.js / eris | discord.py / py-cord / nextcord | JDA / Discord4J | serenity | DSharpPlus / Discord.Net |

| Matrix | matrix-bot-sdk | matrix-nio | (제3자) | (제3자) | (제3자) |

| Mattermost | mattermost-client | mattermostdriver | (제3자) | (제3자) | (제3자) |

| Rocket.Chat | rocket.chat.js | rocket-python | (제3자) | (제3자) | (제3자) |

| Telegram | Telegraf / node-telegram-bot-api | python-telegram-bot / aiogram | TelegramBots | teloxide | Telegram.Bot |

| WhatsApp | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) | Meta Cloud API (HTTP) |

| LINE | line-bot-sdk-nodejs | line-bot-sdk-python | line-bot-sdk-java | (제3자) | line-bot-sdk-net |

| KakaoTalk Channel | (HTTP) | (HTTP) | (HTTP) | (HTTP) | (HTTP) |

여기서 보이는 패턴:

1. **Slack은 Bolt로 통일됐다.** Node/Python/Java 셋 다 공식 SDK가 있고, 셋 다 동등한 API를 제공한다. "Slack 봇은 Bolt" 한 줄로 끝난다.

2. **Discord는 언어별 진영이 갈린다.** JS는 discord.js, Python은 discord.py(부활)/py-cord/nextcord, Java는 JDA/Discord4J, Rust는 serenity, .NET은 DSharpPlus/Discord.Net. **사내 표준 언어가 먼저고, 라이브러리는 그다음**이다.

3. **Telegram도 분기점이 있다.** Python에서 동기형은 python-telegram-bot, asyncio 네이티브는 aiogram. Node는 Telegraf가 사실상 표준.

4. **WhatsApp·LINE·KakaoTalk은 HTTP API.** 공식 SDK는 보조적이고, 본질은 webhook + HTTP 요청. 언어 의존성이 거의 없다.

5. **Matrix·Mattermost·Rocket.Chat은 셀프 호스팅 진영.** 엔터프라이즈/오픈소스 통신에서 쓰인다.

2장 · Slack Bolt — Node/Python/Java 공식, 통일된 사내 봇 표준

Slack의 공식 봇 프레임워크는 **Bolt**다. 2019년에 Node 버전이 처음 나왔고, 그 뒤 Python·Java 버전이 따라붙어서 이제는 셋 다 공식이다. Slack은 의도적으로 세 SDK를 비슷한 API로 맞춰놓아서, 한 언어에서 다른 언어로 옮기는 비용이 작다.

Bolt Node 기본 골격

const app = new App({

token: process.env.SLACK_BOT_TOKEN,

signingSecret: process.env.SLACK_SIGNING_SECRET,

socketMode: true,

appToken: process.env.SLACK_APP_TOKEN,

});

// 슬래시 명령

app.command('/hello', async ({ command, ack, respond }) => {

await ack();

await respond(`안녕하세요, <@${command.user_id}>!`);

});

// 메시지 이벤트

app.message('도움', async ({ message, say }) => {

await say('무엇을 도와드릴까요?');

});

// 인터랙티브 버튼

app.action('button_click', async ({ ack, body, respond }) => {

await ack();

await respond('버튼이 눌렸습니다');

});

(async () => {

await app.start();

console.log('Bolt 앱 실행 중');

})();

Bolt Python — 같은 모양

from slack_bolt import App

from slack_bolt.adapter.socket_mode import SocketModeHandler

app = App(token=os.environ["SLACK_BOT_TOKEN"])

@app.command("/hello")

def handle_hello(ack, respond, command):

ack()

respond(f"안녕하세요, <@{command['user_id']}>!")

@app.message("도움")

def handle_help(message, say):

say("무엇을 도와드릴까요?")

@app.action("button_click")

def handle_button(ack, respond):

ack()

respond("버튼이 눌렸습니다")

if __name__ == "__main__":

SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

API 모양이 거의 동일하다. 데코레이터 이름·파라미터까지 같다.

Bolt Java — 엔터프라이즈 진영

public class SlackBotApp {

public static void main(String[] args) {

var config = new AppConfig();

config.setSigningSecret(System.getenv("SLACK_SIGNING_SECRET"));

config.setSingleTeamBotToken(System.getenv("SLACK_BOT_TOKEN"));

var app = new App(config);

app.command("/hello", (req, ctx) -> {

return ctx.ack("안녕하세요, " + req.getPayload().getUserName() + "!");

});

var server = new com.slack.api.bolt.jetty.SlackAppServer(app);

try { server.start(); } catch (Exception e) { e.printStackTrace(); }

}

}

Socket Mode vs HTTP Mode

Bolt는 두 가지 운영 모드가 있다.

- **Socket Mode**: 봇이 Slack에 WebSocket으로 outbound 연결. 사내 네트워크에서 inbound 포트 안 열고 운영할 수 있다. 개발·소규모 봇에 좋다.

- **HTTP Mode**: Slack이 webhook을 봇 URL로 보낸다. 공인 HTTPS 엔드포인트가 필요하다. 프로덕션·대규모에 좋다.

회사 슬랙 봇 시작은 Socket Mode가 압도적으로 편하다. 트래픽이 늘면 HTTP Mode로 옮기는 게 정석.

누가 어떤 언어를 골라야 하나

- **사내 표준이 Node**: Bolt Node. Slack 기능 신규 출시 때 가장 먼저 지원된다.

- **사내 표준이 Python (특히 데이터팀)**: Bolt Python. 사내 데이터·LLM 코드와 합치기 쉽다.

- **사내 표준이 Java (특히 대기업)**: Bolt Java. Spring 통합도 무난하다.

세 언어 모두 같은 회사가 직접 유지보수하고, 새 기능 릴리스 lag이 거의 없다. **언어를 골랐으면 Bolt를 골랐다.**

3장 · discord.js — Node.js Discord 표준

Discord 봇의 Node.js 진영은 **discord.js**가 사실상 독점이다. 2025년 중반에 v14가 안정화되고, 2026년 현재 v15가 활발히 개발 중이다. 슬래시 명령·버튼·셀렉트 메뉴·모달·스레드·포럼 채널·자동 모더레이션까지 Discord의 새 기능을 거의 다 지원한다.

최소 골격

const client = new Client({

intents: [

GatewayIntentBits.Guilds,

GatewayIntentBits.GuildMessages,

GatewayIntentBits.MessageContent,

],

});

client.once('ready', () => {

console.log(`로그인 완료: ${client.user?.tag}`);

});

// 슬래시 명령 등록

const ping = new SlashCommandBuilder()

.setName('ping')

.setDescription('지연시간 측정');

client.on('interactionCreate', async (interaction) => {

if (!interaction.isChatInputCommand()) return;

if (interaction.commandName === 'ping') {

const ms = Date.now() - interaction.createdTimestamp;

await interaction.reply(`Pong (${ms}ms)`);

}

});

client.login(process.env.DISCORD_TOKEN);

Intents — 권한 모델

Discord는 봇이 어떤 이벤트를 받을지 명시적으로 선언해야 한다. **MessageContent intent**는 2022년부터 privileged intent가 됐고, 100서버를 넘는 봇은 Discord 승인을 받아야 한다. 작은 봇은 자동 승인.

Sharding — 큰 봇의 운영

봇이 2500서버를 넘기면 Discord가 sharding을 요구한다. discord.js는 `ShardingManager`를 빌트인으로 제공해서 프로세스 단위로 샤드를 띄운다.

const manager = new ShardingManager('./bot.js', {

totalShards: 'auto',

token: process.env.DISCORD_TOKEN,

});

manager.on('shardCreate', (shard) => console.log(`샤드 ${shard.id} 시작`));

manager.spawn();

왜 discord.js가 이겼나

- **타입스크립트 1급 시민**: v14 이후 타입이 매우 정확하다.

- **Discord 새 기능 first-class 지원**: API 변경 후 며칠 안에 라이브러리 반영.

- **거대한 생태계**: 보일러플레이트·CLI·코그 시스템·DB 어댑터까지 다 있다.

- **Eris보다 추상화 한 단계 위**: 메시지 컴포넌트·인터랙션 추적이 편하다.

discord.js가 안 맞을 때: 메모리 풋프린트가 극단적으로 작아야 할 때(공유 호스팅), 또는 raw gateway에 가깝게 다루고 싶을 때 — 그때는 eris를 본다.

4장 · Discord.py 부활 (2024.4, Rapptz) — deprecate 후 복귀

Discord.py는 Python Discord 봇의 황금 표준이었다. 그런데 **2021년 8월**, 메인테이너인 Rapptz(Danny Garcia)가 "더 이상 유지하지 않겠다"는 선언과 함께 GitHub 리포지터리를 archive 모드로 돌렸다. 사유는 Discord가 메시지 콘텐츠를 privileged intent로 바꿔서, 100서버 이상 봇은 Discord 승인이 필요해진 것이었다 — Rapptz는 이 결정이 음악 봇 같은 카테고리를 죽인다고 공개적으로 반대했고, 라이브러리 유지의 도덕적 부담을 들어 떠났다.

Python Discord 생태계는 패닉에 빠졌다. 수만 개의 봇이 discord.py에 의존하고 있었고, 새 슬래시 명령·인터랙션·스레드 기능은 라이브러리 업데이트 없이는 못 썼다.

2.5년의 공백

2021년 8월부터 2024년 4월까지 약 2.5년 동안 discord.py는 사실상 정지 상태였다. 이 기간에 커뮤니티는 **fork**를 여럿 만들었다(다음 장). 일부는 활발히 발전했고, 일부는 사라졌다.

2024년 4월 — 부활

**2024년 4월**, Rapptz는 discord.py를 다시 활성화한다고 발표했다. Discord가 음악 봇 정책을 일부 완화했고, 본인의 마음도 정리됐다는 사유였다. 그날 트위터·레딧·Discord 서버가 폭발했다.

부활 이후 discord.py는 빠르게 따라잡았다.

- 슬래시 명령(`app_commands`)

- 모달·셀렉트 메뉴

- 스레드·포럼 채널

- 음성 채널 v3 API

- voice receive(라이브러리에서 받기)

2026년 현재 **discord.py 2.x**는 다시 Python Discord 봇의 사실상 표준이다.

최소 골격

from discord import app_commands

from discord.ext import commands

intents = discord.Intents.default()

intents.message_content = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event

async def on_ready():

print(f'로그인 완료: {bot.user}')

await bot.tree.sync()

@bot.tree.command(name='ping', description='지연시간 측정')

async def ping(interaction: discord.Interaction):

latency = round(bot.latency * 1000)

await interaction.response.send_message(f'Pong ({latency}ms)')

bot.run('YOUR_TOKEN')

Cogs — 모듈 시스템

discord.py의 `commands.Cog`는 명령·이벤트·리스너를 클래스로 묶는 모듈 시스템이다. 큰 봇을 만들 때 거의 필수.

from discord.ext import commands

from discord import app_commands

class Moderation(commands.Cog):

def __init__(self, bot):

self.bot = bot

@app_commands.command(name='kick', description='유저 추방')

async def kick(self, interaction: discord.Interaction, member: discord.Member):

await member.kick()

await interaction.response.send_message(f'{member}를 추방했습니다')

async def setup(bot):

await bot.add_cog(Moderation(bot))

누가 discord.py를 선택해야 하나

- 기존 Python 자산이 많은 팀

- LLM·데이터 파이프라인과 봇을 같은 코드베이스에서 운영

- Rapptz의 디자인 철학과 잘 맞을 때(명시적·타입 안전·"매직 적음")

5장 · py-cord / nextcord — 부재 중 fork

discord.py가 멈춰 있던 2.5년 동안 fork가 여럿 나왔다. 살아남은 두 갈래.

py-cord — 가장 큰 fork

**py-cord**는 discord.py의 fork 중 가장 큰 커뮤니티를 모았다. 2021년 말 시작해서 슬래시 명령·인터랙션을 적극적으로 추가했다. API는 discord.py와 매우 비슷하지만, 일부 결정(예: voice 처리·name conflict 해결)에서 갈렸다.

from discord.ext import commands

bot = commands.Bot()

@bot.slash_command(name='ping', description='지연시간')

async def ping(ctx: discord.ApplicationContext):

await ctx.respond(f'Pong ({round(bot.latency * 1000)}ms)')

bot.run('TOKEN')

py-cord는 슬래시 명령을 더 일찍·더 깊이 지원했고, 그래서 부재 기간 동안 많은 봇이 옮겨왔다.

nextcord — 또 하나의 fork

**nextcord**는 py-cord보다 약간 더 discord.py에 가깝게 머문 fork였다. 보수적이고 점진적인 변경을 선호했다.

from nextcord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.slash_command(description='지연시간')

async def ping(interaction: nextcord.Interaction):

await interaction.send(f'Pong')

bot.run('TOKEN')

discord.py 부활 이후 — fork의 운명

2024년 4월 본가가 돌아온 뒤, fork들의 가치 제안이 약해졌다. py-cord는 여전히 활발하지만, **신규 프로젝트는 다시 discord.py로 가는 게 일반적**이다. nextcord는 활동이 둔해졌다.

그러나 기존에 py-cord/nextcord로 만든 봇은 마이그레이션 비용 때문에 그 자리에 남는다. 2026년 현재 의사결정:

| 상황 | 권장 |

| --- | --- |

| 신규 Python Discord 봇 | discord.py |

| 기존 py-cord 봇 | 유지 (활발히 유지보수됨) |

| 기존 nextcord 봇 | 마이그레이션 고려 (속도 둔화) |

6장 · JDA / Discord4J — Java 진영

Java로 Discord 봇을 만드는 사람은 두 라이브러리 중 하나를 고른다.

JDA — 명령형 표준

**JDA**(Java Discord API)는 Java Discord 봇의 사실상 표준이다. 명령형 API, 강한 타입, 풍부한 문서.

public class Bot extends ListenerAdapter {

public static void main(String[] args) throws Exception {

JDABuilder.createDefault(System.getenv("DISCORD_TOKEN"))

.enableIntents(GatewayIntent.MESSAGE_CONTENT)

.addEventListeners(new Bot())

.build();

}

@Override

public void onReady(ReadyEvent event) {

System.out.println("로그인: " + event.getJDA().getSelfUser().getAsTag());

}

}

JDA는 Spring·Quarkus 통합 라이브러리가 따로 있어서 엔터프라이즈에서 익숙한 패턴으로 쓸 수 있다.

Discord4J — 리액티브

**Discord4J**는 Project Reactor 기반으로 비동기·리액티브 스트림으로 모든 걸 표현한다. Reactor에 익숙한 팀이라면 매우 자연스럽다.

public class Bot {

public static void main(String[] args) {

var client = DiscordClient.create(System.getenv("DISCORD_TOKEN"))

.login()

.block();

client.on(MessageCreateEvent.class, event -> {

var message = event.getMessage();

if (message.getContent().equals("!ping")) {

return message.getChannel()

.flatMap(channel -> channel.createMessage("Pong"));

}

return reactor.core.publisher.Mono.empty();

}).blockLast();

}

}

누가 무엇을 골라야 하나

| 팀 성향 | 권장 |

| --- | --- |

| Spring Boot 정통, 명령형 | JDA |

| Reactor·WebFlux 사용 중 | Discord4J |

| 그냥 Java로 빨리 만들고 싶다 | JDA (학습 곡선 낮음) |

| 대량 동시 이벤트 처리 | Discord4J (백프레셔) |

7장 · serenity (Rust) / DSharpPlus + discord.net (.NET) / eris

serenity — Rust Discord 표준

**serenity**는 Rust Discord 봇의 표준 라이브러리다. async/await 기반, 강한 타입, 메모리 안전. 큰 봇·리소스 제약 환경에서 인기.

use serenity::async_trait;

use serenity::model::channel::Message;

use serenity::prelude::*;

struct Handler;

#[async_trait]

impl EventHandler for Handler {

async fn message(&self, ctx: Context, msg: Message) {

if msg.content == "!ping" {

if let Err(why) = msg.channel_id.say(&ctx.http, "Pong").await {

println!("메시지 전송 실패: {:?}", why);

}

}

}

}

#[tokio::main]

async fn main() {

let token = std::env::var("DISCORD_TOKEN").expect("토큰 없음");

let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT;

let mut client = Client::builder(&token, intents)

.event_handler(Handler)

.await

.expect("클라이언트 생성 실패");

if let Err(why) = client.start().await {

println!("실행 오류: {:?}", why);

}

}

DSharpPlus / Discord.Net — .NET 양대 산맥

.NET 진영에는 두 라이브러리가 공존한다.

- **DSharpPlus**: 활발하고 새 기능을 일찍 받는 편.

- **Discord.Net**: 더 오래됐고, 대형 봇에서 쓰임. 슬래시 명령 지원도 안정.

using Discord;

using Discord.WebSocket;

var client = new DiscordSocketClient(new DiscordSocketConfig {

GatewayIntents = GatewayIntents.AllUnprivileged | GatewayIntents.MessageContent

});

client.Log += msg => { Console.WriteLine(msg.ToString()); return Task.CompletedTask; };

client.MessageReceived += async msg => {

if (msg.Content == "!ping") await msg.Channel.SendMessageAsync("Pong");

};

await client.LoginAsync(TokenType.Bot, Environment.GetEnvironmentVariable("DISCORD_TOKEN"));

await client.StartAsync();

await Task.Delay(-1);

eris — 구식 Node, 그래도 일부는 남는다

**eris**는 discord.js 이전 세대의 Node Discord 라이브러리다. 더 저수준에 가깝고, 메모리 효율이 좋아서 일부 대형 봇은 아직도 쓴다. 새로 시작하는 팀이라면 discord.js를 추천.

const Eris = require('eris');

const bot = new Eris(process.env.DISCORD_TOKEN, {

intents: ['guilds', 'guildMessages', 'messageContent'],

});

bot.on('ready', () => console.log('준비 완료'));

bot.on('messageCreate', (msg) => {

if (msg.content === '!ping') bot.createMessage(msg.channel.id, 'Pong');

});

bot.connect();

8장 · Matrix bots — matrix-nio (Python) / matrix-bot-sdk (Node)

Matrix는 오픈 프로토콜이라 SDK가 여러 언어에 흩어져 있다. 봇 만들기에 가장 많이 쓰이는 두 가지.

matrix-nio — Python 비동기

from nio import AsyncClient, MatrixRoom, RoomMessageText

async def message_callback(room: MatrixRoom, event: RoomMessageText):

if event.body == "!ping":

await client.room_send(

room_id=room.room_id,

message_type="m.room.message",

content={"msgtype": "m.text", "body": "Pong"},

)

client = AsyncClient("https://matrix.example.org", "@bot:example.org")

client.add_event_callback(message_callback, RoomMessageText)

matrix-bot-sdk — Node

const client = new MatrixClient(

'https://matrix.example.org',

process.env.MATRIX_TOKEN!,

new SimpleFsStorageProvider('bot.json'),

);

client.on('room.message', async (roomId, event) => {

if (!event.content || event.sender === (await client.getUserId())) return;

if (event.content.body === '!ping') {

await client.sendMessage(roomId, { msgtype: 'm.text', body: 'Pong' });

}

});

client.start();

Matrix는 누가 쓰나

- 오픈소스 커뮤니티 (Mozilla·KDE·GNOME 등)

- 정부·공공 (프랑스 Tchap, 독일 BWMessenger)

- 페더레이션이 중요한 조직

엔터프라이즈 슬랙 대체로 Matrix(+Element 클라이언트)를 선택한 곳이 늘었다. 봇 만들기 난이도는 슬랙·디스코드보다 약간 높지만, 자체 호스팅·페더레이션·E2EE가 큰 이점이다.

9장 · Mattermost / Rocket.Chat — 엔터프라이즈 챗

Mattermost — 슬랙 대체의 대표

**Mattermost**는 셀프 호스팅 슬랙 대체로 가장 많이 쓰인다. 봇 API는 슬랙과 매우 비슷하다.

from mattermostdriver import Driver

driver = Driver({

'url': 'mattermost.example.com',

'token': 'BOT_TOKEN',

'scheme': 'https',

'port': 443,

})

driver.login()

메시지 전송

driver.posts.create_post({

'channel_id': 'CHANNEL_ID',

'message': '안녕하세요',

})

Mattermost는 슬래시 명령·인터랙티브 메시지·webhook을 모두 지원한다. 슬랙 봇 코드를 옮기기 비교적 쉽다.

Rocket.Chat — 또 다른 진영

**Rocket.Chat**도 오픈소스 셀프 호스팅 메신저. Rocket.Chat Apps Engine으로 봇을 만들거나, REST API + webhook으로 만든다.

const { RocketChatApp } = require('@rocket.chat/apps-engine/definition/RocketChatApp');

class HelloApp extends RocketChatApp {

async executeSlashCommand(context, read, modify) {

const sender = context.getSender();

const room = context.getRoom();

const builder = modify.getCreator().startMessage()

.setSender(sender)

.setRoom(room)

.setText('안녕하세요!');

await modify.getCreator().finish(builder);

}

}

누가 Mattermost/Rocket.Chat을 쓰나

- 데이터 주권이 필요한 정부·공공

- 슬랙 비용을 피하고 싶은 대규모 조직

- 군·금융 같은 보안 강제 환경

10장 · Telegram — python-telegram-bot / Telegraf (Node) / aiogram

Telegram Bot API는 HTTP 기반이라 어떤 언어로도 쓸 수 있지만, 언어별 표준 라이브러리가 있다.

python-telegram-bot — Python 동기/비동기

가장 오래되고 가장 큰 Python Telegram 라이브러리. 2022년 v20부터 본격 비동기.

from telegram import Update

from telegram.ext import Application, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):

await update.message.reply_text('안녕하세요!')

app = Application.builder().token('YOUR_TOKEN').build()

app.add_handler(CommandHandler('start', start))

app.run_polling()

Telegraf — Node 표준

const bot = new Telegraf(process.env.TELEGRAM_TOKEN!);

bot.start((ctx) => ctx.reply('안녕하세요!'));

bot.command('ping', (ctx) => ctx.reply('Pong'));

bot.launch();

aiogram — asyncio 네이티브 Python

asyncio 우선 설계. 큰 봇·동시성 많은 봇에 유리.

from aiogram import Bot, Dispatcher, types

from aiogram.filters import Command

bot = Bot(token='YOUR_TOKEN')

dp = Dispatcher()

@dp.message(Command('start'))

async def handle_start(message: types.Message):

await message.answer('안녕하세요!')

async def main():

await dp.start_polling(bot)

asyncio.run(main())

누가 무엇을 골라야 하나

| 상황 | 권장 |

| --- | --- |

| Python 신규 Telegram 봇 | python-telegram-bot (커뮤니티 가장 큼) |

| 고동시성·async-first | aiogram |

| Node 환경 | Telegraf |

| TypeScript 풍부한 타입 | Telegraf (타입 정의 우수) |

11장 · WhatsApp Cloud API (Meta)

WhatsApp 비즈니스 메시지는 2022년 이후 **Meta가 직접 운영하는 Cloud API**가 표준이 됐다. 그 전에는 BSP(Business Solution Provider)를 거쳐야 했지만, 이제는 Meta Cloud API로 직접 연동한다.

기본 흐름

1. Meta for Developers에서 앱 생성

2. WhatsApp Business Account(WABA) 연결

3. 전화번호 등록·승인

4. Webhook URL 등록 (메시지 수신)

5. Graph API로 메시지 전송

메시지 전송 예 (HTTP)

curl -X POST "https://graph.facebook.com/v18.0/PHONE_NUMBER_ID/messages" \

-H "Authorization: Bearer ACCESS_TOKEN" \

-H "Content-Type: application/json" \

-d '{

"messaging_product": "whatsapp",

"to": "821012345678",

"type": "text",

"text": {"body": "안녕하세요"}

}'

템플릿 메시지 — 24시간 윈도우 밖

WhatsApp은 **24시간 윈도우** 규칙이 있다. 사용자가 마지막 메시지를 보낸 뒤 24시간이 지나면, 자유 메시지를 보낼 수 없다. 이때 **승인된 템플릿**만 보낼 수 있다.

curl -X POST "https://graph.facebook.com/v18.0/PHONE_NUMBER_ID/messages" \

-H "Authorization: Bearer ACCESS_TOKEN" \

-H "Content-Type: application/json" \

-d '{

"messaging_product": "whatsapp",

"to": "821012345678",

"type": "template",

"template": {

"name": "order_confirmation",

"language": {"code": "ko"}

}

}'

누가 WhatsApp을 쓰나

- 동남아·인도·남미·유럽 시장 비즈니스

- 글로벌 SaaS의 알림 채널

- 한국 시장에서는 비중 작음 (KakaoTalk이 지배)

12장 · LINE Messaging API

**LINE**은 일본·대만·태국에서 지배적인 메신저고, 비즈니스 봇·공식 계정은 LINE Messaging API로 만든다.

기본 흐름

1. LINE Developers에서 Provider·채널 생성

2. Messaging API 채널 활성화

3. Channel Access Token 발급

4. Webhook URL 등록

5. SDK 또는 HTTP로 메시지 전송

Node SDK 예

const config = {

channelAccessToken: process.env.LINE_ACCESS_TOKEN!,

channelSecret: process.env.LINE_CHANNEL_SECRET!,

};

const client = new Client(config);

const app = express();

app.post('/webhook', middleware(config), async (req, res) => {

const events = req.body.events;

for (const event of events) {

if (event.type === 'message' && event.message.type === 'text') {

await client.replyMessage(event.replyToken, {

type: 'text',

text: `에코: ${event.message.text}`,

});

}

}

res.sendStatus(200);

});

app.listen(3000);

Python SDK 예

from linebot import LineBotApi, WebhookHandler

from linebot.models import MessageEvent, TextMessage, TextSendMessage

from flask import Flask, request

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_ACCESS_TOKEN')

handler = WebhookHandler('YOUR_CHANNEL_SECRET')

@app.route('/webhook', methods=['POST'])

def webhook():

signature = request.headers['X-Line-Signature']

body = request.get_data(as_text=True)

handler.handle(body, signature)

return 'OK'

@handler.add(MessageEvent, message=TextMessage)

def handle_message(event):

line_bot_api.reply_message(

event.reply_token,

TextSendMessage(text=f'에코: {event.message.text}')

)

LINE Rich Menu·Flex Message

LINE의 특징은 **Rich Menu**(채팅 하단 메뉴)와 **Flex Message**(JSON DSL로 만드는 커스텀 UI). 커머스·예약·상담 봇에서 거의 표준.

LINE Bot Designer (일본)

일본에서는 **LINE Bot Designer**라는 GUI 도구로 비개발자가 Flex Message·시나리오를 만든다. 마케팅팀이 코드 없이 봇 콘텐츠를 운영하는 데 쓴다.

13장 · KakaoTalk Channel API

**KakaoTalk Channel**(카카오톡 채널)은 한국에서 비즈니스 메시지의 절대 강자다. 그런데 API 모델이 슬랙·디스코드·LINE과 꽤 다르다.

두 종류의 메시지

1. **카카오톡 채널 메시지** — 채널을 추가한 사용자에게 보내는 마케팅·소식 메시지. 별도 정책 심사.

2. **알림톡 / 친구톡** — 결제·예약·배송 같은 정보성 알림. 템플릿 사전 등록 필요. 비즈메시지 사업자(공식 SI/대행사)를 통해 발송하는 경우가 많다.

카카오 i 오픈빌더 — 챗봇 빌더

**카카오 i 오픈빌더**는 카카오톡 채널 챗봇을 만드는 공식 도구다. GUI로 시나리오·발화·블록을 설계하고, 외부 서버와 webhook으로 연결한다.

봇 응답 흐름:

1. 사용자가 채널에 메시지 전송

2. 카카오 i 오픈빌더가 발화를 분석해 적절한 블록 매칭

3. 블록이 외부 서버(스킬 서버)에 webhook 전송

4. 스킬 서버가 응답 JSON 반환

5. 카카오톡으로 메시지 송출

스킬 서버 예 (Python Flask)

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/skill/order-status', methods=['POST'])

def order_status():

data = request.json

user_id = data['userRequest']['user']['id']

utterance = data['userRequest']['utterance']

실제로는 DB 조회

status = '배송 중'

response = {

'version': '2.0',

'template': {

'outputs': [{

'simpleText': {

'text': f'주문 상태: {status}'

}

}]

}

}

return jsonify(response)

if __name__ == '__main__':

app.run(port=5000)

알림톡 발송 흐름

알림톡은 한국 정보통신망법 때문에 정보성/광고성 구분이 엄격하다. 발송 흐름:

1. 발신 프로필 등록 (사업자등록증 필요)

2. 템플릿 등록·심사 (카카오 검수, 수일 소요)

3. 승인된 템플릿으로만 발송 가능

4. 변수만 치환해서 본문 전송

한국 비즈니스가 KakaoTalk을 안 쓸 수 없는 이유

- 한국 메신저 시장 점유율 압도적

- 사용자가 일상에서 매일 쓰는 메신저

- 결제·인증·고객 응대까지 카카오 생태계로 가능

대신 정책 심사·템플릿 승인 등 운영 비용이 슬랙·디스코드보다 크다.

14장 · 한국 / 일본 — 카카오톡 채널, 라인 챗봇, KARTE Talk Bot

한국 — KakaoTalk + 알림톡 + 챗봇 빌더

한국 비즈니스 봇 스택은 거의 다음 패턴.

- 마케팅·소식: 카카오톡 채널 메시지

- 정보 알림(결제·배송·예약): 알림톡 (BSP 경유)

- 챗봇(상담·FAQ): 카카오 i 오픈빌더 + 스킬 서버

- 사내 협업: 슬랙 또는 잔디

일본 — LINE 절대 강자

일본 비즈니스 봇 스택.

- 마케팅·고객 응대: LINE 공식 계정

- 챗봇: LINE Messaging API + 자체 서버, 또는 LINE Bot Designer

- 마케팅 자동화: KARTE Talk Bot(KARTE의 챗봇 기능)

- 사내 협업: 슬랙·Microsoft Teams·Chatwork

KARTE Talk Bot — 일본 SaaS 사례

KARTE는 일본의 대형 CX(고객 경험) 플랫폼이고, 그 안에 Talk Bot이라는 챗봇 기능이 있다. 마케팅 자동화·세분화와 챗봇을 통합 운영하고 싶을 때 쓴다. 일본 EC·미디어 사이트에서 흔히 본다.

다국적 봇의 현실

글로벌 서비스를 만들면, 한 봇이 슬랙·디스코드·LINE·카카오톡·텔레그램을 모두 다뤄야 한다. 보통 다음 패턴.

1. **공통 봇 코어**: 비즈니스 로직·상태 관리·LLM 호출 — 자체 서비스.

2. **플랫폼 어댑터**: 각 플랫폼별 webhook·메시지 변환 — 얇은 레이어.

3. **메시지 정규화**: 텍스트·이미지·버튼·카드를 공통 모델로.

이걸 직접 만드는 곳도 있고, Sendbird·Customer.io·Twilio Conversations 같은 멀티 채널 SaaS를 쓰는 곳도 있다.

15장 · 누가 무엇을 골라야 하나 — 회사 슬랙 / 커뮤니티 디스코드 / 카톡 비즈니스

마지막으로 시나리오별 권장 조합.

회사 슬랙 봇 (사내 도구)

- **사내 표준 Node**: Bolt Node + Socket Mode

- **사내 표준 Python**: Bolt Python + Socket Mode

- **사내 표준 Java/Kotlin**: Bolt Java

- **시작 비용 최소화**: Socket Mode, 단일 워크스페이스 토큰

사내 협업 자체 호스팅

- **슬랙 대체 셀프 호스팅**: Mattermost + Python/Node 봇

- **오픈소스 페더레이션**: Matrix + matrix-nio

- **무료 가벼운 옵션**: Rocket.Chat + Apps Engine

커뮤니티 디스코드 봇

- **Node 팀**: discord.js

- **Python 팀**: discord.py (부활 후 안정, 신규 권장), 기존 봇이 py-cord면 유지

- **Java 팀**: JDA (정통), 리액티브 선호면 Discord4J

- **Rust 팀**: serenity

- **.NET 팀**: DSharpPlus (활발) 또는 Discord.Net (안정)

글로벌 메시지 알림

- **북미·유럽 일반 소비자**: WhatsApp Cloud API (브라질·인도 압도적)

- **일본·대만·태국**: LINE Messaging API

- **한국**: KakaoTalk Channel + 알림톡 (BSP 경유)

- **글로벌 IT/개발자**: Telegram (python-telegram-bot/aiogram/Telegraf)

한국·일본 비즈니스 통합

- **한국 B2C**: 카카오 i 오픈빌더 + 알림톡(BSP) + 사내 슬랙

- **일본 B2C**: LINE Messaging API + KARTE Talk Bot + 사내 슬랙/Teams

- **양국 운영**: 공통 봇 코어 + 플랫폼 어댑터(직접 또는 SaaS)

마이그레이션 가이드

| 현재 | 권장 이동 |

| --- | --- |

| Discord.py (2021년 이전) | 2.x로 업그레이드 (이미 부활됨) |

| Discord.py fork (py-cord) | 유지 OK, 신규는 discord.py |

| Discord.py fork (nextcord) | discord.py로 마이그레이션 고려 |

| eris (Node) | discord.js (성능 차이 작아짐) |

| node-telegram-bot-api | Telegraf (타입·생태계 우수) |

| python-telegram-bot v13 | v20+ (비동기로 개편됨) |

16장 · 마치며 — 챗봇은 인터페이스 결정이다

챗봇 프레임워크를 고르는 건 단순한 기술 결정이 아니라 **인터페이스 결정**이다. 사용자가 어떤 메신저로 우리를 만나는가, 우리 팀이 어떤 언어로 운영을 받칠 수 있는가, 그 메신저의 정책 환경에서 우리가 견딜 수 있는가.

2026년의 정리.

- **Slack**: Bolt로 통일됐다. 사내 도구의 절대 강자.

- **Discord**: 커뮤니티의 절대 강자. 언어 진영별로 다 잘 갖춰져 있다. Python은 discord.py 부활 후 안정.

- **Matrix·Mattermost·Rocket.Chat**: 셀프 호스팅·페더레이션이 필요할 때.

- **Telegram**: 개발자 커뮤니티·국제 사용자.

- **WhatsApp·LINE·KakaoTalk**: B2C·지역별. 정책 비용을 감수해야 한다.

봇을 만들지 결정할 때 마지막 질문 하나: **이 봇을 누가 1년 뒤에도 유지할 것인가?** 챗봇은 만들기는 쉽지만, 운영은 끈질기다. 사용자가 의존하기 시작하면 끄기도 어렵다. 그래서 프레임워크의 생존성·팀의 역량·메신저의 정책 안정성 — 셋 다 보고 결정해야 한다.

좋은 봇은 사용자가 봇인 줄도 모르고 쓴다. 그게 잘 만든 인터페이스다.

참고 / References

Slack

- Slack Bolt for JavaScript: https://slack.dev/bolt-js/

- Slack Bolt for Python: https://slack.dev/bolt-python/

- Slack Bolt for Java: https://slack.dev/java-slack-sdk/guides/bolt

- Slack API: https://api.slack.com/

Discord — Node

- discord.js: https://discord.js.org/

- discord.js Guide: https://discordjs.guide/

- eris: https://github.com/abalabahaha/eris

Discord — Python

- discord.py: https://github.com/Rapptz/discord.py

- discord.py 부활 공지 (2024): https://gist.github.com/Rapptz/4a2f62751b9600a31a0d3c78100287f1

- py-cord: https://github.com/Pycord-Development/pycord

- nextcord: https://github.com/nextcord/nextcord

Discord — Java/Rust/.NET

- JDA: https://github.com/discord-jda/JDA

- Discord4J: https://github.com/Discord4J/Discord4J

- serenity (Rust): https://github.com/serenity-rs/serenity

- DSharpPlus: https://github.com/DSharpPlus/DSharpPlus

- Discord.Net: https://github.com/discord-net/Discord.Net

Matrix / Mattermost / Rocket.Chat

- matrix-nio (Python): https://github.com/matrix-nio/matrix-nio

- matrix-bot-sdk (Node): https://github.com/turt2live/matrix-bot-sdk

- Mattermost API: https://api.mattermost.com/

- mattermostdriver (Python): https://vaelor.github.io/python-mattermost-driver/

- Rocket.Chat Apps Engine: https://developer.rocket.chat/

Telegram

- Telegram Bot API: https://core.telegram.org/bots/api

- python-telegram-bot: https://github.com/python-telegram-bot/python-telegram-bot

- aiogram: https://github.com/aiogram/aiogram

- Telegraf: https://github.com/telegraf/telegraf

WhatsApp / LINE / KakaoTalk

- WhatsApp Cloud API: https://developers.facebook.com/docs/whatsapp/cloud-api/

- LINE Messaging API: https://developers.line.biz/en/services/messaging-api/

- LINE Bot SDK Node: https://github.com/line/line-bot-sdk-nodejs

- LINE Bot SDK Python: https://github.com/line/line-bot-sdk-python

- 카카오 i 오픈빌더: https://i.kakao.com/openbuilder

- 카카오톡 채널 메시지 API: https://developers.kakao.com/docs/latest/ko/message/rest-api

- KARTE Talk: https://karte.io/product/talk/

현재 단락 (1/558)

2018년쯤 챗봇은 "재미있는 사이드 프로젝트"였다. 2026년에는 다르다. 회사 슬랙에는 알림 봇·배포 봇·인시던트 봇·LLM 어시스턴트가 깔려 있고, 커뮤니티 디스코드에는 모더...

작성 글자: 0원문 글자: 22,053작성 단락: 0/558