2023 채널톡 <Hacky-Talky> 해커톤 후기
지난 11월 10일(금)부터 11일(토)까지 역삼역 채널톡 오피스에서 채널톡 챌린저스 후원 동아리들을 대상으로 제2회 채널톡 <Hacky-Talky> 해커톤이 열렸다. 이미 두 번의 동아리 내부 해커톤에서 쓴 고배를 마신 적 있었던 나는 이번에도 스스로에게 큰 기대를 안 하고 갔었다...... 라기엔, 무조건 상을 타겠다는 마음으로 해피해킹 키보드를 챙겨가지 않았던가? 어쨌든, 행사가 끝난 지 한 달이 다 되어가는 지금 돌이켜보면, 채널톡 해커톤에 참여하기로 한 건 이번 학기 최고의 선택 중 하나였다!
우리 팀은 프론트엔드 개발자 3분과 백엔드 개발자 1명(=나)로 이뤄져 있었다. 팀 배정은 사전 설문조사를 통해 랜덤으로 이뤄졌는데, 나도 고려대에서 오신 나머지 세 분도 서로서로 초면이었다. 서로의 포지션을 해커톤 당일에서야 알게 된 우리 팀이었지만, 그렇기에 더욱 재밌는 아이디어들이 많이 나왔던 것 같다. 그러다가 우리는 "역삼역"이라는 해커톤 주제에 맞게 대충 아래와 같은 의식의 흐름을 거쳤다.
- 역삼역에는 직장인들이 많다. 그런데 직장인들, 항상 핑곗거리를 생각해내야 하는 운명에 처해 있다. 실수로 늦잠을 자 회의에 늦어지기도 하고, 회사일로 무리한 날에는 PT를 못 가는 일이 생기거나, 여친과의 약속을 잊기도 한다.
- 그렇지만 매번 다른 핑계를 생각해내는 것은 어려운 일이다. 실수로 예전과 겹치는 핑계를 말해버리면 상황이 더 악화될 수 있다.
- 또한, 가끔은 효과적인 변명을 위해 문자보다 목소리가 필요할 때가 있다. 예를 들어 역삼초에 다니는 철수는 부모님의 목소리를 빌려 영어학원을 째고 싶을 수 있다.
그렇게 만들어진 서비스가 구라공작소, 아니 '변명 생성 서비스'이다. 프론트엔드는 Flutter로 개발되었고, 백엔드는 Express(Node.js)를 사용하였다. 아래 주소들을 통해 레포지토리들에 방문하실 수 있다.
이번 글에서는 개인적으로 해커톤을 참여하며 배웠던 점들을 중심으로 써 보려고 한다.
우선순위 정하기 - 로그인은 굳이 필요한가?
채널톡 해커톤은 전체 일정 중 개발에만 집중할 수 있는 시간을 많이 주신 편이었지만, 그럼에도 하룻밤이라는 시간이 절대적으로 짧음은 부정할 수 없다. 우리 팀은 Ideation에 많은 시간을 할애했는데, 두 시간 동안 기획을 충분히 하며 하루 동안 개발할 기능과 이후에 개발할 기능을 구분지은 게 이후에 큰 도움이 됐다. 13시간 남짓 되었던 작업시간을 동안 두 기능만 제대로 만들고자 하는 목표로 기획과 개발을 이어갔고, 그런 도박은 성공적이었다.
기간이 짧을 땐 가장 익숙한 기술들로
그동안 두 번의 해커톤을 나간 적이 있었다. 한 번은 한 번도 안 써본 Vue.js와 Django를 써서 1박 2일만에 서비스를 만들려다가 실패했고, 또 한 번은 마찬가지로 한 번도 안 써본 Next.js로 하루동안 백엔드 개발을 해보려다가 끝을 못 맺었다.
이번에는 모험은 안 하기로 했다. 동아리 서비스들을 개발하면서, 프로토타이핑을 쉽게 할 수 있었던 MERN(MongoDB + Express.js + React.js + Node.js) 스택을 사용하기로 결심하고 행사장에 들어갔고, 그만한 보답을 받았다. Express.js는 미들웨어 함수들을 사용해 API 엔드포인트들을 문자 그대로 빠르게 작성할 수 있는 백엔드 프레임워크이고, MongoDB는 자유로운 스키마 덕에 초기 설정도 간단하고 스키마 변동에도 어느 정도 유연하다. MongoDB Atlas를 사용하면 무료인 건 덤이다.
내가 Flutter 디자인 프레임워크를 미리 알아갔더라면 팀에 작게나마 도움이 됐을 것 같은데 후회되기도 한다. 처음에 내가 "Top 10" 블로그들에서 찾아낸 UIKit들은 너무 낡아서 최신 개발 환경에서 제대로 동작하지 않았다.
Swagger를 가능한 한 이른 시점에 도입하기
이전 해커톤들에서는 노션으로 API 명세를 작성했었는데, 그러면 실제 요청과 응답 타입을 프론트엔드 분들이 바로 쓰실 수 있는 형태로 표현하는 게 불가능했다. 해커톤의 특성상 API 규격이 숨가쁘게 바뀌는데, 서버 소스 코드를 수정했지만 명세가 수정되지 않아 둘이 틀어지는 일도 부지기수였다.
그런 면에서 Swagger는 API 명세의 single source of truth가 되기 때문에 의미가 컸다. Swagger Docs 페이지에서 직접 요청을 보낼 수 있다는 점도 프로토타입 시 큰 도움이 됐다. Swagger를 추가하는 데 한 시간 정도를 썼지만, 그걸로 절약한 팀원 분들의 시간과 최종 발표에서 Swagger의 도움을 받은 것을 생각하면.. 정말 좋은 선택이었다. 다음 해커톤 때에는 Express 대신 Swagger 연동이 더 쉬운 FastAPI나 NestJS도 좋은 선택이 될 수 있겠다 생각했다.
이른 배포는 필수! 방법은 자유..
Dockerfile을 작성하고, 이미지를 올릴 수 있는 이미지 레지스트리와 컨테이너를 바로 배포할 수 있는 Docker Compose 파일 정도면 충분한 것 같다. CI/CD까지는 필요 없다고 생각한다. GitHub Actions는 (캐시를 써도) 로컬 베어메탈 서버에서 빌드 캐시를 가지고 바로 빌드하는 것만 못하다. 해커톤처럼 main 브랜치에 커밋이 자주 푸시되는 상황이라면 더더욱 그런 것 같다.
그런 의미에서 돈 걱정 없이 단시간에 배포할 수 있는 나만의 인프라를 갖는 것도 좋아 보인다. 나는 이번 해커톤에서 학교에 대충 설치해둔 개인 서버와 Cloudflare Tunnel의 덕을 톡톡히 봤다. 매번 서버를 프로비저닝하는 데에는 시간이 많이 들고, 해커톤에서는 시간만큼 소중한 게 또 없다.
다음은 어디로?
일부러 결과를 마지막에 쓴다. 우리 팀은 놀랍게도 최우수상(2등상)을 시상했다! OpenAI의 ChatGPT와 Whisper API 덕분에 백엔드 개발자인 내가 한 일은 많지 않았다. 좋은 결과를 얻은 건 다 짧은 시간 내에 Flutter 앱을 완성해주신 팀원 분들 덕이다. 이 자리를 빌어 다시 한 번 감사의 말씀을 올린다. 🥹
채널톡 오피스에서 한치 앞도 예상할 수 없는 짜릿한 이틀을 보냈다. 앞서 두 번의 해커톤 결과가 마냥 좋지만은 않았어서 해커톤 자체에 대한 두려움이 있었는데, 이번 기회에 생각을 다시 해보게 되었다. 이번 해커톤에서는 백엔드가 크게 중요하지 않아 내 역할이 중요하지는 않았지만, 나에게 책임이 더 크게 주어질 기회들에도 도전하고 싶다. 2월에 내 동아리인 SPARCS에서 해커톤이 열린다면, 이번에는 운영진이 아니라 개발자로서 신청해보고 싶다! 가능하다면 이번엔 프론트엔드 담당으로 출전해봐도 많은 걸 배울 수 있을 것 같다. 이번 채널톡 해커톤을 시작으로 앞으로도 여기저기 나아갈 나를 기대해주시라.