팀원 모집
한동안 개인 프로젝트만 하면서 복학 준비를 하던 중, 과 동기가 같이 대회를 나가보자는 제안을 했다.
공고를 보니 일반적인 해커톤과 다르게 '모바일 앱'을 타겟으로 진행한다는 점과, 사측에서 직접 사용할 서비스를 만든다는 점이 재미있어 보였고, 진행기간도 10일 정도로 적당해서 참가를 결정하게 되었다.
무엇보다 개발자들만 모아서하는게 아닌 PM과 디자이너를 따로 모집해서 협업할 수 있다는 점도 좋은 경험이 될 것 같았다.
대회 진행은 개인 혹은 팀으로 신청해서 참가자로 선정되면, 디스코드로 본인 어필을 통해 팀원을 추가 모집할 수 있는 방식이었다. 같이 신청한 팀원도 백엔드 경험을 쌓기를 희망했기에 디스코드에서 열심히 프론트 개발자, 기획자, 디자이너를 찾아다녔고, 디자이너, 기획자까지는 적극적으로 컨텍하고 다녔더니 어렵지 않게 구할 수 있었다.
그런데...
팀 매칭 마지막 날까지 프론트엔드 개발자를 구하지 못하는 이슈가 생겼다. 아무래도 앱 개발 해커톤이라 진입장벽이 있었던 것 같다.
그렇게 프론트 전문 개발자 없이, 어째 저째 플러터 with GPT라도 써서 갈아 넣어야 하나 고민하던 찰나...
주최 측에서 마지막까지 남은 인원에 대해 랜덤 팀매칭을 해주셔서, 극적으로 프론트 개발자분이 한 분 더 합류하게 되었다! (끝나고 생각해 보니 만약 안 구해졌더라면.. 아찔했다)
총 5명(PM1, DE1, FE1, BE2)에서 10일 동안 개발을 진행하게 되었다.
주제 및 대회 진행
대회는 두핸즈라는 스타트업에서 의뢰(?)한 내용을 수행하는 것인데, 주제는 '두핸즈 구성원의 성과관리를 위한 사내 게이미피케이션 앱 개발'이다. 기존에 사측에서 사용하는 인사 정보 체계(Google Spread Sheet)를 기반으로 구성원 개인이 본인의 성과를 실시간으로 확인하여 동기부여를 얻게 하는 것이 목표였다.
처음에는 주제의 자유도가 떨어진다고, 생각했는데 고민할 수록 주어진 데이터로 풀어낼 수 있는 방법이 다양하게 나와서 이런 방식의 해커톤도 신선했다.
주최 측 이벤트로 중간 인증샷을 찍어 올리는 팀 미션이 있었는데, 우리 팀은 온라인으로 진행하면서 매일 정기적으로 회의만 진행했는데, 몇몇 팀은 오프라인으로 모여서 진행하는 팀도 있었다.
주최 측에서 제공되는 협업 툴을 사용해야 하는 규정이 있었는데, Jira/Asana 같은 느낌으로 에자일 하게 협업할 수 있는 툴이었다. 다른 툴과 달리 내가 실제로 일한 시간을 기록하고 팀원들과 비교해 볼 수 있는 게 특징이었는데, 서로 진행 상황을 보면서 더 자극을 받아서 개발할 수 있었다.
백엔드 설계
대회가 시작하자마자 빠르게 기획 회의에서 나온 아이디어를 바탕으로 ERD부터 정리하고 깃헙, AWS, CI/CD부터 세팅했다. 그동안 개인 프젝들을 해오면서 짜놨던 boilerplate와 terraform이 빛을 보는 순간이었다.
프론트엔드 개발자분과 회의를 통해 swagger로 API 문서화를 해드리기로 했고, 비대면으로 진행하는 만큼 API 문서를 작성할 때, 상세하게 명세하려 노력했다.
고민한 부분
주최 측의 요구사항으로 웹/앱으로 된 관리자 페이지 대신, 기존에 사용하던 인사관리 시스템인 Google Spread Sheet(이하 구글 시트)와 연동되어야 했는데, 별도의 DB를 유지하면서 구글 시트와 동기화 유지를 위해서, 데이터 일관성에 대한 고민을 많이 하게 되었다.
구글 시트는 한명의 사용자가 쓰는 것도 아니고, 여러 명이 동시에 수정을 할 수 있는 특징이 있으며, format을 제한하지 않기에 사용자 실수에 의해 invalid 한 데이터가 입력될 수도 있었다.
또한, 구글 시트에 입력된 데이터가 DB에 2번 write되거나, write 되지 않는 상태가 되면 안 된다.
처음에는 구글 시트에서 Apps Script를 이용해서 구글 시트에서 Data Change를 트리거로, 백엔드 API를 호출해서 DB에 데이터를 write(update)하는 것을 고려해 보았다.
하지만 이 경우에 만약 2명의 관리자 A, B가 동일 칸에 다른 데이터를 동시에 업데이트하였을 때, 구글 시트 상에는 나중에 입력된 B의 데이터가 기록되었지만, 네트워크 지연이나 DB lock 등의 이유로 인해 DB에는 A가 입력한 데이터가 기록되는 상태가 될 수 있다. 각 상황별로 rollback 하는 전략을 app script로 구현할 수 있을지는 모르겠지만 비효율적이라 판단했다.
그래서 생각해 낸 방법이 백엔드에서 Task Scheduling으로 batch작업을 하고, 이걸 한 트랜잭션으로 묶는 방법을 이용했다. 구글 시트에서 Data Change가 될 때마다 기록하는 방식보다는 실시간성이 떨어지겠지만, 서비스 특성을 고려했을 때 30초/1분의 공백이 생기더라도 UX 측면에서 불편함이 없을 것이라 판단했고, 데이터 양을 고려했을 때 트래픽 문제도 없을 것이라 생각했다. 무엇보다 데이터의 무결성이 더 중요하다고 판단했다. NestJS에서는 '@nestjs/schedule'을 기본적으로 지원하고 있었고, 동기화를 구현할 수 있었다.
최종 결과물 및 파이널데이
최종적으로 10일 만에 주최 측의 모든 요구사항을 충족하는 앱을 출시할 수 있었고, 파이널 데이에 참석했다. 마침 팀원분들도 파이널데이가 금요일 낮 시간대임에도, 5명 모두 오실 수 있다고 해서 무리 없이 시연과 발표 질의응답을 준비할 수 있었다.
서울숲 쪽에 위치한 공유오피스에서 진행되었고, 예상외로 많은 분들께서 참여하셨다.
특히 심사위원으로 사측 CEO, CTO, 인사담당자분들께서 오셨는데, 직접 사용하실 분들께서 평가를 해주시는 것도 인상 깊었다.
발표뿐만 아니라 시연부스도 운영을 했는데, 디자이너분과 기획자분께서 정말 준비를 많이 해오셔서, 많은 타 팀 참가자 분들께서도 구경을 하고 가셨다.
총 18팀의 발표가 끝나고, 심사위원분들께서 시연까지 보시고, 최종 결과 발표 시간...
최종적으로 '우수상'이랑 '베스트 팀워크상'을 수상했다. 물론 상을 받아서 좋았지만, 한편으로는 '충분히 1등 할 만했던 것 같은데'하는 아쉬움도 남는 대회였다. (최우수/우수상 1팀 씩)
느낀 점 & 배운 점
그동안 개발자들끼리 협업하면서 기획이나 디자인을 겸업하면서 프로젝트는 해보았지만, 이번처럼 기획/디자인/개발 각각 나눠서 각자가 전문성 있는 분야에서 협업해 본 경험은 처음이었다. 특히 프론트엔드와 디자이너분은 현직 경험도 있으신 분들이라 협업/소통 프로세스에 대해서도 겪어볼 수 있는 기회였다.
그동안 혼자서 백엔드 코드를 짜면서는 고민해보지 않았던 경험들도 있었는데, API를 어떻게 프론트 친화적이게 제공할 것인가에 대해서 고민하고 개발하는 과정에서 response format이나 error handling 등을 꼼꼼하게 해야 된다는 걸 다시 한번 느끼게 되었다.
아쉬운 점
개발 측면에서는 요구사항에 비해서 시간이 타이트했기에 따로 테스트코드를 짤 시간이 없었는데, 제출 마감 하루 이틀 전쯤 되어서 다양한 상황에서 에러가 튀어나왔다. 디버깅도 어려웠고, 급하게 코드를 고치다 보니 더 스파게티 한 코드가 만들어져 버렸다. 시간이 없어도 코어가 되는 서비스 로직에라도 테스트를 짜면서 할 껄 후회했다.
대회 측면에서는 기술적인 부분을 많이 어필하지 못한 게 아쉬웠다. 나중에 사측에 양도할 것까지 고려해서 로깅이나 자동화, 에러 핸들링, 데이터 무결성 보장 등 디테일에도 신경을 많이 썼는데, QnA 시간이나 부스에서도 기술적인 질문의 비중이 낮아서 아쉬웠다.
발전시켜본 점
대회가 끝나고 이대로 두기엔 찝찝해서 마지막에 급하게 개발한 스파게티 코드들을 정리하고, 테스트코드도 붙여봤다.
기존에는 FCM으로 app push를 날리는 과정도 각각을 single message로 서버단에서 반복문으로 해결했었는데, 찾아보니 multicast 기능이 있어서, 보다 효율적이게 리펙토링도 진행했다.
그리고 기존에 코드를 그대로 AWS Elastic Beanstalk로 배포해 뒀었는데, Docker로 감싸서 홈 서버로 마이그레이션까지 시켜볼 수 있었다. (참고)
https://github.com/americano212/dohands-hackathon-backend
결과에는 아쉬움이 남지만, 좋은 팀원분들과 재미있게 2주가량 개발할 수 있었던 좋은 기회로 기억에 남을 것 같다. 스스로도 많은 공부도 되었고 발전한 것 같아 만족스러운 대회였다.
'대회' 카테고리의 다른 글
[PS] 2022 Winter SUAPC 후기 (2022.02.26.) (1) | 2022.03.08 |
---|---|
[해커톤] 2021 Artech Hackathon 참여 후기 (2021.12.03.~2021.12.06.) (0) | 2021.12.07 |