4월 말 ~ 6월 말까지 2개월 동안 진행되었던 해커톤(사실 개발자 공모전에 가깝다)이 끝났다.
그래도 참가한 김에 타이틀이라도 하나 따고 싶어서 장려상이라도 탔으면 좋겠다고 생각했는데, 대상이라는 결과에 아직도 어안이 벙벙하다.
당연히 좋은 팀원을 만난 덕이 제일 크다고 생각하지만, 그래도 내가 우리 팀이 대상을 수상하는데 어떤 기여를 했는지 기록하고 공유하기 위해 회고를 해보려 한다.
(이미 후기를 한 차례 작성했는데, 다시 읽어보니 너무 엉망이어서 아예 다시 작성해보려고 합니다.
너무 값진 경험이었기 때문에 꼭 제대로 남겨보고 싶네요.
이번엔 제대로 작성할 수 있기를 바랍니다.)
K-디지털 트레이닝 과정인 에이블스쿨 교육과정을 시작하면서 다짐했던 것 중 하나가 "공모전, 해커톤에 반드시 나가보자"였다.
프로젝트 경험 하나 없는 비전공자가 교육 수료증 하나를 들고 문을 두드렸을 때 관심을 기울여 줄 회사는 하나도 없다고 생각했기 때문이다.
마침 에이블스쿨 공지사항에 "제 4회 K-디지털 트레이닝 해커톤"이 개최된다는 소식이 올라왔고, 팀원 모집하는 사람이 없나 단톡방을 기웃거리던 차에 참여 제의가 들어와 냉큼 참여하게 되었다.
주제 : 디지털 융복합 시대의 디지털 혁신 서비스 개발
- 다양한 기술과 인프라 융합을 요구하는 디지털 융복합 시대에 적합한 새로운 기술 개발 및 비지니스 모델을 창출할 수 있는 서비스 아이디어 개발
검색해도 제대로 된 정의를 찾기 어려웠는데
"디지털 기술을 기존 산업에 융합하는 것"
정도로 이해하기로 하였다.
기존 자동차 산업에 AI가 융합되면서 자율주행과 각종 주행보조장치 등이 등장한 것이 하나의 예라 할 수 있겠다.
우리팀은 모두 에이블스쿨에서 AI 교육과정을 들었기 때문에 자연히 AI와 결합된 서비스를 개발하고자 하였다.
주제 선정 과정에서 다양한 배리어프리(노인, 장애인 등 취약자들을 위한 서비스) 아이디어가 많이 나왔는데, 하나 같이 조금만 검색해봐도 비슷한 아이디어들이 많이 존재 했다.
무엇보다 우리가 서비스 대상에 대해 잘 알지도 못하는데, 그들의 불편함을 이해하고, 시원하게 해결해주는 서비스를 만들어낼 자신도 없었다.
또 주제에 "비지니스 모델"을 창출하라 했는데, 배리어프리와 수익성을 함께 고려하자니 도저히 답이 없었다.
때문에 배리어프리보다는 차라리 수익성에 중점을 두고, 기존에도 하던 것을 AI 기술을 통해 더 편리하도록 도와주는 서비스를 주제로 선정하고자 했다.
그렇게 도출된 것이 AI가 그려주는 그림일기 서비스이다.
나를 포함해 팀원 중에서도 각자 일기를 쓰던 팀원들이 많았고, 일기를 왜 쓰는지, 쓸 때 어떤점이 불편한지 잘 알고 있었기에 서비스의 당위성을 설명하기 위해 해당 내용을 중점적으로 기획서에 작성했다.
전략이 잘 먹혔는지 172팀 중 예선을 참여할 수 있는 60팀(원래 50팀이었는데 너무 많이 참여해서 늘었다고 한다)에 선정되었다.
팀원 대부분이 앱 개발 경험이 없었는데, 그나마 팀장님이 Flutter를 사용한 앱 개발 프로젝트를 진행한 경험이 있어 Flutter 프레임워크를 사용하기로 하였다.
팀 구성은 크게 비개발자(기획서 등 서류 담당) 1명, AI 담당 2명, 화면 및 기능 구현 담당 3명으로 구성되었다.
지금까지 제대로 다룰 줄 아는 언어는 파이썬, 자바스크립트 2개 뿐이었지만, 무언가를 빨리 배워서 적용하는 것 만큼은 자신이 있었기에 기능 구현을 담당했다.
합격자 발표부터 개발 시작까지 4일 정도의 시간이 남아있었고, flutter를 다뤄본 경험이 없었기 때문이 4일 동안 언어 및 프레임워크 공부에 몰두했다.
개발 입문 때부터 노마드코더의 강의를 애용하고 있는데, 강의 스타일만 잘 맞는다면 최고의 강의인 것 같다. 심지어 Dart와 Flutter 기초 강의는 무료로 제공되니까 강력히 추천한다.
나는 일기 생성에 필요한 데이터를 사용자로부터 수집 및 가공하여 DB에 저장하는 기능을 담당하게 되었다.
그중 가장 핵심은 백그라운드에서 일정간격으로 사용자가 어느 장소를 방문하고 있는지를 저장하는 기능이었다.
많은 시행착오 끝에 구현된 최종 플로우는 다음과 같다.
- 15분 간격으로 Background Fetch를 통해 사용자 위치 좌표 수집
- 이미 같은 날에 머물렀던 장소라면 카운터만 증가, 아니라면 새 장소가 저장됨
- Google Place API를 사용해 위치 좌표에서 주변 장소의 장소명 추출
- 장소명 전처리 (특수문자, 영어 등 노이즈 정보들 제거)
- KaKao Local API를 사용해 전처리된 장소명을 바탕으로 정확한 장소명 및 장소의 카테고리(음식점-양식, 부동산, 헤어샵 등) 추출
- 미리 저장된 키워드 사전을 바탕으로 쓸모없는 장소 제거
- 최종 추출된 장소를 DB에 저장
원래는 훨씬 간단한 플로우였는데
GPS의 정확도 이슈라던가, 실제 장소의 위치와 지도가 가리키는 위치가 다르다던가... 여러가지 변수가 있어 점점 복잡해지게 되었다.
개발 중간중간 해커톤에서 제공하는 4차례의 멘토링이 있었는데, 공통된 피드백으로 킬링 컨텐츠가 너무 부족하다는 평을 들었다.
때문에 단순히 일기를 생성하고 땡이 아니라, 원하는 사람들과 공유하고 서로 번갈아가며 작성하는 교환일기 기능을 추가 구현하기로 하였고 내가 이를 전담하게 되었다.
사실 오늘 작성한 일기를 불러와서 작성 및 수정하고, 댓글을 달 수 있는 정도의 기본적인 CRUD 게시판 기능이다.
여기에 특정 참여자 끼리만 공유가 이루어지고, 사용자 초대 및 각 참여자들이 순서대로 한 번씩 작성한다는 점 정도가 추가된 기능이라 시간이 촉박하긴 했지만 어떻게든 구현자체는 할 수 있었다.
서비스 아키텍처는 다음과 같다. AI 부분을 제외하면 한마디로 '플러터로 앱 만들었어요!'이다.
이번 해커톤을 진행하면서 가장 아쉬운 것이 트러블슈팅 기록이 미흡했다는 것이다.
개발하면서 정말 수많은 에러를 마주했었는데, 조급한 마음에 그냥 이것저것 시도해보다가 에러가 해결되면 됐다! 하고 넘어가는 경우가 많았다.
개발 막바지에는 똑같은 오류가 발생했는데, 해결과정이 기억이 안나 또 고민하고 검색하고 고치는 것을 반복한 것 같다.
다음 번 프로젝트를 할 때는 꼭 오류를 기록하고, 그날그날 회고하면서 정리하는 습관을 길러야겠다.
예선 진출팀들은 실무자에게 아이디어 보완 및 개발에 대한 조언을 요청할 수 있는 4번의 멘토링 기회를 받는다.
우리팀은 처음엔 2번은 아이디어 보완에, 2번은 개발에 대해 멘토링을 받을 예정이었지만, 아이디어 관련해서 이런저런 피드백을 너무 많이 듣게되어 결국 아이디어 보완에만 모든 멘토링 기회를 사용했다.
특히 비즈니스 모델 쪽에서는 모두 무지하기 때문에 수익성, 타겟층 선정 관련해서는 멘토님들의 피드백을 모두 반영하려고 노력하였으며, 최초로 작성했던 기획서 초안을 몽땅 갈아 엎게 되었다.
이로 인해 개발 내용도 많이 바뀌고, 개발 담당들도 기획서 수정에 많은 시간을 쏟게 되어 개발 진척이 늦어지는 부작용이 있었다. 하지만 이 과정이 없었다면 아마 본선에 가지 못했을 것이라 생각한다.
만약 다음 번 대회가 열린다면, 멘토링 기회를 꼭 잘 활용하고 아이디어가 엎어지거나 개발이 늦어지더라도 최대한 멘토님 피드백을 귀기울여 들을 것을 추천하고 싶다. (물론 말도 안되는건 적당히 걸러서...)
사실 아이디어에 대한 확신이 없었기 때문에 장려상이라도 탔으면 좋겠다는 분위기였는데, 본선에 진출하게 되어 팀원들 모두가 놀랐다.
이제 본선에서는 기획서에 더해 PPT와 발표로 최종 순위를 결정한다.
사실 예선에서 개발을 다 끝내지 못한 상태였다.
UI/UX 변경도 있었고, 교환일기 같이 추가로 개발을 진행해야 되는 기능이 많았기 때문...
이 때는 정말 발등에 불이 떨어져서 잠도 제대로 못자고 개발에 매진했다.
발표는 대면으로 심사위원 앞에서 10분 동안 진행하며, 5분의 Q&A 시간이 진행되었다. (시간은 정말 칼같이 끊는다)
심사 위원 분들은 스타트업 대표, 컴퓨터 및 인공지능 관련 학과 교수들로 구성되어있었는데 날카로운 질문들을 많이 던져서 당황했다.
느낀바로는 다음과 같은 것들을 고려하는 것이 좋을 것 같다.
무려 대상을 받게 되었다.
진짜 좋은 결과를 얻어서 시간을 투자한 보람을 느낄 수 있었다.
정말 좋은 팀원들과 만난것도 너무 감사했다.
뭐라도 해야겠다는 생각에 쫓기듯 신청하게된 에이블스쿨이지만, 너무 잘 선택했다는 생각이 들었다.
사실 그동안은 거의 이론만 배웠고, 실습이라 해도 정해진 플로우를 따라하는 것 정도였는데, 진짜 실전을 마주해보니 정말 개발 실력이나 지식이나 모두 너무 부족하다는 것을 느꼈다.
사실 마지막까지도 앱은 오류 투성이었고, 해결하지 못해 대충 임시조치로 덮어둔 기술적 난관들도 너무 많았다.
특히 개발 기간에 쫓기다보니 테스트도 제대로 이루어지지 못해서 시연 당일까지도 급하게 수정하는 해프닝도 있었다.
마지막은 클린 코드를 거의 전혀 신경쓰지 못했고, 코드의 효율성 역시 전혀 고려하지 못했다.
좀 심하게 말하자면 내 코드는 세심하게 다뤄주면, 어떻게든 굴러는 가는 스파게티 덩어리라고 할 수 있겠다.
아직 많이 부족함을 느꼈고, 뭔가 많은 것들을 알고 있는 멘토에게 이것저것 가르침을 받으면서 성장하고 싶다는 것을 느꼈다.
그래서 앞으로으이 최우선 목표는 이것저것 가리지 않고, 일단 주니어 개발자로써 취업하여 실무 코드들을 만나며 성장하는 것이다.
꼭 올 하반기 내로 취업하는 것을 목표로 삼아야겠다.