처음으로 6인 이상의 규모의 프로젝트 팀장을 맡아 정신없었다.
PM이라는 직무가 쉽지 않다는 것을 처음 느낀 것이, 많은 인원들의 스케줄을 하나하나 분배하고, 스케줄에 맞춰 프로젝트 진도를 계산하는 것이 너무나도 어려웠다.
Jira
라는 협업 도구를 차용하면서 매주 스케줄 할당 및 이슈 정리를 한다는 것이 보통 일이 아니었다. 시간을 정말 많이 할애한듯.
개발 측면에서는 백엔드와 인프라 부분을 맡았다. 백엔드가 4명이었던 이번 프로젝트에서 나는 인프라 특화 인원으로 선발된 것이라 인프라를 중점으로 개발에 매진했다. 그러던중 기획 단계에서 AI 모델 활용이 확정되며 해당 개발 업무로 2명이 차출되면서 백엔드 파트에도 발등에 🔥이 붙어버렸다. 어쩌겠는가. 해야지.
다행히 User 기능은 불필요하다는 판단 하에 적용하지 않았던 프로젝트였기 때문에 대다수의 api가 로직이 단순한 get 메서드에 그쳤다. 약 절반 정도의 REST api를 개발하였는데 이 때 JPA
를 너무 쉽게 본 것이 후에 화가 되었다. 이론 없이 코드만을 참고하며 하는 개발이 얼마나 위험한지... 이후의 프로젝트에서야 깨닫게 된다.
인프라 부분은 정말 엄청 많은 시도를 했다.
단순 서버 구축을 넘어 CI/CD 흐름을 구현하기 위해 Sonarqube
, Prometheus
, Grafana
등 다양한 분석 도구와 모니터링 도구, 시각화 도구를 사용해보았다. 1년 전, 쎄트렉아이와의 기업 연계 프로젝트 당시에 젠킨스 하나에도 쩔쩔매던 나를 비교하니 그만큼 많이 성장했구나 느껴졌던 시간이었다.
새로운 기술 적용이 어렵지 않게 가능해지니, 더 많은 탐구욕을 불러왔다. 실제 기업의 CI/CD 흐름에 관심이 생기고, 쿠버네티스와 같은 컨테이너 관리 기술에도 눈이 가기 시작했다. 그런 욕심의 일환으로 Jmeter로 직접 트래픽 테스트를 해보고 트래픽이 몰리면 유독 느려지는 api를 개선하는 작업은 정말 멋진 경험이었다.
한편으로는 팀원들에게 미안한 감도 있다. 나눠서 하자고 했었는데 내가 다 해버렸다. 금방금방되니 욕심을 못이기고... 미안할 따름이다. (...)
배포도 성공하고, 원했던 퀄리티도 나왔으며 계획했던 알고리즘 대로 모든 것이 정상 작동되는데다가 사용자가 실시간으로 사용하는 기록까지 모두 볼 수 있었다. 퀄리티와 구현 정도, 실제 성과 등을 모두 따지면 내가 해왔던 프로젝트 중 단연 이 것이 으뜸이라고 평가하고 싶다.
다만 입상은 못했다.
나중에 알게된 사실인데 삼성에서 주관하는 프로젝트 경진대회다보니 Swift
로 제작한 우리 프로젝트는 사실상 실격되었던 모양이다. 허허. 예상했지만 씁쓸하다.
어찌됐든 성공적인 결과물을 보았던 나는 기존의 팀원의 대다수를 데리고 프론트엔드 1인을 추가, 백엔드 1인을 교체한 채로 다음 프로젝트를 이어가게 된다.
기업 연계!
스타트업 기업인 넥스트그라운드와의 연계 프로젝트에 선발되었다.
이전의 프로젝트와 기업에서 요구한 명세서의 결이 어느정도 일치한다는 점,
이전 프로젝트 결과물이 좋았던 점,
모인 멤버들의 스펙이 좋았던 점 등이 맞물려 선발될 수 있었던 것 같다.
이전에는 단순히 AI 모델 하나를 차용하여 상권 점수를 매기려 했다면,
이번엔 넥스트그라운드에서 운영하는 실제 집품
이라는 애플리케이션의 실유저 점수를 바탕으로 AI를 개선하고, 추가로 들어오는 리뷰 점수들도 반영하여 진짜 AI를 개발하는 더 진보된 프로젝트였다.
이전 프로젝트와 다르게 유저 로직이 포함되어있었으며 보안의 중요성은 더욱 커졌다.
이미 해본거에서 조금 더 어려워진다고 뭐 달라지겠어?
솔직히, 나도 팀원도 조금 안일했다.
이전의 프로젝트 퀄리티로도 입상하지 못했다는 사실이 팀의 사기를 매우 떨어뜨렸던 상태에서 같은 결의 프로젝트를 다시 진행한다는 것이 득이 될리가 없었다.
다시 한번 맡은 PM직에서 이 사실을 전혀 알지 못했던 나는 치명적인 실책을 저지른다.
자유방임
팀원들에게 Flutter
와 FastApi
는 물론, 더 광범위한 공공데이터 전처리 업무까지 쥐어놓고 안일하게 진행 상황을 체크하고 있지 않았다.
아니, 정확히 말하자면 체크는 했지만 추후 계획까지 밀리지 않고 모두 완료되리라 믿고 밀리는 부분들도 인정해주었었다.
결정적으로, 나도 밀렸다.
또 다시 인프라를 맡았던 내가 Nginx 미러 서버 설정을 잊어버리는 실수를 저질러 에러 상황 파악에만 많은 시간을 잡아먹었다. 기존의 프록시 설정 역시 먹히지 않아 이 역시 애를 먹였다.
백엔드에서는 나는 만져보지 못했던 OAuth2 작업은 물론, JWT 적용, 이미지를 S3 버킷에 저장하는 것까지 새로 맡게 되었는데 이것이 발목을 잡았다.
JPA 이론이 부족한 점은 코드 이해에서의 악영향을 주었고, 원했던 API들의 완전 제작까지 약 3주나 걸리는 참사가 일어나고 만다.
N+1 문제가 있다는 것도 다 끝나고 알았다. 아니 N+1 문제가 뭐인지도 끝나고 알았다... 참혹한 심정이다.
아마 모든 팀원이 느꼈을 것이다. 이전보다 진도가 너무 느려진다고.
그래서 많은 부분을 포기하고, 운영 부분은 아예 놓았다고 봐도 될 정도로 기술을 사용하지 않았다. 배포도 이전과 다르게 스토어 배포로 진행하지 못했다.
안일한 마음... 불안한 이론...
마지막 프로젝트에서 뼈아픈 실책을 이런 것들로 저지른 것에 대해 책임을 통감했다.
한동안 죄책감에 빠져있었지만, 또 다른 프로젝트를 제의 받고, 최근 제주도로 멘탈을 다잡는 여행을 다녀온 후에 정신을 바짝 차리기로 하였다.
JPA 이론 공부를 다시 속행하고, 정보처리기사 자격증에 도전하며, 현재 신입 채용을 진행중인 기업들에 대해 이력서를 넣어보기로 하였다.
새로 맡은 프로젝트에서도 대다수의 팀원들을 그대로 가져가며 새로 디자이너를 영입했고, 이번엔 PM직을 다른 사람에게 넘겼다. 개발에만 집중해볼 생각이다.
아직 나아갈 길이 많은 나에게 앉아있을 시간은 없다.
계속 열심히 매진해보겠다.