본문 바로가기
실무/슬랙 봇 만들기

슬랙 봇 만들기: 구조 설계부터 모듈화까지

by davi_kr 2025. 4. 6.
반응형

슬랙 봇을 만들 때, 한 페이지에 모든 코드를 다 넣었더니 가독성, 유지보수 문제가 있었습니다.

이번 포스팅에선 이 문제를 해결하기 위한 초기 폴더 구조, 이벤트 핸들러 모듈화, 공통 유틸 관리 방법 등에 대해 다뤄보려 합니다.

 

1. 기본 폴더 구조 설계

모든 파일을 app.py에 다 넣어도 앱은 작동합니다. 다만, 기능이 추가될수록 가독성도 떨어지고 유지보수가 어려워집니다.

기존에 만들었던 app인데 그냥 주구장창 넣었더니 app.py 파일이 500줄도 더 넘었습니다. 어디서 뭘 찾아야 하는지도 모르게 확장된 상태...

이 문제를 해결하고자 기존에 있던 기능들을 아래와 같은 구조로 나눴습니다.

slack_bolt_app/(예시)
│
├── app.py                        # 앱의 진입점
├── config.py                    # 환경변수 불러오는 곳
├── .env                         # 실제 토큰 등 민감정보
│
├── events/                      # 슬랙 메시지 이벤트 핸들러
│   ├── __init__.py
│   └── cancel_noti_event.py     # 예: @app.message()로 시작하는 핸들러
│
├── utils/                       # 공통 함수 모음
│   ├── __init__.py
│   └── db_connection.py         # 예: query_to_df, query_to_list 등
│
└── sql/                         # 쿼리를 따로 분리
│
└── templates/                   # 텍스트 템플릿을 따로 분리

2. app.py는 어떻게 생겼을까?

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from config import DAVI_SLACK_BOT_TOKEN, DAVI_SLACK_APP_TOKEN
from events.cancel_noti_event import register_cancel_noti_event

app = App(token=DAVI_SLACK_BOT_TOKEN)

# 이벤트 핸들러 등록
register_cancel_noti_event(app)

if __name__ == "__main__":
    SocketModeHandler(app, DAVI_SLACK_APP_TOKEN).start()

예시로 더 줄여서 적어봤습니다.

아래는 실제 작업 중인 화면인데, 아마 기능이 더 추가 되어도 50줄까지는 안 갈 것 같습니다.

이미 500줄이랑 비교하면 10% 이내로 줄여내서 보기가 훨씬 좋아졌습니다.

여기서 핵심은 register_cancel_noti_event(app)와 같이 원하는 기능을 따로 빼서 관리한다는 것입니다.

이것을 모듈화라고 하는데, 모듈화란 '프로그램을 기능 단위로 분할하여 관리하는 것'을 의미합니다.

3. 이벤트 핸들러는 어떻게 생겼을까?

def register_cancel_noti_event(app):
    @app.message("[테스트!]")
    def test_event(say, body):
        say("이벤트 테스트 성공!")

원래는 app.py에서 @app.message 이런 식으로 직접 사용했다면, 이제 기능별로 나눠놨기에 별도의 경로에 위치한 파일에서 함수형태로 해당 기능을 구현해놨습니다.

이런 식으로 구현해두면 추가하려는 이벤트가 많아지더라도 app.py에서는 딱 이벤트 리스트를 일목요연하게 볼 수 있고

마찬가지로 작업하려는 이벤트만 특정해서 분리된 파일에서 보기 때문에 수월한 유지보수가 가능해집니다.

4. config.py는 어떻게 생겼을까?

import os
from dotenv import load_dotenv

load_dotenv()

DAVI_SLACK_BOT_TOKEN = os.getenv("DAVI_SLACK_BOT_TOKEN")
DAVI_SLACK_APP_TOKEN = os.getenv("DAVI_SLACK_APP_TOKEN")

 

api키는 보안을 위해 .env라는 곳에 저장해두고 이쪽에서 해당 값들을 불러오도록 설계했습니다.

 

혹시나 api key가 없다면, 슬랙 봇 셋팅 자체가 안 되어있을 가능성이 크니 아래 포스팅을 참고해보면 좋을 것 같습니다.

2023.04.14 - [실무/슬랙 봇 만들기] - 파이썬 슬랙 봇 만들기(1): 봇 메세지 보내기

5. .env는 어떻게 생겼을까?

DAVI_SLACK_BOT_TOKEN=봇 키
DAVI_SLACK_APP_TOKEN=앱 키

.env 파일에 키 값들을 저장해둡니다.

그리고 github 같은 곳에는 올라가지 않도록 .gitignore 파일에 .env를 추가해둡니다.

6. 실행 결과

위와 같이 셋팅을 끝마치고 app.py에서 실행을 누르고 슬랙 채널에서 [테스트!]라고 입력해보면 아래와 같이 잘 작동하는 걸 볼 수 있습니다.

 

이렇게 만들어보니 확실히 딱 필요한 것만 볼 수 있는게 큰 장점이란 생각이 들었습니다.

다만, 이것도 양이 엄청 많아지면 어느 단위로 모듈화할지에 대한 이견이 있을 수 있겠다는 생각도 같이 듭니다.

혼자서 작업 할 때도 오늘은 이 정도 기능 단위로 나눠야지 생각했다가 나중에는 이 정도 기능까지로 나눠야지 할 수 있겠다 싶습니다.

만약, 다수의 공동 작업물이라면 더더욱 그럴 수 있겠다 싶어 모듈화를 어떤 식으로 한다는 정의도 중요하겠다 싶습니다.

반응형

댓글