기타

안녕 나의 첫 서비스! 1인 개발, 배포, 운영부터 서비스 종료까지의 회고록

jnk1m 2023. 11. 6. 01:45

왜 1인 개발?

전에 다니던 회사, 개발자가 되고 싶어서 그만뒀다. 그리고 1년간 수업을 듣고 직무 기술을 학습했다.
퇴사 후에도 이전에 이룬 성과를 바탕으로 프리랜서로 연결을 유지해 왔다. 취업을 준비하던 중, 배달 기능을 포함한 웹 플랫폼을 구축하고 싶다는 대표님의 연락을 받았다. 대표님! 제가 배운 게 바로 그거잖아요! 저 할 수 있어요!라고 말하고 모든 게 시작됐다.
 

인고의 과정


기획

제일 먼저 미군 부대라는 특수성을 염두에 두고 프로젝트의 목표와 기본 요구사항을 정의했다. 가장 기본적인 기능은 메뉴를 보여주고, 배달 주문을 넣을 수 있도록 하는 것. 하지만 디테일이 갈피를 잡지 못하고 자주 변경되곤 했다. 클라이언트의 입장에서 생각해 본 결과, 기술적 세부 사항에 대한 명확한 이해 없이는 방향 설정이 어려울 수도 있다는 걸 깨달았다. 그때부터 적극적으로 의견을 제시하고 기능을 먼저 제안하기 시작했다. 또한 마이크로소프트 팀즈를 이용해 실무자인 매니저와 적극적으로 소통하며 틀을 잡아갔다. 여러 가지 관점에서 생각하며 기능을 체계적으로 문서화하는 과정을 통해 요구사항 정의서를 완성시켰다.
 
 

DB 설계 및 구축

한 달 동안 DB를 설계하고 구축해 보면서, 처음 맞닥뜨린 문제들이 많았다. 그때마다 '더 나은 방법은 무엇일까?' 하고 자주 고민에 빠지곤 했다. 우리 집, 학교, 와이파이 환경이 아닌 독특한 환경에서 DB에 접속하고 연결하는 경험 또한 새로웠다. 이 부분도 얼마나 고생을 했는지! AWS RDS를 미처 생각하지 못해서, 초반에는 DB가 꺼지지 않도록 회사 컴퓨터를 내내 켜놓기도 했었다😂
 

아는 만큼 보이는 데이터베이스 설계와 구축 - 예스24

데이터 모델링에 자신감을 불어넣는 설계와 구축 노하우데이터베이스 설계와 구축에 참여했던 데이터베이스 설계자 중에도 데이터 모델링을 하는데 두려움을 가진 사람이 적지 않다. 해당 업

www.yes24.com

이 책을 읽으면서 많은 도움을 받았다. DB를 구축하는 과정에서 새로운 지식을 쌓으며 시야를 넓혔다. 어제는 최선이라고 생각했던 구조가 오늘 보니 미흡해 보여 갈아엎은 것도 수십 번. pk, fk 설정을 고민하며 테이블 드랍을 몇 번을 했는지! 
DB 설계 및 구축은 아무 경험이 없는 신입이 혼자서 하기에 쉬운 일이 아니었다.. 더 좋은 설계를 하기 위해 내 수준을 넘어서는 욕심을 내기도 했던 거 같다. 하지만!! 더 효율적인 구조를 만들려고 욕심 내는 게 뭐가 나쁜가. 치열하게 고민하고 탐구하는 과정을 통해 더욱 성장할 수 있었다고 생각한다. 
 

 
FE 개발

프론트는 부트스트랩을 구매해서 사용했다. 부트스트랩이 있기 때문에 프론트는 그다지 어렵지 않게 만들 수 있으리라고 생각했는데... 아니었다🥲 각 요소의 디테일을 상세하게 조정하고, 데이터를 뿌려주는 부분도 다시 코드를 짜야했다. 프로젝트는 총 22개의 페이지로 구성되어 있는데, 순전히 프론트 개발에만 일주일이 넘는 시간을 썼던 거 같다. 패딩, 마진과 같은 요소들도 처음에는 헷갈렸는데 나중에는 하도 봐서 그냥 보기만 해도 감이 오는 정도가 됐다 허허.. 부트스트랩을 구매하면 주는 여러 개의 웹페이지 소스들을 눈여겨봤다가 필요한 부분에 넣어서 재조립하는 능력도 키울 수 있었다.
 
 

BE 개발

자바 ORM 표준 JPA 프로그래밍 - 예스24

자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA 기초 이론과 핵심 원리, 그리고

www.yes24.com

스프링 시큐리티 인 액션 - 예스24

모든 스프링 개발자에게 권장하는 스프링 시큐리티 필수 가이드!보안은 타협할 수 없는 중요한 요소다. 스프링 시큐리티로 안전하게 데이터를 전송하고 자격 증명을 검증하며 공격을 방지하는

www.yes24.com

스프링 부트로 개발하는 MSA 컴포넌트 - 예스24

마이크로서비스 아키텍처 환경에서컴포넌트를 개발할 때 무엇이 필요한지 알아보고,이때 필요한 스프링 부트 사용법을 익힌다!마이크로서비스 아키텍처는 대규모 서비스의 ‘정답’처럼 여겨

www.yes24.com

백엔드 개발은 가장 먼저 엔티티를 만들고 관계를 매핑시키며 시작했다. 바이블이라고 할 수 있는 자바 ORM 표준 JPA 프로그래밍 책을 보며 많은 도움을 받았다. 3월에 프로젝트를 시작했는데, 어느새 5월이 되어가고 있었다. 주문 기능이 없더라도 일단 메뉴와 매장 정보라도 볼 수 있게 서비스를 시작해 달라는 요청을 받았다. 그래서 메뉴 리스트 페이지, 메뉴 상세 페이지, 메인 페이지, 매장 정보 페이지를 우선적으로 만들고 정보를 조회하고 출력하는 코드를 짜기 시작했다. 
 
DB에서 메뉴 정보를 불러와 화면에 뿌리는 코드를 짜고 실행했을 때, 메뉴가 차례로 출력되던 순간은 지금도 선명하다. 기획부터 DB 구축, 그리고 메뉴 리스트를 가져오는 코드를 짜기까지 한 걸음 한 걸음 걸어왔다. 보이지 않는 데이터의 세계에서 쓴 코드가 제대로 작동하는지, 최선의 방법을 택하고 있는지 끊임없이 의문을 품었다. 그러나 마침내, 실제 정보가 화면에 펼쳐지는 걸 보니까 얼마나 기쁘던지!! 정말 큰 성취감을 느꼈다😊
 
다음은 로그인 관련 기능을 개발했다. 로그인은 Google Sign in API를 사용했다. 환경 설정을 어떻게 하는지 모르겠어서 한국 웹, 외국 웹 구분 없이 끊임없이 검색하고 또 고민했었다.. 로그인 후에 전화번호 인증 기능에도 공을 들였다. 서비스 특수성 때문에 홈페이지에서 결제를 할 수 없는 한계가 있기 때문이다. 그래서 주문을 할 때 꼭 고객이 이용하고 있는 실제 번호를 받아야 한다. 게다가 고객은 한국 번호가 없을 수도 있고, 또한 미국이 아닌 제3국의 통신 서비스를 이용 중일수도 있다. 그래서 다국적 SMS 인증 서비스인 Twilio를 사용했다. 그중에서도 Twilio SMS가 아닌 Verify 서비스를 이용해서 추가적인 번호 구매 없이 처리할 수 있도록 했다. 또한 고객이 번호를 인증하는 과정에서 발생할 수 있는 여러 시나리오에 대응하기 위해서 백엔드의 상태 관리와 데이터 유효성 검사, 프론트엔드의 UX 최적화가 필요했다. 다양한 상황에서 UI/UX를 유지하면서도 백엔드와 효율적인 데이터 통신을 할 수 있는 로직을 구현하는 부분이 쉽지 않았다. 이 부분은 또 열심히 연구해서 효과적으로 구현해 냈다.
 
다음으로는 주문 기능을 개발했다. 메뉴를 카트에 담을 때, 메뉴가 가진 옵션 속성을 어떻게 처리하면 좋을지 많이 고민했다. 카트에 담기는 한 개의 메뉴는 여러 개의 옵션을 가질 수 있기 때문이다. 코드를 짜며 연구해 보니, 3월에 구축한 DB로는 장바구니와 주문 기능이 효과적으로 작동하지 않았다. 결국 cart, order 테이블을 드랍한 후에 새로운 테이블을 추가하고 관계를 맺어 로직을 구현했다. 사실 주문 기능은 미흡하게 느껴지는 부분이 많아 아직도 아쉬움이 크게 남는다. 주문 기능의 요구사항이 계속 변동되고, 결국에는 중단해야 했기 때문에 더욱 아쉽다. 다시 돌아간다면 더 잘할 수 있으리란 생각이 자꾸 든다.. 지나간 것에 대한 후회는 덜고, 경험으로 말미암아 배우고 성장하는 게 맞을 텐데 첫 서비스라 그런지 더 생각이 나나 보다. 
 
 

배포, 운영

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 예스24

가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다. 경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현한다. JPA와 JUnit 테스트, 그레이들, 머스테치, 스프링

www.yes24.com

처음 배포 환경 세팅할 때 많은 도움을 받았던 책. 하지만 2019년에 출간된 책이기 때문에, 현재는 버전 업그레이드된 프로그램이 많아서 세세한 환경 설정은 또 애를 많이 써야 했다. 환경 설정이 개발 못지않게 어려웠다. 헤매고 나서 알게 된 걸 기록하기 위해 이 시점부터 TIL을 쓰기 시작했다.
정말..... 너무너무 어려웠다.... 기억에 남는 에피소드가 하나 있다. 위 백엔드 개발 파트에서 말했듯이, 서비스는 순차적으로 배포가 됐다. 5월에는 로그인 기능이 없이 배포를 했기 때문에 http를 썼고, 이후에 로그인 기능을 더한 다음에는 GoDaddy에서 Route 53으로 도메인을 이전하여 https를 이용하도록 했다. 도메인 이전을 완료했음에도 불구하고 사이트에 접속할 수 없었다. 하필이면 나는 다음날 강릉 여행이 예정되어 있었다. 우리 웹사이트에 접속이 안되는데 이걸 두고 내가 어떻게 마음 편하게 여행을 가겠는가.. 결국 노트북을 들고 가서 TTL이 지날 때까지 기다렸다. 48시간이 지났는데도 접속이 되지 않아 노트북을 가져가서 카페에서 일했다. 알고 보니 로드 밸런서 상세 설정이 맞지 않아서 생긴 문제였다. 해결하는 과정에서 카페는 마감시간이 돼버렸고, 차에 가서 와이파이에 연결해 계속 작업했다. 설정을 다시 맞춰서 마침내 웹사이트에 제대로 접속하여 구글 로그인까지 되는 걸 보았을 때, 순수하게 기뻤다! 이 순간도 오래 기억에 남을 순간 중 하나다.


배운 점

이 경험을 통해 항상 완벽한 상황에서 일할 수는 없다는 걸 배웠다. 시니어 개발자나 멘토가 옆에 없을 수 있고, 정해진 개발 방법론이나 지침이 없을 수도 있다. 그러나 어려운 상황 속에서도 최선을 다해야 한다. 그렇게 한다면 길을 찾을 수 있다는 것을 깨달았다. 스스로 공부하고 검색하며 깊이 탐구한 경험을 통해 내 지식의 한계를 확장할 수 있었다. 많은 도움을 준 스택오버플로우, 깃허브, 그리고 다양하고 독특했던 여러 커뮤니티들의 (이메일 기반의 커뮤니티도 있었다!) 선배 개발자들에게 고마움을 느꼈다. 언어를 뛰어넘어 컴퓨터와 네트워크로 하나 되는 개발자 생태계를 느낀 것은 값진 경험이었다. 나도 지식과 스킬을 쌓아 누군가를 도와줄 수 있는 레벨이 된다면, 꼭 지식을 나누며 도움을 줘야지. 또한 기획부터 개발, 배포, 운영 등 하나의 서비스를 처음부터 끝까지 주관한 경험을 통해 업무의 전체적의 흐름을 익히고 이해도를 높일 수 있었다. 
 

아쉬웠던 점

첫 서비스라서 그런지 이런저런 아쉬움이 많이 남는다. 장님이 코끼리 더듬듯이 개발을 하지 않았나 싶다. 내가 시니어 레벨 정도의 경험이 있었다면, 더 나은 서비스를 구축할 수 있었을 거 같다. 더 잘할 수도 있었으리라는 아쉬움과, 내 지식의 한계 안에서 충분히 최선을 다했다는 마음이 충돌한다. 내가 제대로 된 방향으로 가고 있는 건지 알 수 없어서 불안했다. 특히 추후에 문제가 생길 수도 있는 부분을 놓치고 있는 건 아닌지 항상 걱정이 됐다. "그렇게 하면 이런 문제가 생길 수도 있어!"라고 말해줄 이가 있었으면 했다. 팀에서 일하며 배우고 성장하고 싶다는 생각을 하게 됐다.
일정의 촉박함과 구현의 어려움으로 인해 사용자에게 완벽하게 최적화되지 않은 로직으로 구현한 적이 있다. 부끄럽다. 결국 우리의 서비스를 이용해 주고, 유지시켜 주는 건 사용자라고 생각한다. 그런 사용자에게 매끄럽고 편안한 서비스 경험을 제공하는 게 중요하지 않을까? 나는 더욱 안정성 있고 신뢰도 높은 서비스를 제공하고 싶다. 지금 이 부끄러움을 잊지 않고 더욱 경험을 쌓고 공부하여 사용자를 위한 서비스를 만들고 싶다.
 


 
내가 처음으로 만든 프로젝트는 곧 서비스 종료를 앞두고 있다. 인고의 시간을 거쳐 개발하고 배포한 이 서비스를 내 손으로 직접 내려야 한다니, 기분이 묘하다. 섭섭하고 서운하기도 하다. 이 서비스는 곧 사용자를 만날 수 없게 되지만, 그렇다고 해서 사라지는 건 아니다. 7개월의 시간동안 성장의 자양분이 되어줬기 때문이다. 개발자의 길을 걸어가면서, 처음으로 만들었던 이 프로젝트를 잊지 않아야지. 
 
안녕 나의 첫 서비스!