2023 채널톡 <Hacky-Talky> 해커톤 후기

채널톡 해커톤 스티커가 여기저기 붙어 있는 내 맥북에어
남는 건 사진과 맥북 스티커 뿐이라고 누가 그랬다

지난 11월 10일(금)부터 11일(토)까지 역삼역 채널톡 오피스에서 채널톡 챌린저스 후원 동아리들을 대상으로 제2회 채널톡 <Hacky-Talky> 해커톤이 열렸다. 이미 두 번의 동아리 내부 해커톤에서 쓴 고배를 마신 적 있었던 나는 이번에도 스스로에게 큰 기대를 안 하고 갔었다...... 라기엔, 무조건 상을 타겠다는 마음으로 해피해킹 키보드를 챙겨가지 않았던가? 어쨌든, 행사가 끝난 지 한 달이 다 되어가는 지금 돌이켜보면, 채널톡 해커톤에 참여하기로 한 건 이번 학기 최고의 선택 중 하나였다!

우리 팀은 프론트엔드 개발자 3분과 백엔드 개발자 1명(=나)로 이뤄져 있었다. 팀 배정은 사전 설문조사를 통해 랜덤으로 이뤄졌는데, 나도 고려대에서 오신 나머지 세 분도 서로서로 초면이었다. 서로의 포지션을 해커톤 당일에서야 알게 된 우리 팀이었지만, 그렇기에 더욱 재밌는 아이디어들이 많이 나왔던 것 같다. 그러다가 우리는 "역삼역"이라는 해커톤 주제에 맞게 대충 아래와 같은 의식의 흐름을 거쳤다.

  1. 역삼역에는 직장인들이 많다. 그런데 직장인들, 항상 핑곗거리를 생각해내야 하는 운명에 처해 있다. 실수로 늦잠을 자 회의에 늦어지기도 하고, 회사일로 무리한 날에는 PT를 못 가는 일이 생기거나, 여친과의 약속을 잊기도 한다.
  2. 그렇지만 매번 다른 핑계를 생각해내는 것은 어려운 일이다. 실수로 예전과 겹치는 핑계를 말해버리면 상황이 더 악화될 수 있다.
  3. 또한, 가끔은 효과적인 변명을 위해 문자보다 목소리가 필요할 때가 있다. 예를 들어 역삼초에 다니는 철수는 부모님의 목소리를 빌려 영어학원을 째고 싶을 수 있다.

그렇게 만들어진 서비스가 구라공작소, 아니 '변명 생성 서비스'이다. 프론트엔드는 Flutter로 개발되었고, 백엔드는 Express(Node.js)를 사용하였다. 아래 주소들을 통해 레포지토리들에 방문하실 수 있다.

GitHub - HACKY-TALKY-2/T3_FE
Contribute to HACKY-TALKY-2/T3_FE development by creating an account on GitHub.
GitHub - HACKY-TALKY-2/T3_BE: 채널톡 <Hacky Talky> 해커톤 Team 3의 백엔드 프로젝트
채널톡 <Hacky Talky> 해커톤 Team 3의 백엔드 프로젝트. Contribute to HACKY-TALKY-2/T3_BE development by creating an account on GitHub.

이번 글에서는 개인적으로 해커톤을 참여하며 배웠던 점들을 중심으로 써 보려고 한다.

우선순위 정하기 - 로그인은 굳이 필요한가?

채널톡 해커톤은 전체 일정 중 개발에만 집중할 수 있는 시간을 많이 주신 편이었지만, 그럼에도 하룻밤이라는 시간이 절대적으로 짧음은 부정할 수 없다. 우리 팀은 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 페이지
왠지 모르게 있어 보이는 건 덤이다

그런 면에서 Swagger는 API 명세의 single source of truth가 되기 때문에 의미가 컸다. Swagger Docs 페이지에서 직접 요청을 보낼 수 있다는 점도 프로토타입 시 큰 도움이 됐다. Swagger를 추가하는 데 한 시간 정도를 썼지만, 그걸로 절약한 팀원 분들의 시간과 최종 발표에서 Swagger의 도움을 받은 것을 생각하면.. 정말 좋은 선택이었다. 다음 해커톤 때에는 Express 대신 Swagger 연동이 더 쉬운 FastAPINestJS도 좋은 선택이 될 수 있겠다 생각했다.

이른 배포는 필수! 방법은 자유..

Dockerfile을 작성하고, 이미지를 올릴 수 있는 이미지 레지스트리와 컨테이너를 바로 배포할 수 있는 Docker Compose 파일 정도면 충분한 것 같다. CI/CD까지는 필요 없다고 생각한다. GitHub Actions는 (캐시를 써도) 로컬 베어메탈 서버에서 빌드 캐시를 가지고 바로 빌드하는 것만 못하다. 해커톤처럼 main 브랜치에 커밋이 자주 푸시되는 상황이라면 더더욱 그런 것 같다.

개인 서버 모니터링 화면 (Grafana에서 캡처함)
개인 서버의 모니터링 스크린샷

그런 의미에서 돈 걱정 없이 단시간에 배포할 수 있는 나만의 인프라를 갖는 것도 좋아 보인다. 나는 이번 해커톤에서 학교에 대충 설치해둔 개인 서버와 Cloudflare Tunnel의 덕을 톡톡히 봤다. 매번 서버를 프로비저닝하는 데에는 시간이 많이 들고, 해커톤에서는 시간만큼 소중한 게 또 없다.

다음은 어디로?

50만원 상금을 들고 채널톡 마스코트(둥둥이)와 찍은 사진
남는 건 사진 뿐이라고, 안타깝게도 상금은 더 이상 남아있지 않다(!) 상금으로 팀원 분들과 맛있는 것들을 먹었고, 나머지도 거의 다 식비로 쓴 것 같다..ㅎㅎ

일부러 결과를 마지막에 쓴다. 우리 팀은 놀랍게도 최우수상(2등상)을 시상했다! OpenAI의 ChatGPT와 Whisper API 덕분에 백엔드 개발자인 내가 한 일은 많지 않았다. 좋은 결과를 얻은 건 다 짧은 시간 내에 Flutter 앱을 완성해주신 팀원 분들 덕이다. 이 자리를 빌어 다시 한 번 감사의 말씀을 올린다. 🥹

채널톡 오피스에서 한치 앞도 예상할 수 없는 짜릿한 이틀을 보냈다. 앞서 두 번의 해커톤 결과가 마냥 좋지만은 않았어서 해커톤 자체에 대한 두려움이 있었는데, 이번 기회에 생각을 다시 해보게 되었다. 이번 해커톤에서는 백엔드가 크게 중요하지 않아 내 역할이 중요하지는 않았지만, 나에게 책임이 더 크게 주어질 기회들에도 도전하고 싶다. 2월에 내 동아리인 SPARCS에서 해커톤이 열린다면, 이번에는 운영진이 아니라 개발자로서 신청해보고 싶다! 가능하다면 이번엔 프론트엔드 담당으로 출전해봐도 많은 걸 배울 수 있을 것 같다. 이번 채널톡 해커톤을 시작으로 앞으로도 여기저기 나아갈 나를 기대해주시라.

정상(Sang Jeong)

정상(Sang Jeong)

컴퓨터와 자동차를 좋아하는 대학생입니다. 공부와 연구 모두 열심히 하고 싶어요!
대한민국 부산 (Busan, South Korea)