신입 개발자가 레거시 서버를 걷어내는 방법

비트바이트

신입 개발자가 레거시 서버를 걷어내는 방법

안녕하세요 플레이키보드 풀 스택 개발자 박종훈입니다 :)

간혹가다가 레거시 코드가 서비스에 큰 장애를 불러일으키거나, 유지 보수하기 힘든 상황을 만듭니다. 때로는 레거시 코드를 재사용하는 것보다 새로운 코드를 작성하는 것이 더 효율적인 경우가 있는데요, 이런 레거시 코드를 걷어내고 서버를 리뉴얼하는 과정을 소개하려고 합니다.

플레이키보드는 ‘키보드 꾸미기 앱’에서 ‘키보드 콘텐츠 플랫폼’으로 확장하기 위해 앱 리뉴얼을 진행했으며, 서버도 서비스의 변화와 성장에 맞춰 유연하고 안전하게 대응하기 위해 레거시 코드를 유지보수하지 않고 새롭게 서버를 리뉴얼하기로 결정했습니다.

플레이키보드의 서버 개발자로 입사한 지 한 달이 지난 후 서버 리뉴얼 작업을 시작했습니다. 약 4개월간 서버 리뉴얼 작업을 진행하면서 서버 리뉴얼 & 데이터 마이그레이션 작업을 모두 완료했습니다. 주니어 개발자가 서버를 맨 처음부터 리뉴얼하는 과정은 길고도 험난했고, 이 과정을 하나하나 소개하려고 합니다.

맨땅에서 다시 시작하기

새출발 새마음으로

기반부터 다시 개발하는 상황인 만큼, 기반을 탄탄하게 다지고 확장성을 고려하여 기존 서버 기술 스택을 완전히 갈아엎기로 결정했습니다. API 서버 기술 스택은 Typescript와 Express를 사용했고, 데이터베이스는 MySQL에서 MongoDB로 변경했습니다.

기술 스택 뿐만이 아닌 클라우드 플랫폼도 마이그레이션을 진행하기로 결정했습니다. AWS는 많은 레퍼런스와 다양한 기능을 제공하고 있어서 기존에 사용하던 Azure에서 AWS로 서버를 마이그레이션 했습니다.

수많은 고난과 역경들을 헤치고..

이걸 어떻게 해결하지?

서버 리뉴얼 작업을 진행하면서 많은 어려움이 있었습니다.

  • 120만 명 가까이 되는 유저 데이터를 안전하게 옮길 방법을 우선으로 고민했습니다. MySQL은 관계형 데이터베이스(SQL)이고, MongoDB는 비 관계형 데이터베이스(NoSQL) 입니다. 그래서 PK로 서로 연결되어있던 관계를 고스란히 마이그레이션 하는데 여러 시행착오를 겪었습니다. 120만 명 정도의 유저 데이터를 안전하게 옮기기 위해 두 데이터베이스를 비교하는 테스트 코드도 작성하고, 마이그레이션중 에러가 없었는지 계속 모니터링하면서 데이터베이스 마이그레이션을 진행했습니다.
  • 기존 Azure에는 하나의 인스턴스에 모든 서버가 담겨있었고, 플레이키보드에서 사용하는 테마의 이미지나 각종 이미지, 다운로드 파일들을 AWS로 옮기는 과정에서 누락된 리소스나, 잘못 분류된 파일들도 많이 발견되었습니다. 기존에는 리소스를 수동으로 업로드 하는 형식으로 진행해서 휴먼 에러가 있을 수 있고, 일관성이 깨지는 등 리소스를 직접 올려 생긴 문제가 많았습니다. 리뉴얼 되는 서버에서는 리소스 분류나 업로드를 모두 API 서버를 통해 관리하도록 개발하여 그런 문제를 해결했습니다.
  • 새로운 기능을 개발하면서 애매했던 부분이나, 클라이언트와 어떤 식으로 연동하면 좋을지 계속해서 고민을 해왔고, 안드로이드 개발 직무에 계신 분들이 기존에 어떤 식으로 서버를 사용했으며, 클라이언트에서 API를 사용하기 편한 구조가 무엇인지 안드로이드 개발자분들께 조언을 많이 구했습니다.
  • 제가 개발한 서버가 곧 프로덕트 서버가 되고, 데이터베이스 마이그레이션을 통한 120만 명 가량의 데이터를 책임지게 되었습니다. 서비스의 중추를 담당하고 있는 서버인 만큼 1인 개발로서의 부담감은 막중했으나, 제가 처음으로 실 서비스의 서버를 배포해보는 경험이기도 하며, 사용자들이 최대한 불편함이 없도록 개발을 하면서 자연스레 강한 책임감을 갖게 됐습니다.

이 외에도 코드 퀄리티를 위해 항상 신경 쓰면서 개발을 진행했고, 유지보수를 편하고 빠르게 하기 위해서 코드를 체계적으로 짜기 위해서 디자인패턴을 적용하는 등 코드 퀄리티에 대해서도 큰 노력을 기울였습니다.

안녕 레거시 코드

새로운 프로덕트 서버

서버 리뉴얼을 위해 서버 구조 설계, 스키마 설계부터 배포까지 모든 부분에서 혼신을 다했고, 모르는 부분이나 애매한 부분들을 팀원분들의 도움으로 함께 해결해나갔으며, 팀원분들과 저의 노력으로 서버 리뉴얼 작업을 성공적으로 완료할 수 있었다고 생각합니다.

레거시 서버보다 깔끔한 코드 구성과 주석 및 문서화, 일관된 디자인 패턴을 적용했고, 기존 서버와 기술 스택도 다르며, 인스턴스도 완전히 새롭게 구축해서, 약 5배 이상의 성능 향상을 이뤘습니다!!

기존 레거시 서버보다 훨씬 빠른 속도와 더 효율적인 서버 리스폰스를 제공하며, 훨씬 더 안정적으로 서버가 작동할 수 있도록 모든 준비를 마쳤습니다!

고민이 많았던 서버 리뉴얼 작업

내가 성장하고 있다고 느껴진 순간

처음에는 레거시 코드를 유지보수를 하며 서버를 관리하려 했으나. 처음 본 서버의 모습은 개발자로서 지켜만 볼 수 없는 상황이었고 서버를 새로 개발하는 것이 훨씬 더 효율적이라고 생각했습니다. 마침 앱 리뉴얼이 진행되고 있다고 하셔서 저는 과감하게 서버 리뉴얼을 진행하면 좋을 것 같다고 제안했고, 저를 믿고 서버 리뉴얼을 맡겨주셨습니다.

개발자로서의 첫 업무였고, 끊임없이 본인 코드에 만족하지 않고 계속해서 발전 시켜 나가는 제 모습을 보고 주니어 개발자임에도 불구하고 저를 믿고 서버 리뉴얼이라는 중대한 업무를 맡겨주셨으며, 저를 믿고 함께 개발해왔던 팀원분들께 너무나도 고마웠습니다 :)

개발자 팀원분들과 같이 협업하면서, 어떤 식으로 서버와 클라이언트가 함께 맞춰가는지 논의해보고, 클라이언트에서 사용하기 편하도록, 일관적인 패턴을 통해서 개발자 팀원분들께 큰 신뢰를 얻었다고 생각합니다.

저도 서비스를 리뉴얼하고, 제가 만든 결과물이 사용자들에게 제공된다는 가지게 되었고, 또한 팀원분들의 신뢰를 바탕으로 플키팀에서 빠르게 성장할 수 있었고, 플키팀과 제가 함께 성장할 수 있는 계기가 됐으며, 함께 일한다는 협업의 경험이 저를 개발자로서 한층 더 성장시켰다고 생각합니다. :)

기업문화 엿볼 때, 더팀스

로그인

/