개요
개발자 글쓰기 커뮤니티(회원수 640여명)의 운영진으로서, 커뮤니티 내 챌린지형 채널들의 참여 현황을 효과적으로 관리하기 위한 해결 방안을 제안 및 구현하였습니다. 매일 50여명이 참여하는 두 개의 인증채널(다진마늘=할일 / 책읽어또=독서)에서 해당 채널의 운영진이 수작업으로 진행하던 출석체크를 자동화하고자 하였습니다.
프로젝트 목적
-
불필요한 운영 리소스를 절감하여 본래의 목적인 커뮤니티 활성화에 집중할 수 있게 하고자 하였습니다.
-
채널별로 상이한 인증 형식(업무목록/독서기록 등)을 처리하고 이후에도 다른 채널에 대해 구현할 수 있도록 추상 클래스 기반의 확장 가능한 구조를 설계하고자 했습니다.
기술 선택
- 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차적 결론을 내릴 수 있었습니다. (중간 중간에 이 기능에 더 자세히 알게 되면서, 그때마다 비즈니스 로직의 배치는 달라졌지만, 해야 하는 요구사항의 흐름은 아래 상태에서 유지되었습니다.)
-
해당 채널 관련한 시트로부터 기존 메시지 데이터 가져오기
-
슬랙으로부터 채널의 전체 메시지 가져오기
-
둘 간의 중복 제거(채널 전체 메시지 - 시트 메시지)
-
슬랙 메시지들을 시간 순으로 정렬
-
메시지들을 채널별로 정해진 포맷에 맞게 정리
-
해당 채널의 시트에 메시지들 기록
또한 시트에 없던 새로운 참여자가 생겼는지를 확인하기 위해, 메시지 작성자가 기존 시트에 기록되지 않았던 사람일 경우 사용자의 이름을 기록하는 로직을 덧붙였습니다.
그리고 슬랙에서 메시지를 가져올 때 이전에 가져오지 않았던 구간만 가져오면 되는데 전체 메시지를 가져오는 형태로 구현한 까닭은 도입을 하는 과정에서 엣지 케이스를 알게 되는 등의 상황이 있을 수 있을 수 있다라고 생각해서였고, 실제로도 몇 번의 조정을 하는 과정에서 전체를 가져오는게 유용했습니다. 여담이지만 예전 팀장님께서 우리가 구현해야 할 기능에 대해 제대로 이해하게 되는 시점은 구현이 완료된 시점이기 마련이라는 이야기를 하셨던 기억이 있는데, 참 맞는 말이라고 생각하고 🤣 그래서 처음 가지고 있는 이해가 부족할 수 있다는 가정 하에 전체 흐름을 빠르고 가볍게 완성한 뒤 점진적으로 fidelity를 높여가는게 좋은 전략인 것 같습니다.

간략하게 UML로 표현해보자면 위와 같습니다. 이후에 다른 누군가(또는 미래의 제 자신)가 새로운 채널에 대해 케이스를 추가해야 할 때를 생각하면서 채널이 달라도 전체적인 구조와 흐름은 비슷하다는 느낌을 주고자 하는 의도로 구현해보았습니다. 현재는 요구사항을 충족하는 수준으로 완성하였지만, 이후에 다른 채널들이 추가되면 좀 더 개선과 조정이 이루어질 수 있을 것이라 기대하고 있습니다.
자세한 전체 코드가 궁금하신 분들께서는 글팽이 Repository 로 방문하시면 확인하실 수 있습니다.
끝으로 제작 과정에서 소중한 피드백들을 주셨던 @강나영님, @김은찬님, @박건희님, @정해원님, @변성윤님 께 진심으로 감사드립니다.