류지환

슬랙앱을 통한 채널별 출석체크 자동화

개요

개발자 글쓰기 커뮤니티(회원수 640여명)의 운영진으로서, 커뮤니티 내 챌린지형 채널들의 참여 현황을 효과적으로 관리하기 위한 해결 방안을 제안 및 구현하였습니다. 매일 50여명이 참여하는 두 개의 인증채널(다진마늘=할일 / 책읽어또=독서)에서 해당 채널의 운영진이 수작업으로 진행하던 출석체크를 자동화하고자 하였습니다.

프로젝트 목적

  1. 불필요한 운영 리소스를 절감하여 본래의 목적인 커뮤니티 활성화에 집중할 수 있게 하고자 하였습니다.

  2. 채널별로 상이한 인증 형식(업무목록/독서기록 등)을 처리하고 이후에도 다른 채널에 대해 구현할 수 있도록 추상 클래스 기반의 확장 가능한 구조를 설계하고자 했습니다.

기술 선택

  • Slack SDK, Google SpreadSheet, TypeScript -> Python

출석체크 결과를 다른 분들에게 쉽게 공유할 수도 있어야 하며, 필요시 각종 함수들도 쉽게 활용할 수 있으므로 데이터의 적재는 Google SpreadSheet에 하기로 결정하였습니다. 더불어 기존에 만들어져있는 슬랙앱에서 통합관리하기 위해 Python으로 구현되어야 할 필요가 있었습니다.

다만 Python이 익숙하지 않아 고민되는 부분도 있었고, 아직 원하는 규칙대로 파싱하기 위해 구체적으로 어떤 부분들이 구현해야 하는지를 아직 모르는 시점이었습니다. 그때 아래의 문구가 떠올랐고, 그에 따라 문제를 두 단계로 나누어, TypeScript로 먼저 필요한 로직을 구현한 뒤에 Python으로 포팅하는 형태로 불확실성을 해결해보기로 결정했습니다.

더 많은 일을 하면서 더 빨리 하기 / Telescope Rule

It is faster to make a four-inch mirror then a six-inch mirror than to make a six-inch mirror.

구현과정

맨 처음에 분석했던 것은 '두 채널에서 수집한 정보들이 어떻게 저장되어야 하는가'였습니다. 채널 운영자 분들에게 질문을 통해 파악할 수 있었고, 그것을 바탕으로 sheet header를 만들어서 피드백을 받아 데이터셋을 확정할 수 있었습니다. 그래서 timestamp 와 user가 공통되고 나머지는 다른 방식으로 가져와야 한다는 사실을 알 수 있었습니다.

또한 두 채널 모두 결과적으로는 slack 과 sheet 에 대한 접근을 해야만 했기에, 공통적으로 두 가지에 대한 의존성을 가지고 있을 것이라는 점을 알 수 있었습니다.

그리고 전체적인 과정이 어떻게 되어야 하는가에 대해 고민해본 결과 아래와 같은 흐름이 되어야 한다는 1차적 결론을 내릴 수 있었습니다. (중간 중간에 이 기능에 더 자세히 알게 되면서, 그때마다 비즈니스 로직의 배치는 달라졌지만, 해야 하는 요구사항의 흐름은 아래 상태에서 유지되었습니다.)

  1. 해당 채널 관련한 시트로부터 기존 메시지 데이터 가져오기

  2. 슬랙으로부터 채널의 전체 메시지 가져오기

  3. 둘 간의 중복 제거(채널 전체 메시지 - 시트 메시지)

  4. 슬랙 메시지들을 시간 순으로 정렬

  5. 메시지들을 채널별로 정해진 포맷에 맞게 정리

  6. 해당 채널의 시트에 메시지들 기록

또한 시트에 없던 새로운 참여자가 생겼는지를 확인하기 위해, 메시지 작성자가 기존 시트에 기록되지 않았던 사람일 경우 사용자의 이름을 기록하는 로직을 덧붙였습니다.

그리고 슬랙에서 메시지를 가져올 때 이전에 가져오지 않았던 구간만 가져오면 되는데 전체 메시지를 가져오는 형태로 구현한 까닭은 도입을 하는 과정에서 엣지 케이스를 알게 되는 등의 상황이 있을 수 있을 수 있다라고 생각해서였고, 실제로도 몇 번의 조정을 하는 과정에서 전체를 가져오는게 유용했습니다. 여담이지만 예전 팀장님께서 우리가 구현해야 할 기능에 대해 제대로 이해하게 되는 시점은 구현이 완료된 시점이기 마련이라는 이야기를 하셨던 기억이 있는데, 참 맞는 말이라고 생각하고 🤣 그래서 처음 가지고 있는 이해가 부족할 수 있다는 가정 하에 전체 흐름을 빠르고 가볍게 완성한 뒤 점진적으로 fidelity를 높여가는게 좋은 전략인 것 같습니다.

간략하게 UML로 표현해보자면 위와 같습니다. 이후에 다른 누군가(또는 미래의 제 자신)가 새로운 채널에 대해 케이스를 추가해야 할 때를 생각하면서 채널이 달라도 전체적인 구조와 흐름은 비슷하다는 느낌을 주고자 하는 의도로 구현해보았습니다. 현재는 요구사항을 충족하는 수준으로 완성하였지만, 이후에 다른 채널들이 추가되면 좀 더 개선과 조정이 이루어질 수 있을 것이라 기대하고 있습니다.

자세한 전체 코드가 궁금하신 분들께서는 글팽이 Repository 로 방문하시면 확인하실 수 있습니다.

끝으로 제작 과정에서 소중한 피드백들을 주셨던 @강나영님, @김은찬님, @박건희님, @정해원님, @변성윤님 께 진심으로 감사드립니다.

Send 류지환 a reply about this page
More from 류지환
Back to profile