피드로 돌아가기
강남언니 공식 블로그Backend
원문 읽기
타입스크립트로 슬랙 앱(봇) 만들기 - 기초편
강남언니가 TypeScript와 Express를 기반으로 Slack Events API를 활용해 메시지 수신·발신 기능을 갖춘 Slack 봇 구현
AI 요약
Context
Slack은 서드파티 앱 방식으로 외부 시스템의 액션을 Slack으로 전달하거나 Slack 내 사용자 액션을 외부 시스템으로 전달할 수 있는 통합 플랫폼이다. 강남언니는 Slack을 사내 메신저로 사용하면서 Jira 티켓 생성, 빌드 배포, 점심 팀 매칭 등 다양한 업무 자동화를 필요로 했다.
Technical Solution
- Node.js + TypeScript 환경에서 Express 웹 서버 구축:
createServer(app).listen(3000)으로 로컬 웹 서버 실행 - @slack/events-api 모듈을 통한 이벤트 어댑터 생성:
createEventAdapter(CONFIG.SIGNING_SECRET)로 Slack 서명 검증 자동화 - message 이벤트 구독 및 콜백 함수 등록:
slackEvents.on('message', async (event) => {})로 메시지 수신 처리 - ngrok을 사용한 로컬호스트 외부 노출:
ngrok http 3000으로 localhost:3000을 외부 URL(예: http://5c943fb2.ngrok.io)로 매핑 - Slack Event Subscriptions 페이지에서 Request URL 등록: ngrok 외부 URL과 /slack/events 엔드포인트 연결로 요청 검증(Verified 표시)
- @slack/web-api 모듈과 WebClient 인스턴스를 통한 메시지 발송:
webClient.chat.postMessage({text: '안녕하세요!', channel: event.channel})로 조건부 응답 메시지 전송 - Slack 앱 설치 시 Bot User OAuth Access Token과 Signing Secret을 config/bot.json에 저장: 환경 변수 대신 JSON 파일로 관리
- chat:write 스코프 추가: Event Subscriptions 페이지에서 필수 권한 설정 후 앱 재설치
Key Takeaway
Slack Events API와 Express를 조합하면 Webhook 기반 실시간 이벤트 처리가 가능하며, ngrok과 같은 터널링 도구로 개발 중 로컬 환경과 Slack 서버를 직접 연결하여 빠른 반복 개발이 가능하다. Slack 앱의 권한 관리(스코프)는 기능 추가 후 재설치가 필요하므로 설계 단계에서 필요한 모든 권한을 사전에 정의하는 것이 효율적이다.
실천 포인트
TypeScript 기반 Slack 봇 개발 시 @slack/events-api와 @slack/web-api를 함께 사용하면 메시지 수신과 발송을 각각 이벤트 리스너와 WebClient 메서드로 분리하여 구현할 수 있으며, Slack API 사이트의 Event Subscriptions와 Install App 페이지에서 순차적으로 URL 검증 → 이벤트 구독 → 스코프 설정 → 앱 설치를 진행하면 처음부터 동작하는 Slack 앱을 단계별로 구축할 수 있다.