배워서 남 주자

모노레포(Monorepo)란?

미래에서 온 개발자 2023. 7. 22. 22:46

프로젝트 규모가 커지면 시스템의 각 부분을 도메인 별로 분리해서 마이크로 서비스로 구성하기 시작한다. 이때 시스템의 각 모듈을 개별 레포지토리에서 관리하는 것을 모노레포(monolithic repository의 준말), 나눠서 관리하는 것을 멀티레포(multirepo) 또는폴리레포(polyrepo)라고 한다. 

 

  장점 단점
멀티레포 - 강한 오너쉽 확보: 레포 별로 오너 지정
- 마스터 코드가 깨질 여지가 적음
  * 코드 베이스가 아예 나뉘어져 있음
  * 서로 간의 작업 충돌로 마스터 코드가 깨질 가능성이 적음
- 형상 관리, CI 속도가 빠름 
- 코드 재사용이 쉽지 않아 중복 코드 가능성이 높아짐
- 관리 포인트 증가
- 일관성 없는 개발자경험(DX)
- 하나의 feature 개발을 위해 여러 레포지토리에 merge 해야 함 
- 코드 리뷰가 나누어짐
- 버전 연동이 깨질 위험이 있음
  * 하나의 브레이킹 체인지가 다른 레포에 즉시 전파되지 않음
- dependency hell 
  * 프로젝트 규모가 커지면 의존 그래프가 매우 복잡해짐
  * 서로의 코드에 변화가 생길 때 이에 대처하기가 쉽지 않음
모노레포 - 지속적인 소스의 무결성 보장
- 통합된 버전 관리
- 코드 공유와 재사용 용이
- 의존성 관리가 쉬움
- 여러 프로젝트팀 간의 협업이 쉬움
- 유연한 팀 바운더리 설정과 코드 오너쉽을 가져갈 수 있음
- 전체 코드가 트리 구조로 명확히 보임
- 한 번의 코드 리뷰에 모든 변화가 요약
- 표준화하려는 환경과 배포 관리가 쉬움
  * package.json과 같은 종속성 관리
  * 공유된 패키지 재사용 (/design-system, /common-util, /schema 등)
  * 환경설정(ESlint, tsconfig 등)
  * 테스트(unit, e2e) 환경 구성 등

- 무분별한 의존성 연결 가능
  * 의존성 연결이 쉽기 때문에 오히려 과도한
   의존 관계가 나타날 수 있음
  * 앱마다 다른 배포 주기와 의존된 공유 패키지들은 복잡한 브랜치로 유지관리가 힘듦
- 형상 관리 및 CI 속도 저하
- 복잡한 디렉토리 구조 및 복잡한 파이프라인으로 인한 추가적인 교육과 학습곡선

 

모노레포가 적절한 상황:

- 유사한 제품의 집합

- 여러 프로젝트의 변화를 한눈에 파악해야 할 때

- 호스트 애플리케이션을 플러그인 등으로 확장할 때

- 공통 기능을 재사용하는 관련된 프로젝트의 집합

- 유사한 DevOps로 구성된 프로젝트의 집합

 

모노레포 구축을 도와주는 도구: 

- pnpm

- Turborepo

- Nx

- npm

- yarn

- Lerna 등

 

 

📚 참고자료

https://d2.naver.com/helloworld/0923884

 

모노레포 - 마이크로 아키텍처를 지향하며

모노레포에 대해서 들어보셨나요? 프론트엔드에서 마이크로 아키텍처를 지향하려면 어떻게 해야할까요?

green-labs.github.io

 

멀티리포 vs 모노리포

들어가며 본 문서는 소스 형상 관리 시스템상에서 소스 리포지토리를 관리하는 방법인 멀티리포와 모노리포를 비교하고 분석하여, 개발 조직이 어떤 방식을 선택해야 하는지 정보를 제공한다.

tech.buzzvil.com

 

팀워크 향상을 위한 모노레포(Monorepo) 시스템 구축

콴다 프론트엔드 팀이 모노레포를 선택한 이유

blog.mathpresso.com