모놀리식 아키텍처를 바탕으로 레포지토리를 관리하던 방식은 소스 코드를 모듈화하지 않고 하나의 리포지터리에 모두 넣었다.
모든 코드가 단일버전으로 관리 되기에 코드 재사용성이 높지만 관심분리가 어려워 디버깅 난이도가 험했다.
모놀리식 아키텍처를 찾아보며 쿠팡의 MSA 아키텍쳐 전환기를 읽게 되었는데
쿠팡의 기존 코드는 하나의 레포 안에 관심 분리가 되어있지 않아 컴포넌트 간의 의존성의 높았다. 결제에서 일어난 부분 서비스 장애가 전체 서비스 장애로 이어지게 되어 MSA 아키텍쳐로 전환하게 되었다는 내용이다.
이 내용을 통해 모놀리식 아키텍쳐의 특징과 단점을 서비스 단에서 이해할 수 있었다. 모놀리식 아키텍쳐는 소프트웨어 아키텍쳐 중 하나이지만 위 예시처럼 코드 베이스 관리 방식과 밀접한 관련이 있음을 알 수 있다.
모놀리식 아키텍처의 높은 코드 재사용성에도 불구하고 관심분리의 하드함이라는 치명적인 단점으로 인해 멀티레포라는 코드 베이스 관리 방법론이 나타나게 된다.
멀티레포는 각기 다른 기능이나 모듈을 독립적인 레포지토리로 관리한다.
독립적인 관리로 인해 관심 분리가 잘 이루어졌지만 그로 인해 코드 단계에서의 재사용성이 아주 낮아지게 된다.
최근 프로젝트들은 멀티레포 방법론을 따랐는데, 독립적으로 관리하다 보니 B2C와 BO의 동일한 기능 삭제 및 추가, UI 변화가 있을 경우 공통된 코드를 두 레포지토리에서 작성할 수 밖에 없었다.
당연히 비즈니스 로직이 첨가된 유틸 함수들 또한 중복으로 생성하는 번거로움이 있었다.
이뿐만 아니라 배포까지도 개별적으로 관리해야 하니 1줄의 코드를 주석 처리하여 업데이트 하는 업무에서도 각각 수정 및 배포를 진행하니 짧게는 3분 길게는 10분까지 소요되는 경우도 있었다.
모노레포는 모놀리식 아키텍쳐와 멀티레포의 장점을 섞은 방법론이다.
하나의 레포지토리에서 기능이나 모듈을 독립적으로 관리한다.
하나의 레포로 관리하므로 모놀리식 아키텍처의 장점인 높은 코드 재사용성을 경험할 수 있다. 동시에 내부 코드는 기능과 목적에 따라 모듈화 시키므로 관심 분리를 통해 디버깅 용이성도 챙긴다.
모놀리식 아키텍쳐와 멀티레포, 모노레포를 하나의 그림으로 정리하면 아래와 같다.
모노레포 환경에서 빌드를 지원하는 도구가 Turbo-repo 다.
터보레포는 고급 빌드 시스템을 구축하는 과정을 돕는 도구로 스크립트 설정 및 설계와 관련된 수고를 덜어준다.
터보레포의 주요 특징으로 4가지를 꼽아봤다.
첫 번째는 Incremental builds
빌드 작업 시 이미 계산된 내용은 건너 뛰는 것을 의미한다. 따라서 빠른 속도로 빌드를 진행할 수 있다.
두 번째는 Content-aware hasing
타임스탬프 해싱(가장 마지막으로 변경 사항이 발생한 시각을 바탕으로 모든 파일을 다시 빌드)이 아닌 콘텐츠 인식 해싱을 지원하므로 변경된 파일만 다시 빌드하게 된다.
세 번째는 Cloud caching
로컬 캐시 뿐만 아니라 클라우드 상에 빌드 캐시를 공유할 수 있다.
따라서 팀원들과 빠른 빌드를 경험할 수 있다.
마지막으로 Parallel execution
지정된 태스크 단위로 의존성을 판단하여 최대한 병렬적으로 작업을 진행한다.
태스크 단위는 turbo.json의 파이프라인에 작성된 명령어를 기준으로 한다.
결론적으로
모놀리식 아키텍쳐는 모든 주민이 함께 사는 큰 집이다. 남이 쓰는 드라이기를 내가 바로 쓸 수 있는 대신 수도가 고장나면 물과 관련된 모든 기능을 사용하지 못하듯이 모든 것이 밀접하게 연관되어 있어 문제 해결에 어려움을 겪는다.
멀티레포는 모든 주민이 각 층마다 나뉘어져서 사는 아파트다. 우리집 수도가 고장나도 다른 층은 문제 없이 목욕을 할 수 있지만 다른 주민이 쓰는 드라이기가 필요해도 우리집에 없기 때문에 나는 새로 사와야 한다. (유틸 함수의 중복 선언)
이 단점들을 해결하기 위한 모노레포는 모든 주민이 같은 건물에 거주하지만 층으로 나뉘어져있지 않고 공동 작업 공간이 분리되어 있는 곳이다. 어떤 곳에는 드라이기, 고데기, 거울 등이 모아져있어서 바로 가져다 쓸 수 있는거다. 또한 드라이기를 새로 들여오면 모든 주민들에게 새 드라이기를 사줄 필요없이 하나의 드라이기만 업데이트 해주면 모두 똑같이 새로운 드라이기를 사용하게 된다.
터보레포는 이런 모노레포를 더 원활하고 빠르게 이용할 수 있게 해준다. 공용 공간의 복사기에 캐싱 기능을 넣어서 누군가 인쇄한 문서를 또 인쇄하려고 하면 굳이 스캔하지 않아도 바로 인쇄할 수 있게 해주거나 a룸이 욕실 청소를 한다면 b룸을 이용하게 해주는 병렬적인 구조를 도와준다.