외주 레거시로부터의 여정 1편 - 기존 레가시 파악

시작

2020년 1월 중순, 서울시 광화문의 어느 술집에서 남자 셋이서 술을 마시고 있었다. 셋은 기분이 좋은지 상 위의 안주는 거들떠보지도 않은 체, 술만 마시고 있었다. 두 사람은 좀 더 나이들어 보이는 어떤 남자에게 연거푸 고맙다는 인사와 함께 계속 잔을 부딪혔다. 이렇게 좀 더 나이많은 남자는 셀러노트 CTO가 되었다. 그리고 그 남자는 3월 중순에 본격적으로 판도라의 상자를 여는데…

심심해서 도입부를 소설 형태로 적어보았다. 아내가 봤으면 무슨 똥글이냐고 욕했겠지만 마침 몇 시간동안 자리를 비운지라 거침없이 글을 쓴다 : >

암튼 그 판도라의 상자를 여는 남자는 바로 나, 자신이다. 첫 임무는 외주사가 개발하고 있는 셀러노트의 물류 플랫폼 서비스 쉽다를 자체개발로 돌리는 일이었다. 외주는 다행히 PHP로 개발하지 않고 node.js 로 개발을 했다. 아마 PHP로 했었으면 CTO 자리를 정중히 거절했을거다. PHP자체가 나쁜건 아니다. 아니 아직까지 PHP 5.x로 개발했다면 그건 나쁘다고 단언할 수 있다. 허나 PHP도 7부터는 속도도 어느정도 빨라지고 상당히 괜찮은 물건이 된건 알고 있으나, $투성이인 코드가 싫다는 말도 안되는 핑계로 PHP를 거부하고 있고 앞으로도 사용하지 않을 예정이다.

4월 13일부로 입사한지 1달이 지났다. 지난 1달 간은 레거시를 바탕으로 좀 더 나은 시스템으로 만드는 과정의 연속이었다. 이를 회고 겸 경험 공유 차원에서 시리즈로 연재할 예정이다.

진짜 시작

입사는 3월이지만 소스 코드와 AWS는 입사 전인 2월 중순부터 살펴볼 수 있었다. 외주 개발물에 대해 파악한 내용을 개인적인 감상/비평은 최대한 자제하고 그냥 사실만 적도록 하겠다.

기 개발 기간

외주 개발자들이 2019년 7월부터 2~3명의 인원이 붙어서 작업했다. 단순 M/M만 따져봐도 2월 당시엔 최소 14M/M가 된다.

백엔드

서버 코드는 천만 다행으로 ES6+를 사용하고 있었고 node.js/Express 상에서 동작했다. 코드를 보니 미들웨어가 상당히 많았는데 이는 다년간 node.js 프로젝트를 진행했고 외주 회사에서 어느정도 프레임워크로 갖춰놓았다는 얘기가 된다. ESLint를 적용하진 않았고 유닛테스트가 없다. ㅠㅠ

인증

인증은 JWT였다. OIDC나 OAuth0 썼을까 살짝 기대했는데 그건 아니고 생짜 인증키로 토큰을 만들고 내려주는 형태였다.

Database

데이터베이스는 MySQL 8.0이었다. ORM을 쓰지 않고 생짜 MySQL Driver를 사용했다. 근데 테이블이 70개가 넘었다.

프론트엔드

React.js 다. ES6+를 사용했고 Redux로 전역 상태관리를 했다. 일부 컴포넌트는 Styled Component를 사용했으나 전체 스타일은 7000줄에 달하는 거대한 CSS가 담당하고 있었다. 스토리북으로 뭔가 테스트를 도입하려고 한것 같은데 테스트가 3개밖에 없다. 하다가 중단한듯 하다. 어드민 페이지는 별도의 프로젝트로 있었는데 Material UI로 만들어져 있었다.

인프라

AWS를 사용했다. dev/prod 로 각각 EC2를 띄워서 사용했는데 이상하게 EC2가 4대나 되었다. 잘 살펴보니 Frontend Serve용 dev/prod 2대, Backend용 dev/prod 2대 이렇게 4대였다. DB는 하나의 EC2에 넣지 않고 AWS RDS를 사용하고 있었다. 오토스케일링 설정은 하지 않았고 Elastic IP를 받아서 Route53에서 A레코드에 해당 IP를 매핑하는 식으로 웹 서비스를 구성했다. 주로 사용하는 서비스는 사실 이게 다였다. 프론트엔드 웹서버는 serve 를 사용하고 있었고 API 서버는 nginx를 사용하고 있었다.

배포

프론트엔드/백엔드 모두 배포는 CI/CD는 없었고 로컬 컴퓨터에서 스크립트로 배포했다. 단계는 아래와 같다

  1. npm run build로 빌드
  2. docker build 도커 이미지를 만들고 태깅한다.
  3. ECR에 올린다
  4. EC2에 SSH로 접속해서 Docker Pull을 땡긴다
  5. scp를 사용해서 docker-compose파일을 EC2로 복사한다.
  6. docker-compose 실행
  7. 기존 이미지를 지운다

물론 대부분 다시 손을 봐야된다. 허나 이 정도만 되도 굉장히 감사한 편이다.
지인의 요청으로 기존에 만들어놓은 외주 프로젝트를 본 일이 여러 번 있었는데 PHP 5.x로 코드이그나이터도 안쓰고 짠 소스 + 무식하게 큰 EC2 한 대에 웹서버 + 디비까지 같이 넣어놔서 오토스케일링도 못하게 만든게 제일 최악이었다. 거기에 비하면 이 정도는 사실 감사하다고 인사하고 써야할 것 같다.

자, 이를 어떻게 바꿀지는 3편부터…

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×