혼자서 2일만에 사이드 프로젝트 배포까지 - ‘졸업이당’

이강현·2024년 10월 20일
74

프로덕트

목록 보기
1/1
post-thumbnail

사이드 프로젝트를 시작하게 된 이유

나는 소프트웨어 마이스터 고등학교를 2년째 다니고 있는 고등학생이고 목표는 3학년 때까지 월 10만원이라도 벌어다주는 시스템을 만드는 것(자세한 내용은 티스토리를 참고) 이다. 그래서 이 사이트 프로젝트를 하는 궁극적인 이유는 바로 돈을 벌기 위함이다.

또 다른 이유도 있다. 나는 교내 동아리에서 도담도담이라는 교내 학교 관리 서비스를 만들고 있다. 근데 이 서비스는 우리 학교에서만 쓰기 때문에 좀 아깝다는 생각이 들었다. 힘들게 만든 ui와 기능들을 고작 교내에 있는 200명 밖에 쓰지 않는다니 참 아쉬웠다. 그래서 다른 서비스에서도 쓰일 수 있는 도담도담 기능들은 갖고 오는 것도 나쁘지 않다는 생각이 들었다.

마지막 이유는 내가 만든 라이브러리를 테스트하기 위함이다. 내 목표는 돈 벌어다주는 시스템을 만들거랬지 않나? 그래서 앱을 공장처럼 찍어낼 수 있도록 ui 디자인시스템, utility, 네트워크 등을 따로 모듈로 분리한 뒤 라이브러리로 만들었다. 이런 일종의 템플릿이 얼마나 효율적이고 생산적인지. 얼마나 빠르게 첫 MVP를 제작할 수 있을지 알아보고자 했다. 아래 깃허브와 피그마에서 자세히 확인해볼 수 있다.

my ios kit - Github 바로가기
my design system Figma 바로가기

아이디어

앱스토어에서 군돌이 라는 앱을 우연히 보게되었다. 군대 전역일이 몇 퍼센트 남았는지 알려주는 앱이다. 아이디어만으로도 굉장히 흥미롭다고 느꼈다. 특이한 점은 홈화면에서 퍼센트가 실시간으로 올라간다는 것이다.

이 앱을 보자마자 “어 이거 학교용으로 만들어도 될 거 같은데?”라고 생각했다. 일단 내 주변만 보더라도 학교를 싫어하긴 싫어했지 학교를 좋아하는 친구가 한 명도 없다. ‘전역’을 ‘졸업’으로 바꿔서 앱을 제작하면 좋을 것 같았다. 핵심 기능은 졸업이 며칠 남았는지 몇 퍼센트 남았는지 알려주는 기능으로 정했다.

시작

앱 이름은 졸업이당으로 정했다.

일단 레포지토리부터 만들었다. 나는 그동안 레포지토리를 (feature이름)-ios, (feature이름)-android 하면서 플랫폼마다 여러 개 만들었지만 이 프로젝트는 그냥 혼자 하는 것이기 때문에 모노레포로 했다.

iOS는 SwiftUI + Combine으로 만들었다. 현시점 iOS개발을 하기 위해 가장 안정적이면서 생산적인 기술이라 생각했기 때문이다. 서버는 Spring boot를 사용했다.

또 나는 서버 개발자가 아니기 때문에 서버 코드는 굉장히 대충 짰다. 기능이 별로 없었기 때문에 폴더도 그냥 Controller, Service, Repository 이런식으로 나누어 만들었다.

그리고 프로젝트를 시작할때 불필요하게 추상화를 하거나 레이어를 만들지 않고 실용적이고 미니멀하게 코드를 짜자고 스스로 생각했다. 취업, 포트폴리오랍시고 클린아키텍처, mvvm, mvi 어쩌구를 막 적용 해왔는데 다 필요없다. 인원이 많지 않은 이상 그런 건 확장하면서 적용해 나가면 된다.

나이스 API는 거지같다

일단 모든 학교 정보를 불러온 뒤 각 학교에 해당하는 모든 졸업날짜 데이터를 얻어야 했다. 마땅히 쓸만한 게 나이스 API 밖에 없길래 이걸로 선택했다.

나이스 API 서비스를 만든 개발자에게는 죄송하지만 나이스 API 정말 개떡같았다. 변수 이름은 모두 대문자에다가 쓸데없이 줄임말을 써놔갖고 하나하나 주석을 달아놔야 알아볼 수 있었다. (json용량 줄이려고 그러는 거면 인정이긴한데 그거 얼마나 줄어든다고…) 또, List안에 같은 타입만 넣어놓은 게 아니라 여러 타입을 섞어놓는 바람에 @JsonIgnoreProperties 어노테이션을 달아 파싱하는 등 굉장히 멍청한 파싱 방법을 사용할 수 밖에 없었다.

학교 정보는 그냥 엑셀로 다운받아서 import했고 졸업 정보는 학사 일정을 다 불러온 다음 “졸업” 키워드가 들어가 있으면 DB에 넣었다.

MVP 완성, 드디어 배포!

그렇게 첫 MVP가 완성이 되었다. 서버와 DB는 cloudtype으로 배포했다.

버전관리도 대충했다. 커밋 메세지도 난리난 걸 볼 수 있다. 중요한 건 빨리 배포하는 것.

첫 배포까지 2일 걸렸다. (앱스토어에 한번 리젝 먹었다.)

이렇게 빨리 배포할 수 있었던 이유는 무엇일까? 일단 아까 말한 라이브러리의 도움으로 폰트, 색상, 컴포넌트에 대한 세세한 고민들을 덜어낼 수 있었고 로컬 스토리지, 네트워크에 대한 구체적인 구현을 신경쓰지 않아도 됐다. 또, 다른 기능을 넣고 싶더라도 욕심 부리지 않고 졸업이 며칠 남았는지 알려주는 핵심 기능을 구현하는데에 집중하였다. 핵심 기능 외에는 전부 포기했다. 적은 기능으로 배포할 수준의 완성도를 만드는 게 우선이었다.

이후에는 우리 학교 채팅방에다가 홍보했다. 이틀정도 지나고 App Store Connect에서 추세를 확인하니 50명 정도 설치했다. 앱스토어 바로가기 🔥

그러다가 갑자기 PR이 올라왔다. 같은 동아리 선배였다. 학교이름 옆에다가 지역 정보를 넣어서 UX를 개선하셨다! 좋은 아이디어라고 생각해서 Approve을 받았다.

그런데 며칠 지나고 보니 서버에 문제가 생겼다. 아니 get요청 밖에 안 하고 api도 2~3개 밖에 없는 서버에서 왠 Http Status 500이 뜨는 것 아닌가. 보니까 서버가 문제가 아니라 DB가 문제였다. DB는 cloudtype을 쓰고 있었는데 얘네가 매일매일 DB를 종료시킨다. 유지하려면 돈을 내라는 것이다…. 음 그럴 수 있지.. 돈은 벌어야 하니까

바로 다른 서비스로 갈아탔다. koyeb이라는 서비스인데 cloudtype은 mariadb밖에 지원 안 하더니 여기는 postgresql을 쓰란다. DB에는 데이터가 별로 없었어서 csv로 export하고 import해서 쉽게 이전할 수 있었다. 서버는 spring jpa를 쓰고 있었기 때문에 그냥 application.yml에서 딸깍 드라이버만 바꿔주어 설정을 마칠 수 있었다!

(그러나 koyeb서버와 DB는 드럽게 느렸다. 쿼리 한번 날리는 데에 6~8초가 걸렸다. 학교 조회 API는 12500개의 컬럼을 조회하는데 20초 넘게 걸렸다. cloudtype 서버도 느려터졌었는데 koyeb은 더 느렸다...... 학교 정보를 서버나 client에서 캐싱하는 방법도 있었지만 우선순위는 아니라서 패스.)

마음 다잡고 다시 시작.

이후부터 너무 바빠져서 사이드 프로젝트를 할 시간이 없어졌다. 3주 동안 프로젝트가 스탑됐다. 그러다가 주민등록증 발급받고 해외결제 가능한 카드만들었다. 카드를 만들었다는 이유로 갑자기 AWS를 배우고 싶어졌다 🤣. 그래서 AWS도 배울겸 프로젝트를 다시 시작하기로 마음 먹었다.

서버는 EC2에 DB는 RDS에 배포했고 프리티어를 사용했다. 근데 EC2, RDS의 지역을 둘 다 오하이오 주로 만들어버렸다. 그냥 삭제하고 새로 만드는 게 빠를 거 같아서 서울 지역으로 다시 만들었다.. 🥲

수동 배포하는 게 처음엔 마인크래프트 서버 여는 것 같아서 재미 있었다. 그러나 계속 개발 하다보니 귀찮아졌다. 그래서 Github Action으로 workflow를 만들어보기로 했다. 아래는 삽질의 과정이다….

git pushworkflow동작 (yml설정빌드artifact에 업로드EC2 접속해서 다운로드start.sh 실행) → 기존 프로세스 삭제 후 jar파일 실행. 이렇게 배포되도록 구축했다.

다음으로 개떡같던 서버 코드를 기능이 추가됨에 따라 리팩토링을 했다. iOS도 코드를 정리하고 위젯 개발을 위해서 모듈화도 했다.

이후에는 여러가지 기능을 추가했다.

처음에 추가한 기능은 OAuth이다. 엥? 왠 OAuth? 사실 기능이 간단해서 굳이 추가하지 않아도 됐다. 그래도 추후 확장성을 위해 OAuth 기능을 넣었다. OAuth는 Google, Apple 로그인이 되는 Spring boot 템플릿을 미리 만들어놓았기 때문에 2일 정도에 걸쳐 빠르게 구현할 수 있었다. (자세한 건 아래 깃헙 링크 참조)

my auth server Github 바로가기

다음으로 기능을 조금 많이 추가했다. 간단하게 primary color을 바꾸는 기능인 테마 기능을 추가했고 급식 캘린더와 급식 위젯 기능을 추가했다. 또, 졸업날을 알려주는 위젯도 더 이쁘게 만들었다. 구글 Ad mob을 사용해서 광고 배너도 3개 넣었다.

또, 학교에서 어떤 친구가 나에게 장학금처럼 혜택같은 기능을 넣어보는 게 어떠냐고 물었다. 좋다. 바로 집에가서 2일만에 서버, iOS 기능 구현을 끝내고 배포까지 마쳤다.!

회고

처음에는 별 생각없이 프로젝트를 시작했다. 그러나 어느새 200 커밋 돌파했고 이 일에 완전히 몰입하고 있는 나 자신을 발견하게 되었다. 그렇다. 혼자 서버와 iOS, 디자인과 배포까지 하니 왠지 모를 뿌듯함이 들었고 나 자신이 자랑스러워졌다.

그리고 돌아보니 실질적인 개발기간은 엄청 짧았다. 정말 이 프로젝트를 위해 들인 순수 시간은 100시간도 채 되지 않는 것 같다. 효율, 재사용, 배포, 그리고 그 안에서 최대한 완성도를 올리는 데 집중했기 때문이다.

피그마도 그냥 목업 만드는 용으로만 썼다. 디자인 시스템 코드를 그대로 갖다 썼기 때문에 UI 디자인은 할 필요가 없었다.

이 프로젝트는 대부분 주말이나 평일 밤 또는 새벽에 진행했다. 그래서 시간을 짬짬이 내서 꾸역꾸역 진행할 수 밖에 없었다. 지금도 일요일 밤에 겨우겨우 글을 쓰고 있다. 이런 상황에서 배운 가장 중요한 점은 아래와 같다.

  1. 배포가 중요함.
  2. 기능의 품질보다는 일단 완성을 하는 것.
  3. 아이디어를 빠르게 구현할 수 있는 확장성/유연성 높은 설계.

또 기술에 대해서도 생각해봤다.
현재는 iOS는 SwiftUI와 Combine을 서버는 Spring boot 프레임워크를 사용하고 있다.
근데 React native + React + Node.js 조합도 고려해 봐야 할 것 같다.
일단 언어가 전부 JS라서 코드 공유, 학습할 지식이 적다.
또, React와 React Native는 둘 다 React라서 코드 공유가 가능할 것 같다
(사실 나의 뇌피셜이고 React Native는 2시간 정도 맛보기 정도만 해봤다.)

프로젝트 자체를 통으로 모노레포로 한 것은 잘 한 것 같다.
어차피 프로젝트도 혼자하기 때문에 컨플릭이 날 일도 없기 때문이다.
또, 서버의 Github Action에서 Root path를 지정하면 그 안에 있는 코드가 수정될때만 Action이 실행되기 때문에 클라이언트 코드에 의해 Action이 영향받지 않는다.
추가로 위 JS계열 기술스택을 모노 레포로 한다음 모듈간 코드 공유하면 생산성이 엄청 올라갈 것 같다.

앞으로는 좀 더 이 서비스에 대해 생각 또는 실험들을 해 봐야 할 것 같다.
일단 쓸 이유를 만들어 줘야 한다. 장학금 기능 같이 말이다.

또 마케팅을 해야 한다. 지금 이렇게 글을 쓰는 것도 사실 마케팅을 위해서다.
인터넷에 내 프로덕트와 관련된 글, 영상 들을 올리고 관련 하이퍼링크(a 태그)가 양산되기 시작하면 자연스럽게 유저들이 유입될 것이라 생각하기 때문이다.
인터넷 커뮤니티, 카카오톡 오픈채팅방, 디스코드, 네이버 카페.. 등등을 한번 둘러봐야겠다.

지속적으로 UI/UX, 기능 업데이트도 해야겠다.
안드로이드 앱도 개발해야 할까??
또 BM은 배너광고 밖에 없는데 돈은 어떻게 벌어야 할까?
애초에 아이디어 자체가 돈을 벌 수 있는 아이디어인가??
애초에 아이디어 자체가 졸업이라는 단일 기능에 집중적이다 보니 다른 기능을 넣으면 안 어울리나?
장학금, 급식 기능도 그나마 무난해서 넣은 것이다.
졸업이당 말고 다른 프로덕트도 만들고 싶다.

이상 끝. 피드백은 언제나 환영입니다 🔥

졸업이당 Github 바로가기
앱스토어 바로가기

추가로 내 포폴

profile
티스토리 - https://hhhello.tistory.com
post-custom-banner

7개의 댓글

comment-user-thumbnail
2024년 10월 21일

화이팅~

답글 달기
comment-user-thumbnail
2024년 10월 22일

2일만에 배포라는 멋지네요!!

답글 달기
comment-user-thumbnail
2024년 10월 25일

멋진 서비스네요 ☺️ 고등학생 신분이라 제약 사항이 많았을 수도 있는데 정말 대단하세요!! 글 잘 보고 갑니다 👍

1개의 답글
comment-user-thumbnail
2024년 10월 25일

멋있어요

답글 달기
comment-user-thumbnail
2024년 10월 31일

예전에 본문에 언급하신 도담도담 프로젝트 시연을 본 적이 있었는데 본문을 보니 떠오르네요
큰 목표를 잡고 시작하면 이런저런 핑계로 완성까지 도달하기가 어려워지는데
작은 목표로 시작해서 완성에 완성을 더해가며 프로젝트를 이어나가신 모습이
참 본받을 점이 많다고 느껴지네요.
앞으로 다른 프로젝트들도 기대하겠습니다.

답글 달기
comment-user-thumbnail
2024년 11월 3일

잘 읽었습니다. 글에 열정도 느껴지네요. 돈을 벌자는 목표도 강력한 원동력이 되는것도 사실이지만 좋은 소프트웨어를 만드는 엔지니어라는거 잊지 말자구요! 성공하시길 기원합니다.

답글 달기