앱잼 27회 회고록

jwkwon0817·2024년 8월 27일
0

Web Back-end

목록 보기
26/26
post-thumbnail

앱잼이란?
SK 플래닛, 알파코 디지털새싹 캠프가 공동으로 주최하는 고등학생 앱 및 융합 서비스 개발 경진대회이다.


앱잼 27회에 참여하게된 계기?

앱잼이라는 대회가 있다는 걸 STA+C 대회를 준비할 때 알게되었다. 그 때 스택 운영진 분이 학교까지 직접 오셔서 스택 대회에 대해 설명해 주실 때 앱잼이라는 대회가 있다는 것도 같이 알려주셨다.

그러나 26회 앱잼은 개인 사정의 이유로 참가하지 못했었다.

계속 다음 앱잼은 참가해야지 하는 마음을 가지고 있었는데 마침 학교 선배가 앱잼 대회에 같이 나가자고 하셔서 참가하게 되었다.


왜 미래산업 분야를?

앱잼에는 생활 정보 분야, 엔터테이먼트 분야, 미래 산업 분야로 총 세 가지 분야가 있다. 주로 다룰 줄 아는 기술 스택을 보면 생활 정보 분야가 적절하지만 왜 굳이 AI나 IoT를 다루는 미래 산업 분야를 선택했을까?

안타깝게도 신청을 늦게한 탓에 생활 정보 분야에 개발자 직군 자리가 남지 않았기 때문이다. 그래서 어쩔 수 없이 미래 산업 부문의 개발자로 참가하게 되었다. 평소에도 ChatGPT와 같은 생성형 AI를 즐겨 써왔지만 이러한 AI를 사용해서 직접 서비스를 구축해야한다고 생각하니 막막했었다.


대회 장소

이번 앱잼은 성수역 2번 출구 근처에서 진행되었다. 그러나 집에서 성수역까지 거의 1시간 반이 걸려서 아침부터 일찍 출발했어야했다.

다행히 성수동이라 그런지 근처에 먹거리도 많았고 놀거리도 많아서 대회가 시작하기 전에 근처 파스타집에서 토마토 스파게티를 먹고 대회를 시작할 수 있었다.

또 앱잼이라는 대회는 대회 중에 오후 11시 전에는 자유롭게 밖으로 나갈 수 있었는데 다행히 근처에 CU가 있어서 편의점에서 몬스터를 자유롭게 살 수 있었다.


팀 빌딩

앱잼 이전에 해커톤은 선린인터넷고등학교 교내 대회인 선린톤만 출전했었다. 선린톤은 지원하기 전에 미리 팀을 정해서 참가하기 때문에 팀 빌딩이라는 활동이 없어서 이번 대회에서 처음 접하게 되었다.

팀 빌딩의 진행 과정은 먼저 기획자가 주제를 듣고 약 15분 동안 서비스를 구상하고 발표를 진행한다. 그리고 개발자와 디자이너가 마음에 드는 기획자에게 가서 자신의 포트폴리오를 보여주면서 어필을 하고 기획자가 그 중 마음에 드는 개발자와 디자이너를 골라서 총 개발자 2명, 디자이너 1명, 기획자 1명으로 구성된 팀을 만들면 되는 활동이다.

(대회가 끝나고 생활 정보 부문에 참가한 친구에게 물어보니 포트폴리오를 보여주며 어필을 하는 건 미래 산업 분야만 그랬다고 한다. 생활 정보 부문은 선착순으로 팀 빌딩을 진행했다.)

아무튼 이런식으로 진행되는 팀 빌딩 활동에서 만약 좋은 기획을 구상하지 못한 기획자라면 어떠한 개발자와 디자이너에게도 선택 받지 못해 가장 마지막에 남는 개발자와 디자이너와 같이 하는 경우가 발생할 수도 있었다.

이번 주제는 명대사였다. 사실 명대사라는 기준은 자신이 판단하는 것이기 때문에 사실상 주제가 없다고 봐도 무방했다.

기획자가 발표를 시작하고 모든 개발자와 디자이너가 본인의 노트북에 기획 발표 내용을 정리해서 미리 원하는 기획자를 정해두고 있었다. 그러나 압도적으로 좋은 기획을 낸 기획자가 한 명이 있어서 예상대로 거의 모두가 그 분에게 몰리게 되었다. 대회 출전 경험도 별로 없고 수상 실적과 포트폴리오도 충분하지 않았던 1학년인 나에게는 포트폴리오가 가득 차 있는 2, 3학년 개발자와 디자이너들에게 당연히 밀릴 수 밖에 없었다. 어쩔 수 없이 다른 기획자에게 갔다.

그러나 다른 기획자에게서도 밀리게 되었고 같이 나간 선배와 같은 팀을 하지 못하게 되었다. 마지막으로 어쩔 수 없이 같이 출전한 프론트엔드 개발자 친구와 함께 남는 팀에 참가하였다. 우리팀의 명대사는 뽀로로와 친구들의 노는게 제일 좋아 였고, 노는게 제일 좋은 사람들을 위한 1인 여행 앱을 만들기로 했다.


대회 진행

처음 우리 팀의 기획은 아주 간단했다.

ChatGPT, Gemini와 같은 생성형 AI를 사용하여 단지 여행 코스를 추천 받는 앱이었다.

기획을 중간에 바꿀 수 있었지만 당장 떠오르는 기획도 없었기 때문에 기획자 분이 기획하신 대로 개발을 시작했다.

그 전에 선린톤에 출전했다고 했었는데 그 때 수상을 하지 못한 결정적인 이유가 프롬프트 엔지니어링이었다고 생각한다. 그 때는 돈을 내고 OpenAI API를 사용하였는데 이 때 GPT가 반환할 값의 타입을 프롬프트 안에 포함해서 GPT가 제대로 원하는 형식의 값을 주지 않는 경우가 많았다. 이 경험을 바탕으로 이번에는 Gemini를 사용하기로 했다. Gemini는 일단 돈을 내지 않고도 API를 자유롭게 사용할 수 있었고 라이브러리 내에 있는 파라미터로 코드 상에서 스키마 타입을 정해줄 수 있었기 때문이다.

그 후에는 프로젝트 세팅을 빠르게 진행했다. 먼저 GitHub 레포지토리를 생성하고 해커톤이라는 대회 특성 상 짧은 시간 내에 결과물을 도출해내야하기 때문에 테스트까지 할 시간은 없어서 CI는 하지 못하고 CD만 구축했다. 그리고 도메인까지 연결하여 기본적인 백엔드 프로젝트 세팅을 마무리했다.

AI 기능을 구현하기 전에 빠르게 회원가입 및 로그인 기능을 구현하기 위해서 구현 방법을 아는 NestJS를 이용하여 구현하려고 했다. 우리는 웹이 아닌 앱을 개발해야했기 때문에 사용자 입장에서 이메일과 비밀번호로 로그인하는거보다 카카오톡으로 로그인하는 것이 편할 것 같다고 생각했다. 그러나 나는 이메일과 비밀번호를 사용한 로그인, 회원가입만 구현해봤고, 카카오 로그인은 구현해본 적이 없었다. 거의 3 ~ 4시간 동안 시도를 해봤지만 카카오 로그인까지는 성공했지만 데이터베이스와 연결하고 JWT를 도입하는 과정에서 기존에 잘 동작하던 카카오 로그인도 제대로 동작하지 않아서 결국 4시간을 버리고 Firebase로 인증 기능을 구현하기로 했다.

이제 인증 기능을 구현하려고 정했던 NestJS 프레임워크를 사용하지 않으니 AI 기능 개발을 시작하기 전에 어떤 프레임워크를 사용할 지 정해야했다. FastAPI와 NestJS 중에 골라야했는데 DB 작업도 안하니 간단한 FastAPI를 사용하려했다. 그러나 Gemini API를 Python에서 사용하기 위해서는 google-generativeai라는 라이브러리를 설치해야했는데 이 라이브러리에는 grpcio 라이브러리 의존성을 가지고 있었다. Apple Silicon에서 grpcio가 계속해서 설치가 안되는 문제가 발생해서 어쩔 수 없이 NestJS를 고르게 되었다.

개발을 하다가 중간에 괜찮은 기획 하나가 더 나왔다. 바로 기존 여행 코스 추천에 더해서 날씨를 통해 여행지를 추천해주고 해당 여행지를 선택하면 AI가 자동으로 그 여행지 근처로 코스를 추천해주고 지도에 표시까지 해준다. 그리고 채팅을 통해 AI와 대화하면서 직접 마음에 안드는 부분을 수정할 수 있는 앱이었다.

전에 말했듯이 반환할 스키마 타입을 설정하는 기능이 있어 선린톤 때 겪었던 문제는 쉽게 해결할 수 있었다. AI 프롬프트를 작성하는 건 ChatGPT를 사용해왔던 경험으로 빠르게 작성할 수 있었다. 그러나 아주 큰 문제가 발생했다. 지도에 표시하기 위해서는 위도와 경도가 필요한데 ChatGPT, Gemini와 같은 LLM 모델에는 환각 증상이 있어서 정확한 위치를 가르켜주지 않는다. 따라서 찾아본 결과 RAG 기술을 사용하면 된다는 것을 알았지만 짧은 시간 내에 구현할 수가 없어서 결국 약간의 오차가 있는 위도와 경도를 그대로 사용할 수 밖에 없었다.

그 다음으로 구현한 기능은 간단한 프록시다. 프론트에서 네이버에서 최단 경로를 가져오는 API를 요청할 때 CORS 오류가 나서 그 부분 PROXY를 개발하였다.

프론트엔드는 React Native에서 네이버 API 다루기가 힘들어서 React로 웹사이트를 만들고 Expo 웹뷰로 앱을 개발하였고 Vercel로 배포하였다.


최종본


발표 및 심사

정말 다행히도 발표가 너무 잘 진행되었다. 딱히 절거나 그런 부분도 없었고 우리가 강조해야할 AI와의 채팅을 통한 코스 수정 기능도 잘 강조되어서 발표는 성공적으로 마칠 수 있었다.

또 기술 질문도 웬만한 질문에서 전부 다 잘 대답했기 때문에 발표는 만족스러웠다.

발표가 끝나고 운영진님이 간단하게 피드백을 해주셨는데 발표 자료에서 목차는 필요없다는 것을 알려주셨다. 생각해보니 목차가 굳이 해커톤 발표에 필요하지 않았던 것 같다. 왜냐하면 심사위원이 미리 목차를 보고 기대치를 설정해놔서 만약 그 기대치보다 낮으면 낮은 점수를 받을 수도 있기 때문이다.

마지막으로 정말 다행히도 심사위원들도 평소에 혼자 1인 여행하는 것을 즐겼고 필요했던 기능들이 들어가있는 서비스라고 생각하셔서 좋은 피드백을 남겨주셨다.


결과

사실 너무 스펙이 대단하신 선배분들이 많아서 수상하지 못할 줄 알았는데 너무 감사하게도 우리가 만든 서비스를 좋게 봐주셔서 최우수상을 탈 수 있게 되었다.

앱잼처럼 해커톤이라는 대회 종목은 무박 2일로 진행하는데 사실 매번 해커톤할 때마다 건강이 안좋아지는 것을 느꼈다. 그래도 수상하니 성취감이 너무 커서 다음 앱잼도 참여할 의향이 있다.

profile
SRIHS 119th SW

0개의 댓글