Slack 알리미봇을 개발하면서 "이거 어떻게 하지?"에 관한 내용들
사내에서 Wrike라는 프로젝트 관리 도구를 사용하고 있는데 Wrike에서 발생하는 데이터를 Slack으로 보내보면 재밌겠다고 생각되어서 이 두 부분을 연동해 보는 기능을 만들어보는 중이다.
다우 오피스와 슬랙을 연동한 사내 Notify 시스템을 개발 중이다. 처음엔 batch로 작성했는데 외부로터 입력을 받을 일이 생길 것 같아 flask를 씌워서 EndPoint를 제공하는 형태로 개선 중이다.
사내 메신저로서 Slack을 사용하고 있는 중입니다. 그리고 협업 도구로써 Wrike를 사용하고 있는데 Wrike에서 발생하는 메시지를 Slack으로 전달해서 무슨 Task가 생성되고 어떻게 변경되고 있는지 보면 재밌을 것 같아 Slack 알리미봇을 만들기 시작했습니다.
사실 이전부터 Slack 알리미봇 만들어보고 싶다고만 생각하고 있었는데 어느 순간 유튜브에 “비트코인 자동매매 알리미봇”이라던지 “실시간 주식시세 확인 알림봇”이라는 영상이 추천에 뜨는 걸 보고 "나도 명색에 개발자인데 이런 거 만들어봐야지"라는 게 동기였습니다.
Slack 알리미봇을 계속 건드려보면서 “이건 어떻게 풀어나가지?”라는 순간들이 있었습니다. 쉽다면 쉬운 또 어렵다면 어려운 Slack에 알리미봇을 만들면서 있었던 자잘한 방법들을 기록해보고자 합니다.
Slack 알리미봇을 개발하다 보니 외부 플랫폼에서 발생하는 Event를 Slack으로 전달해야 하는 상황들이 존재했습니다. 여기서 "Event"는 어느 시점에 일어나는 대상을 의미합니다. 예를 들어 "사용자의 게시글 작성 업로드" 같은 것인데요 이런 Event는 언제 발생할지 모르기 때문에 문제가 되었습니다.
이 문제에 대한 해법을 간단하게 생각해 보면 어떤 시점에 특정 대상의 모든 데이터를 저장하고 있고 저장된 시점부터 주기적으로 데이터를 요청해서 변경된 사항이 있는지를 체크하는 형태로 만들면 될 것 같습니다만 이 방법은 딜레마에 빠지게 만들더군요
"주기적인 데이터 요청"의 간격을 짧게 설정하게 되면 대상 사이트에서 요청이 제한될 수 있고 간격을 길게 설정하게 되면 Event가 발생했을 때 주는 알림의 간격이 너무 느릴 수 있습니다. 적당한 간격을 찾아야 하는데 이 간격을 찾는 게 어렵습니다.
해결을 위해 생각해 볼 수 있는 방법은 데이터를 수집하고자 하는 대상이 Event가 발생하면 나에게 알림을 주는 것입니다. 이 방법을 "WebHook"이라 부릅니다. "WebHook"이 지원되지 않을 때도 있습니다. 그럴 때는 WebSocket을 고려해 볼 수도 있지만 이 글은 기술을 다루는 내용이 아니기 때문에 생략하겠습니다.
데이터 수집 대상과 Slack 사이에 개발한 서버가 있을 것입니다. 개발한 서버에서 Slack에 메시지를 전달해 주는 것은 SlackBot을 생성하고 SlackBot의 Token을 통해 어떻게 해결하겠지만 데이터 수집 대상이 개발한 서버에 데이터를 어떻게 보낼지를 풀어야 했습니다.
"개발한 서버"는 아직 배포가 되지 않은 상태일 것이기 때문에 Local에서만 동작하는 형태입니다. 즉 개발한 서버를 외부에 호스팅을 해야 하는 상황인 것입니다. 이렇다 보니 "도메인"을 구입해야 한다던가 아니면 클라우드 서버를 사용해야 하지만 "도메인" 구입은 비용이 나가고 "클라우드"는 무료로 제공되는 서비스도 있을 테지만 기간이 존재합니다.
어떻게 하면 비용을 안 들이고 개발한 서버를 호스팅 하여 잘 돌아가는지 확인해 볼 수 있을까요?
저는 ngrok를 이용했습니다. ngrok는 외부 인터넷이 로컬에 접속할 수 있게 도와주는 터널링 프로그램입니다. 가끔씩 아주 유용하게 써먹는데 ngrok를 이용하여 간단한 파일 서버로 사용하거나 앞서 설명드렸던 WebHook이 Event를 보낼 서버로 등록해서 사용하기도 합니다.
이렇게 하면 여러 우여곡절을 거쳐 모든 개발이 끝난 것 같습니다. 메시지가 Slack 채널에 잘 전송되고 있고 아무 문제가 없습니다. 그런데 전송되는 메시지가 무언가 밋밋합니다. 그래서 "어떻게 메시지를 있어 보이게 꾸며볼까?" 고민해야 됐습니다.
조사를 하던 중 Slack Block Kit이라는 게 있다는 걸 알게 됐습니다. 다른 회사의 기술 블로그에서 Slack에 알림을 줄 때 메시지를 이런 형태로 만드는 게 아닐까 싶은 생각이 듭니다.
템플릿이 제공되기도 하고 내비게이션 메뉴에 있는 옵션을 선택하여 메시지를 하나하나 만들어나갔지만 해결하지 못한 부분이 존재했습니다.
해결 방법을 찾지 못한 문제: 민감정보를 입력할 때 * 처리가 되지 않는다.
Slack 사용자와 상호작용하는 기능을 고민하던 순간이었습니다. (여기서부터 단순한 알리미봇이 아니지만 탐구심이 발동했습니다) 사용자로부터 민감한 정보를 입력받아야 할 때 이를 "*"로 대신하여 표출되게 만들고 싶었습니다. 마치 비밀번호를 입력할 때 타인에게 노출되는 상황에 대비해 "*"로 처리하는 것과 같습니다.
그런데 Slack 사용자가 Slack Block에 텍스트를 입력할 때 "*" 처리를 해주는 부분을 Slack Block에서 제공하지 않았습니다. 돌파구를 찾고자 Slack에 존재하는 Slash Command를 날리면 특정 링크에 접근할 수 있는 Button을 다시 돌려주는 형태로 개발하려고 했는데 사이즈가 너무 커질 것 같아 나중에 차차 고민하기로 했습니다.
쓸 내용이 많을 것 같아 "언젠간 Slack 알리미봇 개발노트"를 작성해야지 싶었는데 막상 써놓고 보니 생각했던 것보다 내용이 많지 않네요. 이미 기록해 둔 내용으로부터 생각을 풀어서 옮겨 적다 보니 기록하지 못한 내용도 다소 존재한다고 보입니다.
아마 기록하지 못한 내용을 찾고 쓸거리가 생기면 2편으로 작성하려고 합니다.