Slack Bolt SDK 기초
앱 초기화, 봇 토큰, 소켓 모드와 HTTP의 차이, 이벤트 구독을 다룹니다.
Slack Bolt SDK 기초은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
에이전트 개발에 Slack Bolt를 사용하는 이유
Slack Bolt는 Slack 앱을 만들기 위한 공식 Python SDK입니다. OAuth, 이벤트 라우팅, 미들웨어, 요청/응답 수명 주기를 처리하므로 에이전트는 HTTP 기반 작업이 아니라 비즈니스 로직에 집중할 수 있습니다. Bolt는 Socket Mode(WebSocket)와 HTTP Mode를 모두 지원합니다.
# Install Slack Bolt
# pip install slack-bolt
# Slack Bolt handles:
# - Event subscriptions (messages, mentions, reactions)
# - Slash commands (/summarize, /ask)
# - Interactive components (buttons, modals, select menus)
# - Shortcuts (global and message shortcuts)
# - OAuth 2.0 for multi-workspace apps
# - Request signature verification (security)
print('Slack Bolt is the official Python SDK for Slack apps')봇 토큰 및 서명 비밀
Slack 앱에는 두 가지 인증 정보가 필요합니다. 하나는 API 호출과 메시지 게시에 사용하는 봇 토큰(xoxb-로 시작)이고, 다른 하나는 수신 이벤트가 실제로 Slack에서 온 것인지 확인하는 서명 비밀입니다. 두 정보 모두 Slack 앱 설정 대시보드에서 찾을 수 있습니다.
import os
from slack_bolt import App
# Load credentials from environment variables
# Never hardcode tokens!
BOT_TOKEN = os.environ['SLACK_BOT_TOKEN'] # xoxb-...
SIGNING_SECRET = os.environ['SLACK_SIGNING_SECRET'] # hex string
# Initialize the Bolt app
app = App(
token=BOT_TOKEN,
signing_secret=SIGNING_SECRET
)
print('Slack Bolt app initialized')
print(f'Bot token prefix: {BOT_TOKEN[:10]}...')필수 봇 토큰 권한 범위
Slack 앱은 OAuth 권한 범위를 사용하여 봇이 수행할 수 있는 작업을 정의합니다. Slack 앱 대시보드의 OAuth 및 권한 → 권한 범위 → 봇 토큰 권한 범위에서 권한 범위를 추가하세요. AI 에이전트 봇에 일반적으로 필요한 권한 범위는 다음과 같습니다.
chat:write— 메시지 게시app_mentions:read— @mentions 수신channels:history— 채널 메시지 읽기commands— 슬래시 명령 수신im:write— 다이렉트 메시지 전송
# Required scopes for a typical AI agent bot:
# - chat:write → post messages to channels
# - app_mentions:read → receive @bot mentions
# - channels:history → read message history
# - channels:read → list channels
# - commands → handle slash commands
# - im:write → send DMs
# - im:read → receive DMs
# - users:read → get user info (name, email)
# Add these in Slack App settings:
# https://api.slack.com/apps -> Your App -> OAuth & Permissions
print('Configure scopes in Slack App dashboard before installing')Socket Mode와 HTTP Mode 비교
Socket Mode는 지속적인 WebSocket 연결을 통해 Slack에 연결하므로 공개 URL이 필요하지 않습니다. 따라서 개발 및 내부 도구에 적합합니다. HTTP Mode는 Slack이 이벤트를 POST할 공개 HTTPS 엔드포인트가 필요하므로 운영 앱과 여러 워크스페이스 설치에 필요합니다.
# SOCKET MODE (development / internal tools):
# - No public URL needed
# - Uses an App-Level Token (xapp-...)
# - Great for local development
from slack_bolt.adapter.socket_mode import SocketModeHandler
APP_TOKEN = os.environ['SLACK_APP_TOKEN'] # xapp-...
handler = SocketModeHandler(app, APP_TOKEN)
# handler.start() # blocks and handles events
# HTTP MODE (production):
# - Requires public HTTPS URL configured in Slack app settings
# - Works with Flask, FastAPI, etc.
from slack_bolt.adapter.flask import SlackRequestHandler
from flask import Flask, request
flask_app = Flask(__name__)
slack_handler = SlackRequestHandler(app)
print('Socket Mode: dev/internal; HTTP Mode: production')앱 초기화 및 Socket Mode 시작
Socket Mode에서 사용하는 최소 Slack Bolt 앱은 다음과 같습니다. App을 만들고, 하나 이상의 핸들러를 등록한 다음, SocketModeHandler를 시작합니다. 핸들러는 Slack의 이벤트 인프라에 연결되고 프로세스를 중지할 때까지 연결을 유지합니다.
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
app = App(
token=os.environ['SLACK_BOT_TOKEN'],
signing_secret=os.environ['SLACK_SIGNING_SECRET']
)
@app.event('app_mention')
def handle_mention(event, say):
user = event['user']
text = event['text']
say(f'Hi <@{user}>! You said: {text}')
# Start the app
if __name__ == '__main__':
handler = SocketModeHandler(
app,
os.environ['SLACK_APP_TOKEN']
)
handler.start() # blocks until process is killedngrok을 사용한 테스트(HTTP Mode)
HTTP Mode로 개발할 때는 ngrok을 사용하여 로컬 서버를 인터넷에 공개하세요. ngrok http 3000을 실행하여 공개 HTTPS URL을 얻은 다음, Slack 앱의 이벤트 구독 및 슬래시 명령 URL이 해당 URL을 가리키도록 업데이트하세요.
# HTTP mode setup with Flask:
from flask import Flask, request
from slack_bolt import App
from slack_bolt.adapter.flask import SlackRequestHandler
import os
app = App(
token=os.environ['SLACK_BOT_TOKEN'],
signing_secret=os.environ['SLACK_SIGNING_SECRET']
)
@app.event('app_mention')
def handle_mention(event, say):
say('Hello from HTTP mode!')
flask_app = Flask(__name__)
handler = SlackRequestHandler(app)
@flask_app.route('/slack/events', methods=['POST'])
def slack_events():
return handler.handle(request)
# Run: python app.py
# In another terminal: ngrok http 3000
# Set https://abc123.ngrok.io/slack/events as your Request URL in SlackSocket Mode용 앱 수준 토큰
Socket Mode에는 connections:write 권한 범위가 포함된 추가 앱 수준 토큰(xapp-로 시작)이 필요합니다. 이 토큰은 봇 토큰과 별개입니다. Slack 앱 설정의 기본 정보 → 앱 수준 토큰에서 생성하세요.
# App-Level Token setup:
# 1. Go to https://api.slack.com/apps -> Your App
# 2. Click 'Basic Information'
# 3. Scroll to 'App-Level Tokens'
# 4. Click 'Generate Token and Scopes'
# 5. Name it 'socket-mode-token'
# 6. Add scope: connections:write
# 7. Click 'Generate'
# 8. Copy the xapp-... token
# In your .env file:
# SLACK_BOT_TOKEN=xoxb-...
# SLACK_SIGNING_SECRET=abc123...
# SLACK_APP_TOKEN=xapp-...
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os
handler = SocketModeHandler(
app=app,
app_token=os.environ['SLACK_APP_TOKEN'] # xapp-...
)
print('App-Level Token required for Socket Mode')Bolt 미들웨어
Bolt는 모든 이벤트 핸들러보다 먼저 실행되는 함수인 미들웨어를 지원합니다. 미들웨어를 사용하여 로그 기록, 인증, 요청 빈도 제한 또는 사용자 데이터로 이벤트 보강을 처리하세요. 다음 미들웨어나 핸들러로 제어를 넘기려면 next()를 호출하세요.
from slack_bolt import App
import time
import logging
app = App(
token=os.environ['SLACK_BOT_TOKEN'],
signing_secret=os.environ['SLACK_SIGNING_SECRET']
)
logger = logging.getLogger(__name__)
# Request logging middleware
@app.middleware
def log_request(logger, body, next):
event_type = body.get('event', {}).get('type', 'unknown')
start = time.time()
logger.info(f'Incoming event: {event_type}')
next() # must call next() to continue
elapsed = time.time() - start
logger.info(f'Handled {event_type} in {elapsed:.2f}s')
print('Middleware runs before every event handler')Bolt의 오류 처리
@app.error로 전역 오류 핸들러를 등록하여 이벤트 핸들러에서 처리되지 않은 예외를 포착하세요. 이렇게 하면 앱이 중단되는 것을 방지하고, 오류를 기록하거나 모니터링 채널에 알리거나 사용자에게 오류 메시지를 다시 보낼 수 있습니다.
from slack_bolt import App
import traceback
app = App(
token=os.environ['SLACK_BOT_TOKEN'],
signing_secret=os.environ['SLACK_SIGNING_SECRET']
)
@app.error
def custom_error_handler(error, body, logger):
logger.error(f'Error handling event: {error}')
logger.error(traceback.format_exc())
# Try to notify the user who triggered the error
event = body.get('event', {})
channel = event.get('channel')
if channel:
app.client.chat_postMessage(
channel=channel,
text='Sorry, I encountered an error. The team has been notified.'
)
print('Global error handler prevents unhandled crashes')Slack Web API 클라이언트 사용
app.client 속성을 사용하면 이벤트 핸들러에서 다루지 않는 작업에도 Slack Web API에 직접 액세스할 수 있습니다. 이를 통해 프로그래밍 방식으로 메시지를 게시하고, 파일을 업로드하고, 사용자를 채널에 초대하거나, 채널 기록을 가져올 수 있습니다.
from slack_bolt import App
app = App(
token=os.environ['SLACK_BOT_TOKEN'],
signing_secret=os.environ['SLACK_SIGNING_SECRET']
)
# Use app.client for direct API calls
def post_to_channel(channel_id, text):
result = app.client.chat_postMessage(
channel=channel_id,
text=text
)
print(f'Message posted: ts={result["ts"]}')
return result
# Get channel list
def list_channels():
result = app.client.conversations_list(
types='public_channel',
limit=100
)
channels = result['channels']
print(f'Found {len(channels)} public channels')
return channels
# Look up user info
def get_user(user_id):
result = app.client.users_info(user=user_id)
return result['user']환경 설정 체크리스트
Slack 봇을 공개하기 전에 다음 설정 체크리스트를 확인하여 올바르게 구성되었는지 확인하세요.
- 환경 변수에 봇 토큰 및 서명 비밀 설정
- Slack 앱 대시보드에 필수 권한 범위 추가
- 이벤트 구독 활성화(app_mention, message.im 등)
- Socket Mode 활성화(또는 HTTP Mode용 공개 URL 설정)
- 워크스페이스에 앱 설치(OAuth 흐름 완료)
import os
from slack_bolt import App
def verify_slack_setup():
required_env = [
'SLACK_BOT_TOKEN',
'SLACK_SIGNING_SECRET',
'SLACK_APP_TOKEN'
]
missing = [var for var in required_env if not os.environ.get(var)]
if missing:
raise EnvironmentError(f'Missing env vars: {missing}')
token = os.environ['SLACK_BOT_TOKEN']
if not token.startswith('xoxb-'):
raise ValueError('SLACK_BOT_TOKEN must start with xoxb-')
app_token = os.environ['SLACK_APP_TOKEN']
if not app_token.startswith('xapp-'):
raise ValueError('SLACK_APP_TOKEN must start with xapp-')
print('Slack environment setup looks correct!')
verify_slack_setup()빠른 확인: Socket Mode와 HTTP Mode 비교
Slack Bolt 배포 모드에 대한 이해도를 확인해 보세요.
Slack Bolt 기본 사항 복습
Bolt로 Slack 봇을 만들기 위한 기초를 익혔습니다.
- App(token, signing_secret) — 환경 변수의 인증 정보로 Bolt 앱 초기화
- API 호출에는 봇 토큰(
xoxb-) 사용, Socket Mode에는 앱 수준 토큰(xapp-) 사용 - Socket Mode — WebSocket을 사용하며 공개 URL이 필요 없고 개발 및 내부 도구에 적합
- HTTP Mode — 공개 HTTPS 엔드포인트를 사용하며 운영 및 여러 워크스페이스 앱에 필요
- 권한 범위 — Slack 앱 대시보드에서 구성하고 필요한 항목만 추가
- 로그 기록, 검증 및 오류 처리를 위한 미들웨어와 @app.error
자주 묻는 질문
“Slack Bolt SDK 기초” 강의는 무료인가요?
네 — “Slack Bolt SDK 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“Slack Bolt SDK 기초”에서 뭘 배우나요?
앱 초기화, 봇 토큰, 소켓 모드와 HTTP의 차이, 이벤트 구독을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“Slack Bolt SDK 기초” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Slack Bolt SDK 기초
- 이벤트 및 슬래시 명령 수신
- 메시지 및 서식 있는 블록 보내기
- 팀 알림 봇 만들기