2024년 7월에 첫 직장에 입사하고 개발자로서 커리어를 시작했다.
첫 직장이지만, 개발은 2년 전부터 시작했었고, 1년 정도는 우테코를 다니며 쌓아왔던 지식과 협업, 스터디 경험 덕분에 빠르게 업무에 적응할 수 있었다.
기술 스택도 Java, Spring, MySQL(MariaDB, Aurora), AWS, JPA 등 기존에 익숙한 기술을 사용했다.
입사하고 받은 첫 임무는 회사의 핵심인 레거시 프로젝트에 새로운 기능을 추가하는 일이었고, 단순한 조회 기능만 추가하면 되는 일이어서 어렵지 않게 임무를 완수할 수 있었다.
정말 단순했던 일이었지만, 그때 나에게는 처음으로 부여받은 일이어서 그런지 이렇게 간단하게 끝내도 되는지 싶었다.
개발은 나름 했지만, 일로 수행해 본 적은 없었기에 힘 조절을 할 줄 몰랐다고 해야 할까, 그래서인지 오버 엔지니어링을 했었다.
그리고 팀장님이 내가 작성한 코드를 보시더니, 과하게 추상화를 수행한 것 같다고 말을 남겨 주셨다.
팀장님은 정말로 좋은 분이셨는데, 내가 퇴사하기까지 1년가량의 시간 동안 화를 내시거나, 짜증을 내시거나, 언성을 높이시는 모습을 한 번도 본 적이 없었다.
그 당시 오랫동안 쌓아왔던 능력을 보여주고 싶었고, 신입으로 부족함을 보여주고 싶지는 않았기에 더 그랬었던 것 같다.
아직도 기억이 생생한 걸 보면 그 당시 약간의 충격을 받았던 것 같다.
그 이후로는 단순한 기능은 최대한 단순하게 작성하려는 습관이 생겼다.
이후 3개월 동안은 기존 프로젝트의 구조, 회사 도메인 이해, VOC 처리 등 적응의 기간을 거쳤다.
핵심 프로젝트는 거의 10년의 세월이 묻어있어서 이해하는 데 많이 힘들었다.
기능들을 만든 분들은 모두 퇴사를 했고, 문서가 있었지만, 실제 코드와 내용이 다른 부분도 있었고, 컨트롤러 메서드가 1000줄가량에 3~4번의 depth가 포함되어 있는 경우도 있었다...
그나마 최근 진행 중인 프로젝트는 코드 베이스의 양이 적고, 재직 중인 팀원들이 만들고 있던 기능이라 직접 물어볼 수 있었기에 다행이었다.
문서화의 중요성과 어떻게 프로젝트의 문서화를 관리해야 할지 많은 생각이 들었다.
수습 기간도 끝나고, 어느 정도 적응할 무렵, 회사에선 새로운 서비스를 출시하기 위해 여러 기능들을 기획했다.
그중 가장 힘들었던 기능은 이벤트 기능이었는데, 흔히 보는 캘린더의 일정이라고 생각하면 될 것 같다.
왜 힘들었냐면, 반복 이벤트 기능 때문이었는데, 그냥 이벤트는 시작 날짜와 종료 날짜가 하나로 이뤄진 일정이지만, 반복 이벤트는 그 수가 무한히 생성될 수 있어서였다.
물론 상한은 3년, 5년 정도로 잡을 수 있었으나, 하루마다 반복되는 경우, 5년이면 1,825개의 데이터베이스 행이 만들어질 수 있었다.
만약 사용자 10,000명이 반복 일정을 1개만 만들면, 18,250,000개의 행이 만들어지는 상황이 발생했다.
당시 서비스는 글로벌 런칭을 기획하고 있었고, B2C 서비스라 트래픽이 많이 몰리는 것을 생각해야 했기에, 이 작은 기능이 서비스의 핵심 리소스를 잡아먹을 것이 불 보듯 뻔했다.
그 당시 고민만 2일 넘게 했던 것 같다.
너무 힘들어서, 차라리 반복 일정 기능을 빼버릴까 생각도 했었다.
하지만 구현이 어렵다고 기능 개발을 포기하는 건, 이 일을 업으로 삼고 있는 사람으로서 프로가 아닌 아마추어나 다름없는 게 아닌가란 생각이 들었다.
따라서 구현을 포기하는 것은 절대로 하기 싫었다.
그렇다고 무식하게 모든 일정을 만들기도 싫었다.
완전히 딜레마에 빠져버렸다.
다행히도 나에겐 좋은 팀원들이 있었고, 팀원들과 어떻게 이 문제를 해결할지 고심한 결과, 반복 일정의 일부에만 변경이 생기면 해당 일정만 새로운 일정으로 만드는 방법을 통해 아무리 긴 반복 일정이어도 최악의 경우에만 모든 일정이 만들어지는 구조로 만들 수 있었다.
그때를 생각하면 아직도 아찔하다.
하지만 그 경험 덕분에 어려운 조건의 요구사항이 들어와도, "그때보단 쉽네" 하고 넘길 수 있게 되었다.
퇴사 후 들었지만, 지금 그 서비스는 사용자가 거의 없을 정도로 망했다. 😂
6개월 정도가 지나고 나름 익숙해질 무렵, 여유가 생긴 것인지 레거시 프로젝트를 개선하고 싶다는 생각이 문득 들었다.
입사 당시 팀장님께서 기존 프로젝트의 개선 가능성 목록을 보여주셨는데, 그중 하나가 성능 문제였다.
레거시 프로젝트는 거의 10년간 데이터가 쌓여있었고, 초창기에는 성능에 문제가 발생하지는 않았지만 지금은 그 방대한 데이터가 성능에 영향을 주고 있었다.
당시에는 시간이 부족하여, 코드 개선을 통한 최적화보다는 하드웨어의 성능을 높이는 방향으로 문제를 해결했다.
그 당시로는 옳은 판단이었지만, 지금 상황에서는 그에 따른 비용 문제가 더 커지고 있었으며, 일부는 성능을 올려도 개선할 수 없을 정도로 더 이상 유효한 판단이 아니게 되었다.
성능 병목의 대부분은 당연하게도 데이터베이스였고, DB 인스턴스 하나만으로 한 달에 약 500만 원이 넘는 비용을 지불하고 있었다.
그 정도 되는 사양임에도, 평균 부하는 2~30%, 일부 조회에서는 4~50초 정도가 걸리거나, 아예 120초를 초과하여 타임아웃이 발생하는 곳도 있었다.
성능에 문제가 생기는 API의 조회 로직을 분석해 보니, 사용되는 쿼리에 인덱스가 효율적으로 걸려있지 않아 발생한 문제였다.
일부 고객은 회사가 서비스를 운영했을 때부터 사용했거나, 사용량이 많아, 인덱스를 효율적으로 사용하지 못하고 있었다.
개선한 쿼리는 서버를 새롭게 배포하면 됐지만, 인덱스는 테이블에 데이터가 약 1억 건 이상 쌓여있었기에 함부로 추가할 수 없었다.
회사에 DBA도 없어서, 경험이 없던 내가 이 문제를 서비스 중단 없이 어떻게 해결해야 할지 고민하고 있을 때, 마침 타이밍 좋게 사용 중인 RDS 버전의 유지보수 기한이 다 되어, 잠깐 서비스를 중단해야 할 기회가 생겼다.
5.7을 사용 중이었다.
따라서 이 틈을 이용하여 인덱스를 추가하기로 결정했다.
하지만 중단된 서비스는 빠르게 복구되어야 했는데, 1억 건의 데이터가 있는 테이블에 인덱스를 생성하는 데는 매우 긴 시간이 걸릴 것이 분명했다.
따라서 미리 인덱스가 만들어진 임시 테이블을 만들고, 기존 데이터를 최대한 복사하고, 서비스가 중단된 시점에 옮기지 못한 데이터를 빠르게 옮기는 작전을 세웠다. (다행히도 옮길 테이블의 updated_at 컬럼에 인덱스가 잡혀 있었다.)
마이그레이션을 수행하고, 이후 성능 개선 도우미의 지표를 확인해보니, 평균 2~30% 사용량을 보이던 지표가 4~5%를 기록하게 개선할 수 있었다.


또한 일부 상위 사용자들 중에는 워낙 데이터가 많아, 복합 인덱스를 사용해도 일반 테이블의 풀 테이블 스캔을 사용하는 것과 다름없는 경우도 있었다.
select count(*) from xxxx where 소유자 = xxxx; # 640,279개
당시 해당 기능은 서비스의 핵심이었는데, 해당 소유자에 소속된 다른 사용자들은 평균 1.8초에 최대 2.4초가 소요되었다.

해당 기능의 전체 통계를 보니, 평균 또한 높고, 최대 28초가 소요되는 경우도 존재했다.

또한 약 10%의 사용자가 1초 이상 대기를 하고 있었다.
해당 문제의 원인을 분석하니, 상한이 없는 조건절로 인해 모든 행을 조회하고 있었고, 사용량이 높은 고객일수록 이 문제를 심각하게 겪고 있었다.
이후 문제를 개선하니 평균 98ms, 최대 7초가 소요되도록 할 수 있었다. (1초가 넘는 사용자는 0.048% 정도로 줄었다.)

그 외 평균 2초, 최대 120초(타임아웃)가 발생하는 쿼리도 개선했다.
AS-IS

TO-BE

회사에 입사하기 전, 진행했던 MySQL 스터디가 정말 큰 도움이 된 것 같다.
해당 스터디를 하지 않았다면, 성능에 병목이 발생하는 지점과 어떻게 성능 문제를 해결해야 할지 갈피도 못 잡았을 게 분명했다.
그 외 비효율적으로 작성된 코드들과 여러 성능 병목이 되는 곳도 많이 존재했다.
나름의 해결 방법들을 적어두거나, PR들을 올리고 나왔는데, 지금은 어떻게 됐을지 궁금하다.
회사는 1월과 7월에 연봉 협상을 했는데, 당시 난 7월에 입사하여, 2025년 7월에 연봉 협상 대상이었다.
나름 회사가 시키지 않은 일도 알아서 수행했고, 신입이 쉽게 할 수 없는 일을 많이 수행했다고 자부한다.
그렇기에 연봉 협상 때 유리한 조건을 제시할 수 있을 거라 생각했다.
당시 직원분들께 듣기론, 신입은 웬만해선 2자리 수는 올려준다는 말을 들었고, 만약 물가 인상률만큼 올려주는 경우는 회사에서 그 사람을 내보내려 한 경우를 제외하면 없다고 들었다.
그때는 이게 복선이 될 줄 몰랐지만...
몇몇 직원분들은 연봉 협상을 했다는 얘기가 들려왔고, 어느덧 내 차례가 오겠구나 하며 마음의 준비를 했다.
그 뒤, 며칠이 지나고 조용히 팀장님이 둘이서 카페로 가자고 부르셨다.
아직도 기억이 생생한데, 비가 오는 날이었다.
당시 팀장님 얼굴은 약간 슬픈 듯이 미안해 보였고, 좋은 결과가 나오지 않았음을 직감했다.
뭐, 결과는 연봉 협상이 아니라 연봉 통보였고, 상승폭은 물가 인상률 정도였다.
당시 경기가 좋지 않았음은 인정한다.
하지만 그 당시 들었던 말 때문일까, 다른 생각도 없이 퇴사를 결심했다.
참고로 회사의 인재상 중 하나는 "시키지 않아도 일을 하는 사람" 이었다.
사실 퇴사는 전부터 결심하고 있었다.
팀원들은 정말 좋았지만, 좋은 회사는 아니었기 때문이다.
3개월쯤 다녔을 때, 나보다 한 달 먼저 들어온 다른 부서의 직원분은 "어떠한 경위"로 인해 "퇴사"를 당했고, 그 과정에서 발생한 많은 사건들을 직접 보고 들었다.
또한 내가 있던 백엔드 팀만 좋았지, 다른 부서의 직원 중 한 명은 내가 살면서 보았던 최악의 인간 중 하나였고, 그 직원 때문에 퇴사한 인원도 많았다.
다니면서 가깝게 지냈던 직원, 동료들도 떠나서, 남았던 정까지 다 털렸던 것 같다.
아무튼, 여러 감정과 기억들이 한순간에 스쳐 지나가며, 그 자리에서 팀장님께 진지하게 퇴사에 관해 얘기했고, 팀장님은 챙겨주지 못해 미안하다는 말밖에는 없으셨다.
그 뒤로 그냥 멍하니 업무를 마치고, 퇴근하고 집에 돌아왔다.
그리고 그냥 무슨 생각이 들어서였을까, 간만에 우테코 슬랙에 접속했는데, 뜬금없이 예전 온보딩 조원이었던 크루가 창업한 회사에 모집 공고가 올라와 있었고, 순간 눈에 빛이 반짝였다.
서울에 제대로 정착해서, 새로운 취미를 만들어 보려고 시도했다.
아무래도 이제 경제력이 생기니, 기존에 좋아하던 위스키를 더 사게 되었다.
당시 돈이 없으니, 가성비 위스키만 마셨는데, 이제는 비싸고 맛있는 위스키까지 살 수 있게 되니, 선반 하나가 위스키로 가득 채워졌다.

지금은 이거보다 더 많아졌다.
또 집을 구할 때 가장 중요하게 생각한 요소는 주방이었는데, 당시 구했던 집은 사진상으로는 가스레인지였지만, 막상 들어와 보니 인덕션이었고, 집주인이 내가 들어오기 전 인덕션으로 교체를 했다고 했다...
본가에 있을 때, 부모님이 모두 맞벌이를 하셔서 혼자 요리를 해 먹을 수밖에 없었고, 나름 재미가 있어 요리를 하는 것이 삶의 낙 중 하나였다.
하지만 인덕션으로는 제대로 된 요리를 하기엔 부족했고, 당시 회사 직원분들께 들었던 "소모임" 어플이 생각나서, 요리 관련 모임을 찾게 되어 참여하게 되었다.
나는 당시 요리만 하려고 참여했고, 한두 번은 재밌게 참여를 했지만, 역시 모임의 특성상 다른 목적도 있었기에 이후에는 참여를 하지 않게 되었다.
또한 운동도 했는데, 이번에는 헬스보다는 러닝을 하고 싶었고, 근처에 살던 우테코 동기와 같이 뛰기도 했다.
하지만 당시 제대로 뛰는 방법을 몰라, 심박수나 페이스를 신경 쓰지 않고 무작정 뛰기만 했었고, 재미를 못 찾고 힘들어서 그만두었다. 😂
그 뒤, 근처에 있는 시설에서 수영을 할 수 있다는 것을 찾아, 선착순으로 겨우 신청해서 수영도 했다.
그런데, 배영을 연습하다 사람하고 부딪혀, 놀라서 몸을 확 꺾다가, 승모근 쪽에 부상을 당해 수영도 그만두게 되었다. 😂
나름 호기롭게 도전했는데, 뭐든 쉬운 게 없는 것 같다...
이것도 취미인 것 같은데, 혼자서 해외여행을 2번 갔고, 위스키를 같이 즐기던 우테코 크루들과도 해외여행을 다녀왔다.
첫 번째로 혼자 간 해외여행은 대만이었다.
간 목적은 그냥 비행기가 싸게 풀리기도 했고, 대만 위스키 공장을 가보고도 싶어서였다.


짧은 2박 3일 일정이었지만, 나름 알차게 잘 돌아다녔다.
당시 10월 초가을 무렵이었는데, 대만은 여전히 더워서 고생 좀 했었다.
그다음은 1월에 삿포로에 4박 5일로 다녀왔다.
1년 전쯤 우테코에서 위스키를 좋아하던 크루들과 모임을 갖다가, 해외여행 얘기가 나왔고 술김에 삿포로로 결정이 되었다. ㅋㅋㅋ
그래도 나름 한다면 하는 사람들이 모인지라, 파투가 나지 않고 본격적인 여행이 시작되었다.



ㅋㅋㅋ 나름 낭만을 챙긴다고 현수막까지 만들어 갔다.
그 뒤엔 4월쯤 오사카-교토 여행을 3박 4일 일정으로 혼자 갔다.
아쉽게 벚꽃은 다 졌지만, 날씨는 덥지 않고 맑아서 무척 좋았다.



거의 10만 보 정도 걸었는데, 마지막 날에는 발이 너무 아파서 겨우 집에 돌아올 수 있었다.
혼자서 여행을 간다는 것은 살면서 한 번도 생각해 본 적이 없는데, 입사 전 같이 여행을 갔던 친구의 경험을 보고 도전해 보았다.
결론부터 말하면 별거 없었다.
왜 진작 혼자서 갈 생각을 하지 않았지 싶을 정도로.
물론 치안이 괜찮은 나라를 가서 그럴 수 있지만, 누군가 해외여행을 고민하고 있다면, 주저하지 않고 시도해 보라고 할 것 같다.
당시 살던 집은 지하철역에서 걸어서 10분 정도 걸리고, 다가구주택이긴 했지만 원룸 건물이 아니라, 주택 건물 2층에 방이 있는 구조였다.
사는 데 큰 불편은 없었지만, 주택 건물이라 엘리베이터가 없었고, 주거 환경이 그렇게 좋지는 못했다.
그러다 12월쯤 청년안심주택 공고가 나온 걸 봤다.
조건도 되었고, 사는 지역이 같아 1순위였다.
신청할 수 있는 건, 일반 공급과 특별 공급이 있었고, 특별 공급은 더 저렴한 대신, 세대수가 매우 적었다.
당시, 되면 좋고 안 되면 그만이라는 생각에 특별 공급으로 신청했다.
그리고 대망의 발표일, 놀랍게도 당첨이 되었다. ㅋㅋㅋㅋ
덕분에 살면서 처음으로 신축 건물에 입주하게 되었다.
이제는 지하철역까지 걸어서 2분에, 좋은 주거 환경을 얻게 되었다.

그런데 걱정되는 게, 이 집을 떠나게 될 때 지금 집 정도의 컨디션이 되지 않으면 불행할 것 같다... ㅋㅋㅋ
2025년 3월쯤 우테코 동기에게 초록스터디 멘토를 해보겠냐는 제안이 왔다.
당시 초록스터디는 대학생을 대상으로 하던 스터디였는데, 이번에는 모든 사람을 대상으로 확대가 되었다.
우테코 때 받았던 멘토링으로 인해 지금까지 올 수 있었고, 그때 받았던 은혜를 갚을 수 있는 기회라 흔쾌히 수락했다.
우선 멘토링을 하면서 느낀 점은, 아직도 모르는 것이 많다는 것이었다.
멘티들이 제출한 PR을 보며 리뷰를 작성하는데, 분명 이 부분이 잘못된 것을 아는데, 왜 잘못되었는지는 모르는 느낌이라고 해야 할까.
덕분에 나도 다시 돌아보며 공부를 할 수 있었던 기회가 되었다.
또한 멘티들에게 잘못된 지식을 알려주면, 잘못된 지식을 습득해서 나중에 큰 폐를 끼칠 수 있다는 생각에 책임감도 많이 들기도 했었고..
어렵지 않을 줄 알았는데, 무척 어려웠다. 😂
하지만 시간이 지나면서 성장해 가는 멘티들을 보면, 힘들다는 감정은 잊을 정도로 뿌듯했다.
내가 받았던 좋은 영향력을 다른 사람들에게도 전달할 수 있음에 큰 자부심을 느꼈던 것 같다.
1년간 많은 일이 있었다.
회사에서 좋은 사람들을 만났고, 좋지 않은 사람도 만났다.
좋은 사람은 가까이 두었고, 좋지 않은 사람은 멀리했다.
따라서 모두 좋은 경험이 되었고, 좀 더 내면이 성장한 것 같다.
다녔던 회사는 객관적으로 좋지 않은 회사였지만, 회사에서 쌓은 1년의 경험은 지금 매우 큰 도움이 되고 있다.
24년 7월부터 25년 8월까지의 기록이지만, 작성하는 시점은 26년 4월의 끝을 바라보고 있다.
25년 8월부터 지금까지도 많은 일이 있었다.
지금까지 고생은 고생이 아닐 정도로 많은 일이...
까먹지 않도록 미루지 않고 회고를 작성해야 할 것 같다.
그래도 간만에 기억을 돌아보니 나쁜 기억들보다는 좋은 기억들이 많아서, 시간을 잘 보낸 것 같다.
그 당시 했던 결정들이 좋지 않아 보여도, 지금 보면 모두 좋은 결정들이 된 것 같다.
아직도 갈 길은 멀지만, 돌아보니 과거보다 조금씩 나아지고 있다는 사실이 보인다.
최근 들어 세상이 정말로 빠르게 변하고 있지만, 나는 나만의 페이스를 맞춰 뛰는 게 나쁘지만은 않은 것 같다.
조급해하지 않고, 내 속도를 맞춰서, 앞으로도 좋은 기억들만 남기도록 하자.
멋있다 글렌!!