티스토리 뷰

slack 에는 다양한 투표 기능이 있는데 대표적으로 simple-poll, polly 등이 있다. 하지만 이런 투표기능이 있는 명령어가 무조건적으로 무료는 아니다. polly 같은 경우에는 한달간 베타 버전처럼 사용할 수 있고 그 이후에는 비용을 지불해야 하며, simple-poll 은 일정 횟수 이상을 초과해서 사용하게 되면 비지니스로 업그레이드 해서 사용할 것을 권고한다.아래는 simple-poll 로부터 발생되는 비지니스 업그레이드 권고 메시지.

warning: Remember to upgrade to Simple Poll Business before December 11th

As one of Simple Poll's most active workspaces, we were delighted to grant you an upgrade period when we launched Simple Poll Business several weeks ago.

During the upgrade period you can continue to use Simple Poll as normal. After *December 11th* your workspace will be subject to the limit of 100 monthly votes on the Simple Poll Free Plan, so please *upgrade before then*.

Your workspace has cast 146 votes since December 5.

Simple Poll Business is available for your entire workspace for $49/month

그 이후에도 무시하고 계속 사용하면 아래와 같은 메시지를 보게되고,


마치 무료로 알고 있던 기능에 갑자기 돈을 쓰려고 하니 차라리 그냥 만드는게 낫겠다 싶은 생각이 들었다. 아래는 그래서 시작된 프로젝트. 

slack 투표 명령어 만들기 ( feat. vote )

일단 poll 의 생김새를 잘 분석하고 만들면 되는데, 요구되는 기능은 아래와 같다.

- 슬래시( slash ) 커맨드로 투표를 입력한다.
- 해당 글에 사용자들이 투표를 할 수 있다. 즉, 나열된 Options 에서 간편하게 Choice 를 하고 그 결과가 기록되면 된다.
- 사용자가 A, B 중에 A 에 투표했으면 A쪽에 사용자의 아이디가 태깅되고, Count 가 증가된다.
- 사용자가 투표한 곳에 다시 투표했을 때는 태깅이 삭제되며 Count 가 감소된다. ( 투표 취소 )
- 필요시에 해당 투표를 삭제한다.

간단해보이지만 그렇게 쉬운 과제는 아니다. 인터넷에 좋은 예제는 없으며 슬랙에서 슬래시 커맨드가 어떤식으로 동작되는지 기본적인 분석이 필요하기 때문이다. 참고로 simple-poll GitHubpython-simple 버전으로 공개되어 있지만 일부만 참고 가능하다. 실제 투표 기능 구현을 위한 전체 틀로는 적합하지 않다는 의미다. 

상황이 그러하니 그냥 바닥부터 개발하는수밖에. 우선 my app 등록을 위해 다음 URL 로 진입하도록 한다. 그리고 우측 상단에 Create New App 을 통해 앱을 생성하도록 하자. https://api.slack.com/apps

다음으로는 좌측 메뉴에 Incoming webhooksSlash commands 를 살펴보면 된다.

Slash Commands 는 슬랙 채팅 안에서 사용될 명령어를 입력해주면 된다. 여기서는 poll 기능을 만드는 것이 목표이므로 vote 로 생성을 하도록 한다. 사용자는 채팅창에서 /vote 를 입력해서 투표 기능을 사용할 수 있게 될 것이다. 그리고 다른 것들은 poll 과 동일하게 채워넣는다. 여기서는 Request URL 은 가렸다. Slash Commands 를 처리할 서버의 URL 인데 사실 노출이 되어도 상관없다. access token 이 없으면 접근해도 할 수 있는게 없게 개발되어 있기 때문이다.

그리고나서 Incoming webhooks 을 설정해주면 되는데 이쪽은 사용자가 A or B 같은 옵션에 투표를 진행했을 때 처리하는 로직이라고 생각하면 된다. 여기서는 Slash Commands 와 동일한 서버에 URL 만 살짝 다르게 입력했다.

자, 이제 개발을 진행하면 된다. Slash Commands 를 처리할 서버는 우선 Google Cloud Platform 위에서 저렴한 instance 를 사용하도록 한다. Cloud Functions 을 사용해도 무방하지만 잠깐의 Cold Start 도 실시간이 요구되는 채팅에서는 적합하지 않겠다.

URL 로 들어오는 트래픽을 가볍게 처리하기에 Node.js 만한게 없다. 우선 위에서 언급된 두 가지를 처리할 수 있도록 해주면 나머지는 비지니스 로직이다.

app.post('/', urlencodedParser, (req, res) => {
  res.status(200).end() // best practice to respond with 200 status
  // ...
});

app.post('/actions', urlencodedParser, (req, res) => {
  res.status(200).end() // best practice to respond with 200 status
  // ...
});

app.listen(port, () => {
  console.log('App listening on port ' + port);
});

비지니스적인 코드를 삽입할 때 가장 중요한 것은 access token 에 대한 비교이다. 여기서 코드에 대한 이야기는 더 하지 않겠다. poll 자체가 서비스 되고 있는데 한명의 개발자로서 모든 코드를 오픈 하는 것은 상도덕에 어긋난다고 생각하기 때문. 아무튼 위에 코드를 기반으로 비지니스적인 내용을 추가하면 쉽게 구현 가능하다. 


끝으로, 소프트웨어 산업 발전을 위해 부유하신 분들은 그냥 유료버전 사용하시기를. :-)




댓글
댓글쓰기 폼