OpenAI API와 Node.js로 나만의 슬랙(Slack) AI 비서 챗봇 만들기 🤖


회사 업무를 하거나 개인 프로젝트를 진행할 때, 메신저로 슬랙(Slack)을 많이 사용하실 겁니다. 개발을 하다가 궁금한 점이 생길 때마다 슬랙 창을 내리고 브라우저를 켜서 ChatGPT에 접속하는 과정, 은근히 번거롭지 않으신가요?

오늘은 유료 AI 구독 서비스를 결제할 필요 없이, 가장 저렴하고 똑똑한 **OpenAI API(GPT-4o 등)**를 내 슬랙 개인 채널이나 회사 워크스페이스에 직접 연동하는 방법을 튜토리얼 형식으로 소개합니다.

단순히 질문에 복붙 대답하는 것을 넘어, “번역기 모드”, “코드 리뷰 모드” 등 내 입맛대로 프롬프트를 주조명령(System Prompt)할 수 있다는 것이 커스텀 봇의 가장 큰 매력입니다.


🛠️ 준비물

이 실습을 따라오기 위해 딱 3가지가 필요합니다.

  1. Node.js가 설치된 환경 (간단한 Express 서버를 띄울 예정입니다.)
  2. OpenAI API Key (platform.openai.com 에 카드 등록 후 발급)
  3. 관리자 권한이 있는 (또는 개인용) Slack 워크스페이스

Step 1. 슬랙 앱(Bot) 생성 및 토큰 발급받기

슬랙은 자체적으로 커스텀 앱 개발을 매우 잘 지원합니다.

  1. Slack API 페이지(api.slack.com/apps)에 접속하여 우측 상단의 **[Create New App]**을 클릭합니다.
  2. From scratch를 선택하고 앱 이름(예: MyAIAssistant)과 연동할 워크스페이스를 고릅니다.
  3. 좌측 메뉴 **[OAuth & Permissions]**로 들어가서 Bot Token Scopes에 다음 두 가지 권한을 추가합니다.
    • app_mentions:read : 봇을 태그(@봇이름)했을 때 반응하기 위함
    • chat:write : 봇이 슬랙 채널에 메시지를 전송하기 위함
  4. 스크롤을 위로 올려 **[Install to Workspace]**를 클릭해 권한을 승인하면 xoxb-로 시작하는 Bot User OAuth Token이 발급됩니다. 이 토큰을 안전하게 메모해 둡니다.

Step 2. 이벤트 리스너(Socket Mode) 설정하기

보통 외부 서비스가 슬랙 메시지를 받으려면 퍼블릭(Public) URL과 웹훅(Webhook) 서버가 필요하지만, 로컬 환경에서 테스트하기 가장 쉬운 방법은 **Socket Mode(소켓 모드)**를 키는 것입니다.

  1. 좌측 메뉴 **[Socket Mode]**로 가서 토글을 On으로 바꿉니다.
  2. 이 과정에서 xapp-로 시작하는 App-Level Token이 하나 더 발급되는데, 이 값도 메모장(또는 .env 환경변수)에 저장해 둡니다.
  3. 좌측 메뉴 **[Event Subscriptions]**로 이동해 Enable Events를 활성화하고, Subscribe to bot events 항목에 app_mention을 추가한 후 제일 아래 Save Changes를 꼭 눌러줍니다.

Step 3. Node.js 소스 코드 작성

이제 실전 코딩입니다! 빈 폴더를 만들고 봇 구동에 필요한 모듈들을 설치합니다. (슬랙 공식 SDK인 bolt 패키지를 사용하면 코드가 획기적으로 줄어듭니다.)

npm init -y
npm install @slack/bolt openai dotenv

그리고 프로젝트 루트에 index.js 파일을 만들고 아래 코드를 붙여넣습니다.

// index.js
require('dotenv').config();
const { App } = require('@slack/bolt');
const OpenAI = require('openai');

// OpenAI 인스턴스 초기화
const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

// Slack Bolt 앱 초기화 (웹서버 없이 Socket Mode로 구동)
const slackApp = new App({
  token: process.env.SLACK_BOT_TOKEN, // xoxb- 토큰
  appToken: process.env.SLACK_APP_TOKEN, // xapp- 토큰
  socketMode: true,
});

// 누군가 슬랙 채널에서 @봇이름 으로 태그(멘션)했을 때 실행되는 리스너
slackApp.event('app_mention', async ({ event, say }) => {
  try {
    // 1. 유저가 보낸 메시지 텍스트 
    const userMessage = event.text;

    // 2. OpenAI API 호출 (가스라이팅: 시스템 프롬프트 부여)
    const response = await openai.chat.completions.create({
      model: "gpt-4o-mini", // 비용 통제를 위해 4o-mini 등 활용
      messages: [
        { role: "system", content: "너는 친절하고 명확한 IT 개발 시니어 멘토야. 무조건 빈말 없이 실무적인 코드나 해결책으로 대답해줘." },
        { role: "user", content: userMessage }
      ],
    });

    // 3. 지피티의 답변 추출
    const replyText = response.choices[0].message.content;

    // 4. 슬랙 채널(요청이 온 해당 thread)에 답변 전송
    await say({
      text: replyText,
      thread_ts: event.ts // 쓰레드(댓글)로 답장 달기
    });

  } catch (error) {
    console.error("OpenAI 호출 중 에러 발생:", error);
    await say("미안해요, 뇌(API)에 과부하가 걸렸네요. 로그를 확인해 주세요! 🥲");
  }
});

// 봇 서버 실행
(async () => {
  await slackApp.start();
  console.log('⚡️ 삐리비리.. AI 슬랙 봇이 구동되었습니다!');
})();

이 코드와 함께 같은 폴더에 .env 파일을 만들고 방금 발급받은 3개의 키값을 채워 넣어주면 코딩이 끝납니다.

OPENAI_API_KEY=sk-어쩌고저쩌고
SLACK_BOT_TOKEN=xoxb-어쩌고저쩌고
SLACK_APP_TOKEN=xapp-어쩌고저쩌고

🚀 Step 4. 실행 및 테스트

터미널에서 node index.js 명령어를 쳐서 서버를 구동합니다. 콘솔에 “봇이 구동되었습니다!” 로그가 뜨면 성공입니다.

이제 내 슬랙 채널로 들어가서 앱 메뉴에서 내가 만든 봇(MyAIAssistant)을 채널 목록에 초대한 뒤, 태그 메시지를 날려봅니다.

@MyAIAssistant 안녕? 리액트훅스 UseEffect 개념을 3줄로 설명해 줘.

몇 초 뒤 슬랙 쓰레드 알림이 울리며 시니어 개발자 톤으로 무장한 GPT 모델이 깔끔한 답변을 달아주는 것을 목격하실 수 있을 겁니다.

API 기반으로 동작하기 때문에 달러($) 충전 비용은 월 십 원~백 원 단위로 매우 저렴한데 성능은 유료 구독 못지않습니다. 여유가 된다면 DALL-E 이미지 생성 API 라우트를 추가하거나, 특정 폴더의 문서를 읽고 대답하는 RAG 봇으로까지 고도화시켜 보시기 바랍니다!