🌱 2년 전, 왕초보 개발자가 서비스를 출시하기까지의 기록 (#4)
그렇게 내 첫 웹앱이 단순히 localhost 에서만 그친 게 아니라 자체 도메인을 가진 하나의 웹 서비스로 완성되었다.
프로젝트에 참여하기 전에는 개발하고 배포하면 끝이라고 생각했지, 실 사용자들에게 내가 만든 것을 서비스해보는 건 상상조차도 하지 못했다. 그리고 운영을 하다보니 느낀 점은, 개발하다 삽질하는 건 사실 아무 것도 아니라는 점이다. 피해를 보는 ‘사용자’ 가 없기 때문에 수정하면 끝나지만, 운영 도중 에러가 발생한다면 사용자가 피해를 입는다.
운영을 하는 순간 내가 만든 서비스가 서비스하는 기간 동안 사용자에게 피해를 덜 끼치도록 책임져야 하는데, 왕초보 개발자인 나는 그 책임의 범위가 어디까지이고, 어떻게 져야 하는 지 몰랐다. 물론 아직도 운영 경험은 없다... 기회가 된다면 반드시 해보고 싶은 경험 중 하나다.
어쨌든, 그럼에도 불구하고 나름대로 운영을 위해 베타테스트를 해본다거나, 릴리즈노트를 작성해 사용자들에게 공유하는 식으로 노력했었다. (아무에게도 피드백을 구하지 않아서 잘 한건지 아닌지 판단은 안 된다...)
완성이 끝이 아니다
오픈 일자 전, 최대한 오류를 검수하고 싶어서 혹시라도 내가 발견하지 못한 에러가 있지는 않은지, 아니면 예기치못한 에러가 발생하지는 않는지 테스트하기로 했다. 문제는 QA를 어떻게 진행하냐는 거다. 로컬호스트나 올릴 줄 아는 왕초보 개발자에게 QA는 너무나도 낯선 분야였다. 당연하게도 TDD라는 개념을 당시에는 몰랐고, 대신 팀원들의 지인을 동원해 베타테스트를 진행하기로 했다.
프로젝트 사이트 주소와 구글 설문지를 드리고 사용할 때 불편한 건 없는지, 오류가 없는지, 혹시 추가할 기능이 있을지 등등에 대한 의견을 받았다. 이 과정에서 오류를 여럿 발견했고 수정했으며 공통적으로 나온 편의성 관련 피드백을 받아 개선했다.
🎉 드디어 오픈!
테스트를 마친 뒤, 오픈 일자 날 정식으로 우리 프로젝트의 웹 서비스를 오픈했다!
첫 오픈 때 pythonanywhere에 기록된 api 호출 수는 약 300여번이었다. 로컬스토리지에 저장해두는 로직을 넣었으니, 모바일과 pc 둘 다 그날 동시에 접속했다는 상황을 고려하지 않으면 1번당 1명으로 생각해도 될 것이다. 프로젝트 운영 SNS의 팔로워 수도 얼추 비슷했다. 작은 프로젝트에 300명이면 나름 선방하지 않았나 한다.
꾸준히 프로젝트 주제와 관련된 커뮤니티에 홍보도 했다. 다행히 많은 분들이 좋은 말을 해주셨다. 그렇게 한달만에 SNS 팔로워가 700여명이 되었다. 호스팅 서비스들을 무료 플랜으로 이용 중이었으므로 트래픽 모니터링이 불가능해서 실제로 웹사이트에 방문해 서비스를 이용한 사람이 몇 명인지 집계하지는 못했지만, 그 많은 사람들이 우리 프로젝트에 관심을 가져준다는 사실이 감사하기도 했고 무언가 뿌듯하기도 했다.
개발 얘기를 다시 살짝 해보자면, api 호출 수는 데이터 업데이트 날 세자리수였고, 데이터가 업데이트되지 않는 날은 두자리수를 찍었다. 나름대로 적용한 클라이언트 측 캐싱이 효과가 있었던 것이다!
🐛 오픈 이후
아니나다를까, 오픈 후에 어디를 클릭했는데 동작을 안 한다던가 하는 자잘한 버그들이 내부적으로 발견되거나 문의 메일로 제보됐다. 그런 경우에는 미리 언제부터 언제까지 보수 작업을 하겠다는 공지를 띄우고 수정 작업을 했다. 작업이 끝난 후에는 내부적으로 팀원들과 테스트를 거친 후, 다른 이상이 없다면 다시 배포했다. SNS에는 무엇을 수정했는지 상세히 작성해 공지를 띄웠다.
한번은 사용자들의 데이터가 전부 날아가는 일도 벌어졌다. 불행인지 다행인지 슬슬 이용자 수가 감소하고 있었고 날아간 데이터 관련 기능이 잘 사용되지 않는다고 추측되던 때였다. 또 복구 방법이 있는 게 아니었기 때문에, 어쩔 수 없이 불편을 드려 죄송하다는 공지를 띄웠다.
이런 이슈가 터질 때 단순히 고치는 선에서 끝나는 게 아니라 앞으로는 어떻게 대처할 지, 예방 방법은 없는지 회고해보았으면 더 좋았을 것 같지만 추후의 숙제로 남겨두기로...😅
🧊 동결
우리는 서비스를 오픈하고 약 6개월동안 꾸준히 활동을 이어나갔다. 그동안 서비스 유지와 확장을 위해 팀원도 더 모집했으나, 여러 사정으로 잘 되지 않았다. 사실상 팀원들의 수고로 돌아가는 프로젝트였기 때문에 팀원이 없으면 당연하게도 신규 업데이트가 이루어질 수 없었다.
그렇게 오픈한 지 몇 개월이 지난 어느 날. 내가 취업을 하고 팀원들도 다들 바빠졌을 쯤 우리 프로젝트는 인력 부족 문제로 동결이 났다.
팀원 7명, 그 중 개발자 나 한명. 쌩 밑바닥부터 오픈까지 총 5개월이 걸렸다. 멋들어진 설계를 적용한 것도 아니고, 기능이 화려하거나 규모 있는 서비스도 아니다. 왕초보 개발자답게 정말 많은 비효율적인 결정들을 했고 개선할 점은 산더미처럼 많다.
그럼에도 그 서비스를 완성했고 출시했다. 누군가가 내 서비스를 사용했고 사용자들에게 좋은 서비스를 만들어줘서 고맙다는 말을 들었다. 그건 어디서도 얻을 수 없는 값진 경험이라고 생각한다.
그러니 마지막 파트는 2년 전, 왕초보 개발자였던 내가 그럼에도 칭찬받아 마땅한 점과, 그 때는 못했으니 이번에는 개선해보면 좋을 개선점을 적어보고자 한다.
👍🏻 잘한 점!
어떻게든 해냈다.
어떻게든 해내서 오픈까지 해봤다는 건 지금 생각해도 뿌듯하다. 시작은 학생 때의 근거 없는 자신감이었고 포기하지 않은 이유는 ‘하겠다고 해놓고 못 해내면 쪽팔린다’ 라는 자존심이었다. 가장 큰 동력은 내가 의미를 둔 프로젝트를 오로지 완성하고 싶었던 애정이 아니었을까. 이번 리부트 프로젝트 때도 이 열정과 애정을 계속해서 가져가고 싶다.
‘최선’의 선택을 했다.
지금 보면 끔찍한 선택이지만, 그때는 최선의 선택이었다. 그 최선의 선택을 하기 위해 다방면으로 조사하고 단순히 ‘어디서 많이 쓰더라’ 나 ‘그게 좋다더라’ 같이 남들의 선택에 맡기지 않고 우리 프로젝트를 완성하기 위해서 무엇이 더 좋을지 끊임없이 생각했다. 그렇게 나름대로의, 내 생각과 결정이 담긴 선택을 했다.
좋은 팀원들을 만났다.
당연하게도 잘한 점이다. 내가 프로젝트를 수락하지 않았다면 열정 넘치는, 본받을 수 있는 팀원들을 만나지 못했을 것이다. 무엇보다 개발자인 내가 프로젝트를 하며 다른 분야의 좋은 사람들을 만날 수 있었다. 프로젝트가 동결난 후로도 이런 좋은 인연들을 많이 만나고 싶어서 다른 여러 프로젝트에도 참여했었다. (다만 이후로는…😂)
기록을 해놨다
혹시나 하고 노션과 구글 드라이브를 열었을 때 2년 전에 내가 남겨둔 프로젝트의 기록들이 쌓여 있었다. 그 기록 덕분에 회고글을 작성할 수 있었다. 그리고 물론, 새로운 팀원들에게 인수인계할 때도 잘 활용됐다.
그때는 혼자 했지만 지금은 팀원들과 함께 한다. 내 고민에 동감해주고 같이 고민해주는 팀원들이 생기니까 몇배는 더 든든하다. 그러니 내가 경험한 것들이 내 머릿속에서만 머무르지 않고 팀원들에게 공유할 수 있도록 그때보다 더 꼼꼼하게 기록할 예정이다.
🔨 개선점!
mvp 정하기
내 능력에 비해 처음부터 너무 많은 것을 하려고 했다. 서비스를 오픈하기 위한 최소한의 기능을 골라 MVP를 정하고 시작했다면 우선순위를 정하기도 쉬웠을 것이고, 내 어깨의 짐도 그만큼 덜어졌을 것이다.
코드 분리하기
파일 분리라는 개념 자체가 없었던 때라 컴포넌트만 분리하고 모든 코드를 App.js에 몽땅 넣었다. 지금 보면 이해가 안 되는 행동이지만... 그때는 그것이 내 최선이었다. 이제는 왜 코드를 분리해야하는 지 이유를 알고, 그게 가능해졌으니까 리부트 때 전부 뒤엎으면 된다. 😁 (그리고 현재, 5개월이나 걸렸던 프로젝트를 1주일만에 전부 뒤엎었다.)
데이터팀이 사용할 프로그램 만들기
엑셀은 데이터팀이 사용하기 어렵기도 하고, 문자열 구분자를 사용해 데이터를 입력하고 있어서 오타가 날 가능성이 높다. 기존 데이터를 싹 다 날리고 새로운 csv 파일을 다시 insert 하는 건… 끔찍하다 못해 최악이다. 그래서 리부트 때는 이 모든 것을 개선하고자 데이터팀이 사용할 수 있는 데이터 입력 프로그램을 만들 예정이다.
트래픽 모니터링하기
돌이켜 생각해보면, 트래픽이 얼마나 발생하지 모르는 상황이었다면 그걸 알 수 있도록 환경을 구축했으면 될 일이었다. (물론 그때는 그게 최선이었다!) 이번 리부트 때는 앞으로의 서비스 확장을 위해서라도 트래픽을 모니터링할 수 있는 기능을 추가할 예정이다.
물론 이 모든 개선점보다 더 높은 우선순위는 2년 전과 다름없다. 얼마나 어렵든 얼마나 걸리든 '완성하고 출시하기’!
프로젝트 리부트 기념으로 팀원들에게 내 경험을 공유하고자 적어본 길고 긴 회고글이 드디어 끝이 났다. 적으면서 그때 생각이 나 즐거웠고, 무엇보다 리부트때 적용할 수 있는 개선점들을 발견할 수 있었다.
프로젝트의 시작 때부터 함께한 PM에게 이 글을 보여주었는데, 개발자가 아니더라도 프로젝트를 같이 한 입장에서 너무 재밌게 읽었다고 말해주었다. 나도 궁금해져서 그분께 PM 겸 기획자 시점으로 짧은 회고를 부탁드렸다.
이 글을 시작으로 프로젝트한 기록들을 쭉 남길 예정이다. 누군가에게 어떤 식으로든 좋은 영향을 줄 수 있다면 정말 좋고, 그렇지 않더라도 이런 우당탕탕 개발기도 있다는 하나의 소소한 이야기로 남았으면 한다.
이번 프로젝트 리부트의 성공을 바라며 글을 마친다.