Project/[On Vacation Today] 캘린더 일정 - 슬랙 프로필 표시

[Toy Project] 팀원 일정 및 상태 슬랙 프로필 표시 앱 개발 - 1

HJChung 2022. 6. 26. 22:51

팀원 일정 및 상태 슬랙 프로필 표시 앱이라고 하니까 너무 길고 멋이 없는 것 같아서.. 적절한 프로젝트명이 생각나면 좋겠다 ㅎㅎ

간단히 한 줄 설명을 남기자면 

Gcal ➔ Slack: Automatically update member's Slack status according to the current Google Calendar event. No Contact During Vacation! 

https://github.com/Gracechung-sw/on-vacation-today

이다. 👉🏻 👈🏻

 

아이디어 제시 및 만들게 된 동기

2021년 회고 - 습관, 일, 공부, 재미에 내가 적어 둔 2022년의 바람 중 하나엔 이런 글이 있다.

회사의 성장과 함께 만들어 나가는 팀 문화 올해 회사에 새로운 분들이 많이 함께하게 되면서 규모가 커졌다.
그래서 체계적이면서도 효과적인 업무 처리 방식이나 커뮤니케이션 방법 등에 대해서 개발팀 차원으로나 개인적으로나 많은 고민을 하고 변화가 생겨났던 시기인 듯하다.

이런 과정 속에서 크게 깨달은 것이 하나 있다면 '시스템이 많은 것들을 편하게 만들어줄 수 있구나'이다.

예를 들어 Task/Issue Tracking 시스템은 개인이 어떤 일을 하고 있는지 참고할 수 있으므로 팀과 팀 사이, 개발자와 개발자 사이의 communication overhead를 줄여줄 수 있다.
각 task의 history가 잘 남겨져있다면 전/후 맥락 파악에 큰 도움이 되며 이는 시간 절약으로 이어진다.
다양한 서비스(ex. Google calendar, Google meet, Slack.. 등)와 유기적으로 잘 활용하면 매번 신경 써야 할 것들을 시스템이 대신해준다.

2022년에는 함께 일하기 즐거운 회사, 팀이 되기 위해 pain point에 좀 더 관심을 가지고 좀 더 팀 문화 개선에 기여하는 사람이고 싶다.
코드 리뷰 알림봇을 만들어서 코드 리뷰가 밀리는 문제를 해결한 팀원분처럼 말이다.
문화적인 측면에 대해서는 생각도, 피드백도 하지 않고 묵묵부답이면서 불평불만만 늘어놓는 사람이 되긴 싫다.

다른 회사의 팀 문화는 어떤지 찾아보기도 하고 <https://publy.co/> 등을 통해 영감을 얻는 것도 도움이 될 듯하다. 

이런 생각,목표를 가지고 반년 정도 있어보니 '팀 생산성/문화 개선으로 내가 할 수 있는 것(개발)으로 해결할 수 있는 문제가 뭐가 있을까'를 생각하는 것이 자연스러워졌다. 

 

그중 이 문제는 정말 해결이 되었으면 좋겠다! 싶은 게 있어서 조그만 이 토이 프로젝트를 시작하게 되었다. 

 

1. 어떤 문제가 있었는가

우리 회사에서는 근태관리를 위해 연차/재택근무/반차/자리비움 등을 설정하는 어플을 사용한다. 그리고 해당 어플에서 이런 상태를 설정하면 연차/재택근무/반차 같은 경우 <정현정 오후 반차> 이런 식으로 google calendar에 반영이 된다. 

 

하지만 스케쥴이 있을 때나 꼭 봐야 할 때를 제외하고 사람들은 google calendar를 자주 확인하지는 않는다. 

반면 slack은 수시로 확인하게 된다. 

그러다 보니 팀원의 근태 상황 파악이 번거로워 

이런 일이 발생하곤 한다. ㅎㅎ

이렇게 팀원의 status 변경 확인이 불편하다는 점 외에도 팀 리드분께서 google calendar에 집중시간 기입을 적극 활용하라고 제안해주신 점 등 에 대한 얘기가 오간 것이 떠올랐다. 
(캘린더에 몇 시부터 몇 시까지 <정현정 집중시간> 이라고 적어두면 누군가는 그 걸 확인하고 배려해주게 되는 것을 기대한다.
하지만 이 역시 매번 캘린더에 들어가 확인해야 한다는 번거로움이 있다. 슬랙에 표시되어있다면 DM을 보내기 전에 확인이 될 텐데 말이다!)

 

정리하자면, 

우리가 사용하고 있는 연차나 재택근무, 자리비움 등을 확인 할 수 있는 앱은 보통 출근, 퇴근 시 출퇴근 버튼을 누르기 위해서만 사용하지  그 이후에는 팀원의 status를 보는 용도로는 사용성이 좋지 않다.

하지만 slack의 경우, 팀원에게 말을 걸기 위해서 사용하기 때문에 해당 시간에 바로 status check가 가능하다.

그래서 slack profile에서(왼쪽 slack user display name 옆에 status emoji가 표시됨) google calendar에 해당 시간에 등록된 status에 해당하는 emoji가 반영될 수 있도록 하는 기능을 개발하고자 하였다.

 

2. 기술적 관점에서 어떻게 해결 했는가

일단 도달하고자 하는 목표는 '효율적으로 문제를 해결하는 것'이다. 

즉, 직접 개발을 하지 않고도 간단히 이 문제를 해결할 수 있는 방법이 있는지를 먼저 찾아봐야 한다.

 

1) 우리가 사용하는 근태관리 앱이나 구글 캘린더와 슬랙 profile status를 연동할 수 있는 서드파티 앱이 존재하는가?

구글 캘린더와 슬랙이 연동된 서드파티 앱은 있다. 하지만 회의나 스케줄이 잡혀있을 때 알람을 보내 주거나 달력을 표시해주는 기능만 있다. 

그리고 회사 동료분께서 근태관리 앱 쪽에 문의한 바로는 아직 개발 및 도입 전이라고 한다. 

그래서 패스!

 

2) 비슷한 서비스가 있는가? 

Holopod smart calendar https://holopod.com/blog/optimize-your-remote-work-day (Holopod has joined Pulse)라는 서비스가 있으며 내가 원하던 기능을 다 제공한다!

  • "커피"라는 단어가 포함된 캘린더 이벤트가 있는 경우 "☕" 상태를 트리거하도록 Slack을 프로그래밍할 수 있다. 즉, 이벤트가 "Coffee with Ana", "Virtual coffee" 또는 "Out for a cup of coffee..."에 관계없이 그에 따라 Slack 상태가 자동으로 업데이트된다.
  • 해당 서비스를 사용하면 google calendar 뿐만 아니라 jira 같은 issue tracking system 등 여러 app들과 Integration이 가능하다.

 

하지만 우리 팀의 use case를 생각해봤을 때 status change 외의 기능은 필요 없고, 또 무료 플랜은 최대 5명까지 사용 가능하기 때문에 우리 팀의 상황에서는 사용할 이유가 딱히 없다고 판단하였다.

 

그래서 결과적으로

그냥 내가 개발해서 사내 서버나 AWS에 띄워보지 뭐!라고 결론을 지었다.

 

개발 요구사항

  • 현재는 자신이 어떤 상태인지 slack profile을 통해 알리고 싶다면, 이런 식으로 수동으로 자신의 status를 바꿔줘야만 한다.
  • 그래서 필요한 핵심 기능은, Google calendar ➔ Slack: Automatically update member's Slack status according to the current Google Calendar event.
  • 매일 아침 6시에 slack status가 초기화된다.
  • 연차, 보상휴가, 재택근무의 경우 오전 11시 전에 결정이 나는 사항이다. 그래서 이 전에만 check 되면 된다.
    - [연차] Paid Time Off 사용자의 경우 Slack profile status에 이모지로 🤫  이 이모지 표시되기
    - [보상휴가] Paid Time Off 사용자의 경우 Slack profile status에 이모지로 🤫  이 이모지 표시되기
    - [재택] Work From Home 인 경우 🏠
  • 방해금지, 자리비움, 오전 반차, 오후 반차는 언제 사용하실지 모르기 때문에 짧은 간격으로 반복 체크해서 변경 시 status가 변경되어야 한다.
    - [오전 반차] Take Morning Off인 경우 해당 시간 동안 🤫
    - [오후 반차] Take Afternoon Off인 경우 해당 시간 동안 🤫
    - [방해금지] Do Not Disturb 인 경우 🎧
    - [자리비움] Out of Office 인 경우 🪑
  • profile status message는 [한글] 영어 이런 식이면 좋을 것 같음
  • Architecture diagram, build 및 실행 방법이 적힌 README.md 파일
  • Error Handling
  • Clean code

Architecture

deprecated architecture

엇... 여기까지 생각하고 나니까 cron job으로 체크하는 것이 정말 비효율적이라는 생각이 들었다. 

google calendar가 update 되는 경우는 적다. 그리고 ‘주기적'이라고 볼 수 없다. 그보다는 google calendar에 일정이 생성되는 그때 그때 바로바로 trigger가 되어 api가 call 되는 것이 적절한다. 

 

즉, serverless가 훨씬 적합하다는 생각이 들었다. 그래서 google calendar event trigger, lambda라는 키워드로 검색해보았고, 

딱 맞는 답변을 찾을 수 있었다. 

https://stackoverflow.com/questions/21301918/trigger-script-on-google-calendar-event

google calendar에서 event 발생 시 push notification을 해주는 API를 제공해준다. 

 

이를 활용하면 될 것 같다. 그러면

desired architecture

이런 구조가 될 것이다. 

 

개발 과정

위의 과정을 통해 요구사항 및 개발 계획을 확인하였고, 이제 본격적으로 개발한 과정을 적어보고자 한다.

1. google calendar api 사용을 위한 인증받기

Python에서 Google Calendar API를 사용하여 내 계정의 이벤트를 가져오는 것을 해보고자 한다.

google calendar api를 사용하려면 먼저 인증을 받아야 한다. 

1) 먼저 google cloud platform에 프로젝트 생성한다. 

2) 그 후 calendar api 사용을 위해 사용자 인증 정보를 생성한다. 

위에서 생성한 프로젝트 내에서 검색창에 google calendar api를 검색하면 해당 서비스로 이동할 수 있다.

이 api를 <사용>을 누르면

3) 사용을 위한 사용자 인증 정보를 만들어야 한다.

사용자 인증 정보 유형 같은 경우는 사용자 데이터에 액세스 하는 것이 필요하다고 생각했으므로 OAuth 클라이언트 ID를 선택해주었다.

그리고 우선 push notification /watch api를 사용해서 webhook으로 사용할 곳으로 결과를 받기 전에

get event API로 설정한 날짜, 시간에 맞는 event를 잘 가져오는지부터 확인하고 싶었으므로 일단은 데스크톱 앱으로 애플리케이션 유형을 정했다. 

4) 이렇게 하면 인증 정보가 들어있는 json 파일을 다운로드할 수 있다. 

2. google calendar api 사용하여 event 받아오기

다행히도 공식 문서에 Quickstart가 아주 잘 되어있다. 

https://developers.google.com/calendar/api/quickstart/python

1) 위에서 JSON 다운로드한 파일명을 credentials.json으로 바꿔준 뒤

2) Google client library 관련해서 필요한 것들을 pip install로 설치해주고 

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

3) 이 문서에 있는 quickstart.py와 같은 경로에 두고 실행을 하면 된다. 

4) 그러면 아래와 같이 인증을 위한 페이지로 리다이렉트 된다. 

<계속>을 누르면 인증이 완료되고 google calendar api를 사용할 수 있는 상태가 된다

 

 

 

3. Slack token 발급 및 users.profile.set API 사용

이제 google calendar api를 사용하기 위한 준비는 되었으니 이제 slack api를 사용하기 위한 인증 및 준비도 해야 한다. 

사용자의 profile을 업데이트하기 위한 api는 users.profile.set이다.

문서를 읽어보면 이를 사용하기 위해서는 users.profile:write 권한이 있는 User token이 필요하다.

 

우선 내가 test용으로 사용하고 있는 free plan Slack의 경우 아래 글에 따르면 user마다 token을 생성해서 받아야 한다.

그 방법은,

1) 먼저 https://api.slack.com/에서 Create an app으로 우리의 workspace에 slack app을 생성한다.

2) 그 후 Permissions을 눌러서 Scopes을 설정해주고 token을 받는다. 

내가 사용하려는 Users.profile.set API 문서에 나와있듯이 User token의 users.profile:write scope를 주면 된다.

3) 이렇게 받은 token를 잘 저장해 두고 활용한다. 

 

slack api 문서에서 위에서 발급받은 token을 가지고 api 동작을 간단히 테스트해 볼 수도 있다. 

 

여기까지 정리된 코드 

여기까지

google calendar의 Events: get API를 사용해서 설정한 날짜, 시간에 해당하는 일정(event)을 가져오고

slack의 users.profile.set API를 사용해서 사용자의 profile status를 바꾸는 방법에 대해서 알아보고 테스트해 본 바를 적어보았다.

 

좀 더 나아가 

google calendar의 Events: get API를 사용해서 설정한 날짜, 시간에 해당하는 일정(event)을 가져오고

event 키워드에 맞는 

status = {
    "연차": {'status_text': '[연차] Paid Time Off', 'status_emoji': ':shushing_face:'},
    "보상휴가": {'status_text': '[보상휴가] Paid Time Off', 'status_emoji': ':shushing_face:'},
    "재택근무": {'status_text': '[재택] Work From Home', 'status_emoji': ':house:'}
}

status가 있으면 이런 식으로 

slack profile의 status_text와 status_emoji를 바꿔보는 코드를 작성해서 실행시켜 보았다. 

 

본 프로젝트의 진행 중인 코드는 Github에서 확인할 수 있습니다. 😳 

 

잘 바뀐다..! ㅎㅎ

 

What's Next..

다음은 google calendar의 Push Notifications (/watch) API를 활용해서 event가 새로 생성되거나 업데이트될 때마다 event를 받아서

serverless service(ex. AWS lambda)가 trigger 되고 

이에 맞게 slack user.profile.set API로 status text, emoji가 변경되도록 해 볼 것이다

 

 

글또에 활용되고 있는 대나무 숲 슬랙 앱의 개발 후기글인 “임금님 귀는 당나귀 귀!”... 대나무 숲 슬랙 앱 만들기 에서 인상 깊었던 부분은

기존에 어떤 문제가 있었는지를 진단하고, 이를 기술적 관점에서 어떻게 해결했으며, 사용자의 피드백을 다시 제품에 적용하는 그 과정이 실제 서비스를 개발하는 것과 크게 다르지 않다고 여겨졌습니다. 그래서 오늘은 대나무숲 슬랙 앱의 개발 과정 및 후기를 공유합니다. 이번 포스트를 통해 슬랙 앱 개발에 관심이 있으신 분들께 도움이 되었으면 좋겠습니다.

출처: “임금님 귀는 당나귀 귀!”...대나무숲 슬랙 앱 만들기

이다. 

 

나 역시 이 토이 프로젝트의 개발이 완료되면 팀원분들께 피드백을 듣고 이를 다시 적용하는 과정을 거치고 싶기 때문에 사내 개발자 세션을 통해 발표하는 시간을 가지고자 한다.

그리고 이 기능이 사내 slack에 잘 자리 잡을 수 있다면 퇴근 후 짧은 시간을 내어 조금씩 개발한 것이 작든 크든 불편함을 효율적으로 해결한 사례가 될 수 있다고 생각한다.🤓

 

 

Reference

google calendar api

 

slack token

 

cron job in docker

 

그 외