모노레포
모노레포(Monorepo, Monolithic Repository)는 여러 프로젝트(패키지)를 하나의 저장소(repository)에서 관리하는 방식이다.
왜 모노레포를 사용하는가?
1. 코드 재사용 및 일관성 유지
- 모노레포에서는 여러 프로젝트(패키지)가 하나의 저장소에 있기 때문에, 공통 라이브러리나 유틸 함수를 여러 프로젝트에서 쉽게 공유할 수 있다. (ex. @libs/utils, @libs/components 등을 만들어 여러 프로젝트에서 사용이 가능하다.)
- 모든 프로젝트가 동일한 버전의 의존성을 가지므로, 버전 충돌이나 설정 차이로 인한 오류를 줄일 수 있다.
2. CI/CD 파이프라인 최적화
- 프로젝트(패키지)별로 변경된 부분만 빌드하고 테스트 할 수 있어 효율적인 CI 사용이 가능하다.
- 모든 패키지를 독립적으로 관리한느 멀티레포에서는 각 프로젝트마다 파이프라인이 따로 필요하지만, 모노레포는 중앙 집중식 파이프라인 설정이 가능하다.
3. 협업의 용이성
- 큰 규모의 서비스라면 여러 팀이 하나의 저장소에서 일하므로, 코드 리뷰나 PR 관리를 통합할 수 있다.
- 프론트엔드, 백엔더, 공통 라이브러리 개발자가 동시에 한 저장소에서 협업이 가능하다.
- 구조와 명명 규칙을 레포 레벨에서 통일할 수 있어 유지 보수성이 높아진다.
4. 개발 환경 통합
- ESLint, Prettier, Jest, Vitest, Storybook 등 개발 도구 설정을 한 번에 통일할 수 있다.
- devDependencies도 공통화가 가능하기 때문에 패키지 설치 시간 및 디스크 용량을 절약할 수 있다.
5. 디자인 시스템 및 컴포넌트 공유
- @my-org/ui-button처럼 하나의 컴포넌트를 여러 앱에서 재사용가능하기 때문에 '브랜드 일관성 유지 + 개발 효율 증가' 효과가 있다.
6. 코드 품질 및 테스트 보장
- 모노레포 도구는 각 패키지의 테스트, 린팅, 타입체크 등을 통합된 기준으로 실행할 수 있다.
- 전체 코드베이스에 대한 정기적인 통합 테스트가 쉬워진다.
7. 변경 사항 추적 및 영향 분석 용이
- 단일 저장소에서 작업하기 때문에 '어떤 코드가 어디에 영향을 주는지' 파악하기 쉽다.
- 모노레포 도구들은 변경된 파일에 따라 어떤 패키지만 빌드/테스트해야할지 자동으로 감지한다. (ex. Nx의 affected 명령어 -> 변경된 부분만 빌드/테스트가 가능하다.)
8. 버전 관리 단순화
- 모든 패키지가 동일한 버전을 사용할 수 있다. (패키지별로 다르게 버전 관리도 가능하다.)
- Lerna,Nx, Rush 등은 버전 자동 관리도 지원하기 때문에 릴리즈 관리를 효율적으로 할 수 있다.
모노레포 도구
프로젝트의 규모가 커질수록 의존성, 빌드 속도, 변경 추적에 어려움이 생기는데 모노레포 도구는 이 구조를 효율적으로 관리할 수 있게 도와주는 도구들을 말한다.
대표적인 모노레포 도구의 종류
도구 | 특징 | 주요 사용처 |
Nx | 성능 최적화에 강함 (캐싱, 병렬화), 플러그인 기반 구조 | Angular, React, Node.js 등 다양한 프레임워크 지원 |
Turborepo | Vercel에서 만든 빠른 빌드 캐시 기반 도구, 설정 간단 | Next.js, React 등과 잘 맞음 |
Lerna | 가장 오래된 도구 중 하나, npm/yarn 기반 패키지 관리 | 비교적 단순한 구조의 모노레포에 적합 |
Rush | Microsoft에서 개발, 대규모 조직에 적합, 엄격한 규칙 | Microsoft 내부 및 기업 환경에서 활용 |
Bazel | Google 개발, 매우 강력하고 정교한 빌드 시스템 | 대규모 프로젝트, 언어 혼합 프로젝트 (C++, Java 등) |
Pnpm Workspaces | 패키지 간 의존성을 효율적으로 처리, 디스크 사용 절약 | 빠르고 가벼운 모노레포 구성에 적합 |
Yarn Workspaces | yarn 내장 기능으로 여러 패키지를 monorepo로 관리 | 중소 규모 프로젝트에 유용 |
npm Workspaces | npm v7 이상부터 공식 지원, 설정이 간단 | 소규모 프로젝트에 적합 |
정리(어떤 도구를 선택해야 하는가)
프로젝트 성격 | 추천 도구 |
다양한 프레임워크, 대규모 팀 협업 | Nx, Rush |
빠른 빌드, 프론트엔드 중심 | Turborepo |
단순한 의존성 관리, 빠른 구성 | Yarn, npm, pnpm Workspaces |
백엔드/프론트 섞인 대형 시스템 | Bazel, Nx |
참고
ChatGPT
'CI, CD' 카테고리의 다른 글
[Git] Git 브랜치 전략 (git flow, github flow, gitlab flow) (0) | 2023.08.25 |
---|---|
[CI/CD] github actions를 사용해서 npm 배포 자동화하기 (0) | 2023.05.02 |
[Heroku] Heroku and Github : Items could not be retrieved, Internal server error (0) | 2022.05.05 |
댓글