Intro


매일 점심, 저녁 시간에 메뉴를 고르는 것도 일입니다..
게다가 저와 같은 선택 장애(?)를 앓고 계신 분들은 더더욱이죠.
차라리 누군가가 "오늘은 이거 어때?" 하며 말해주는 게 더 편할 것 같아요..
그래서 메뉴를 추천해주는 프로그램을 만들어 보았습니다!
DevTycoon 스터디에서 협업 툴로 이용 중인 Slack을 이용해 보았는데요.
서툴지만 재미있었던 저의 Bot 개발 후기를 들려 드리겠습니다.

Dev Environment


  • Mac OS
  • Python==3.6.5
  • Anaconda
  • Slack
  • Heroku

Concept


맛집 정보는 어디에서, 어떻게 가져올까?

평소에 저는 주변 사람들이 "ㅇㅇ 맛집 찾아봐"하면 가장 먼저 켰던 게, 네이버였습니다.
네이버에 "선릉 맛집"을 검색하면 다음과 같이 친절하게 알려 줍니다.

_2019-04-13__4.59.43.png

물론 지역 기반 맛집 정보를 알려주는 수많은 웹과 앱이 있지만, 가장 귀찮을 때 쉽게 접근할 수 있었던 사이트가 네이버이기 때문에 이곳에서 맛집 정보를 긁어 오자고 생각했습니다.
또한 그저 "(지역명) 맛집"으로 검색해도 꽤 괜찮은 정보들이 리스트로 보여지기 때문에 크롤링 하기에도 쉬울 것 같습니다.
여러 기능을 추가하고 싶었지만, 복잡한 기능(추후에 추가 예정)들은 우선 모두 제쳐 두고 가장 간단한 기능(지역 기반 맛집 상위 50개의 리스트를 가져와서 랜덤하게 맛집을 추천해주는 기능)만 우선 구현하기로 하였습니다.

Slack bot의 이름

개발할 땐 네이밍이 가장 중요하죠 ^ㅁ^
맛집을 추천해주는 친구이기 때문에, 그에 걸맞는 이름을 지어 주고 싶었습니다.
고민 끝에, 평소에 좋아하던 미식가 이영자님❤️의 이름을 따기로 했습니다. (덕분에 봇의 신뢰감이 높아졌다.)

Process


Slack Bot

Slack에서는 Bot을 개발할 수 있는 API를 제공 해주기 때문에 각자 입맛에 맞는 Bot을 직접 개발하여 유용하게 사용할 수 있습니다. 링크를 타고 document에 들어 가 봅시다.

Bot 생성하기

문서를 읽다 보면 Creating a bot user 부분이 있습니다.

_2019-04-13__5.28.40.png

요기서 app's settings page를 클릭 해주세요.

_2019-04-13__5.27.31.png

Your Apps 페이지에서, Create New App을 클릭합니다.

_2019-04-13__5.29.53.png

App Name에 앱 이름을 적고, Development Slack Workspace에는 App을 추가할 Slack Workspace를 선택 해줍니다.
Create App을 누르면 App이 추가된 것을 확인할 수 있습니다!
좌측 메뉴에서 Install App을 선택 후, Bot User OAuth Access Token을 복사 하시고 환경 변수에 추가 해주세요.
이 토큰으로 Bot User ID를 가져올거에요.

_2019-04-13__5.44.25.png

User ID 얻기

저는 Anaconda를 이용해서 yeongja라는 가상 환경을 구축했어요.
가상 환경 생성에 대한 설명은 넘어가도록 하겠습니다.
자, 가상 환경을 구축했다면 실행 후에 Slack Bot API를 설치해줍니다.

(yeongja) $ pip install slackclient

앞서 생성한 Slack Bot과 통신을 하기 위해서는 User ID가 필요합니다.
복사해 두었던 Bot 토큰을 이용해 얻어볼까요?

(yeongja) $ curl https://yeongja.slack.com/api/auth.test?token=Bot_User_OAuth_Access_Token

결과는 다음과 같이 json형식으로 나옵니다.
user_id 또한 환경 변수로 설정해 주도록 합시다.

{"ok":true,"url":"https:\/\/dev-tycoon.slack.com\/","team":"DevTycoon","user":"yeongja","team_id":"TEKSU...","user_id":"UGS76..."}

이제 Bot을 만들기 위한 기초적인 설정은 모두 끝났습니다!
저는 Slack Bot 개발을 위한 스크립트를 참고하여 진행하였습니다. (링크 참조)

Slack-starterbot

스크립트가 어떻게 구성 되어 있는지 간단하게 살펴보면 다음과 같습니다.

  1. 환경 변수로 저장해 둔 Slack Bot Token을 가져와 SlackClient 라이브러리를 통해 객체화 합니다.
  2. rtm_connect 함수로 Bot 연결을 시도합니다.
  3. Web API 함수 auth.test로부터 봇의 user ID를 읽습니다.
  4. Slack RTM API에서 오는 이벤트 목록을 분석하여 명령에 해당되는 구문이 있는지 확인합니다.
  5. 명령을 찾으면 그에 해당되는 동작을 합니다.

기능 구현하기

핵심 동작을 하는 부분인 handle_command 함수에 원하는 기능을 넣어 주면 됩니다.
Github 저장소를 참고하시면 조금이나마.. 도움이 되실 거에요 :D

Bot 실행하기

저장한 스크립트를 실행해 봅시다!

python yeongja.py

_2019-05-04__12.03.58.png

영자님이 친절하게 맛집을 알려 주시네요.
자, 그럼 이제 배포를 해서 언제나 사용할 수 있도록 해볼까요?

Heroku

heroku는 호스팅을 도와주는 클라우드 PaaS입니다.
저는 DevTycoon 멘토님께서 추천 해주셔서 접하게 되었어요.
여러 프로그래밍 언어(Ruby, PHP, Python, Node.js...)를 지원해주고, CI/CD까지 도와주기 때문에 쉽게 배포하고 관리할 수 있다고 해요!
또한 (제약 조건이 있으나) 무료로 배포해 볼 수 있어서 토이 프로젝트나 연습용으로 사용하기에 제격입니다.

Heroku로 Slack Bot 배포하기

저는 python으로 구현하였기 때문에 이 문서를 보며 시작했습니다.

스크린샷 2019-05-04 오전 12.27.43.png

I'm ready to start 버튼을 누르면 OS를 선택하는 화면이 나옵니다.

스크린샷 2019-05-04 오전 12.28.31.png

각자 OS에 맞는 heroku를 다운받았다면 터미널에서 heroku login을 해줍니다.

$ heroku login

성공적으로 로그인 되었다면, 프로젝트의 루트 폴더에서 heroku create를 합니다.

$ heroku create

루트 폴더에는 Slack bot 관련 라이브러리 설정이 포함된 requirements.txt가 있어야 해요.

beautifulsoup4==4.7.1
slackclient==1.3.1

또한 Procfile에 어떤 스크립트를 실행할지 명시해 주어야 합니다.

worker: python yeongja.py

배포하기 전에, 제가 헤맸던 부분이 있었는데 바로 환경 변수 설정이었습니다.
앞서 환경 변수로 저장 했던 토큰 기억 나시죠?
우리는 이제 heroku 서버에 배포하여 사용할 것이기 때문에 서버에 환경 변수를 저장해 주어야 해요.

$ heroku config:set SLACK_BOT_TOKEN=xoxb-495912072293...

환경 변수 설정까지 완료 되었다면 자, 이제 배포해 봅시다!

$ git push heroku master

정상적으로 배포 되었는지 확인해 볼까요?

$ heroku ps:scale worker=1

위 명령어를 치면 방금 배포한 worker 인스턴스 하나가 동작하고 있다는 것을 알 수 있습니다.
이제 어디서든 영자님께 맛집을 추천 받을 수 있게 되었어요!
Heroku의 공식 문서 중 Slack Bot을 배포하는 방법이 자세히 나와 있습니다. (아래 링크 참고)
문서에 배포 과정이 매우 자세히 나와 있으니 문제 없이 따라 하실 수 있을 거에요!
다음은 yeongja bot의 deploy pipeline 입니다.

스크린샷 2019-05-04 오전 12.16.53.png

GitHub 저장소와 연동을 해서, master 브랜치가 업데이트되면 자동으로 빌드하고 배포되도록 파이프라인을 구성해보았어요.
CI/CD를 통해 단 몇번의 클릭으로 빠르게 배포할 수 있어 정말 편리했습니다.

Feeling


이렇게 정말 초 간단하게 Slack bot을 만들어 배포까지 해 보았네요!
개발보다 포스팅이 더 오래 걸릴 정도로...(?) 빠르게 만들 수 있었습니다. (기능은 개허접)
무엇보다 애플리케이션 배포를 처음 해 보았는데 내가 만든 프로그램을 다른 사람(예를 들면 뎁타이쿤 멤버들...)들도 사용할 수 있게 되니까 더더욱 재미있었던 것 같습니다.
아무튼 정말 부족했던 첫 포스팅 봐주셔서 감사합니다! 잘못된 내용이 있으면 피드백 주세요 :)

Reference