목차
슬랙 봇을 만들 때, 한 페이지에 모든 코드를 다 넣었더니 가독성, 유지보수 문제가 있었습니다.
이번 포스팅에선 이 문제를 해결하기 위한 초기 폴더 구조, 이벤트 핸들러 모듈화, 공통 유틸 관리 방법 등에 대해 다뤄보려 합니다.
1. 기본 폴더 구조 설계
모든 파일을 app.py에 다 넣어도 앱은 작동합니다. 다만, 기능이 추가될수록 가독성도 떨어지고 유지보수가 어려워집니다.

이 문제를 해결하고자 기존에 있던 기능들을 아래와 같은 구조로 나눴습니다.
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에서 실행을 누르고 슬랙 채널에서 [테스트!]라고 입력해보면 아래와 같이 잘 작동하는 걸 볼 수 있습니다.

이렇게 만들어보니 확실히 딱 필요한 것만 볼 수 있는게 큰 장점이란 생각이 들었습니다.
다만, 이것도 양이 엄청 많아지면 어느 단위로 모듈화할지에 대한 이견이 있을 수 있겠다는 생각도 같이 듭니다.
혼자서 작업 할 때도 오늘은 이 정도 기능 단위로 나눠야지 생각했다가 나중에는 이 정도 기능까지로 나눠야지 할 수 있겠다 싶습니다.
만약, 다수의 공동 작업물이라면 더더욱 그럴 수 있겠다 싶어 모듈화를 어떤 식으로 한다는 정의도 중요하겠다 싶습니다.
'실무 > 슬랙 봇 만들기' 카테고리의 다른 글
파이썬 슬랙 봇 만들기(3-5): 파일 전송하기 > 슬랙에 자동으로 파일 업로드하기 (0) | 2023.04.18 |
---|---|
파이썬 슬랙 봇 만들기(3-4): 파일 전송하기 > 견적서 생성 모달 창 만들기 (0) | 2023.04.18 |
파이썬 슬랙 봇 만들기(3-3): 파일 전송하기 > 모달 드롭다운 만들기 (0) | 2023.04.18 |
파이썬 슬랙 봇 만들기(3-2): 파일 전송하기 > 드롭다운 메뉴 만들기 (0) | 2023.04.18 |
파이썬 슬랙 봇 만들기(3-1): 파일 전송하기 (0) | 2023.04.16 |
댓글