본문 바로가기
IT 알쓸신잡

모노레포 접근법

by zing! 2025. 3. 19.

작은 프로젝트들을 하나의 파일에서 관리하고싶어서 찾고찾다가 발견했다.


모노레포(Monorepo)

여러 프로젝트나 패키지를 단일 코드 저장소에서 관리하는 소프트웨어 개발 접근법

monolithic repository의 줄임말로, 관련된 여러 프로젝트의 코드를 하나의 버전 관리 저장소에 보관하는 방식

각 프로젝트를 개별 저장소(멀티레포)로 관리하는 전통적인 방식과 대비된다.

monorepo/
├── packages/          # 개별 프로젝트들
│   ├── project-a/     # 첫 번째 프로젝트
│   │   ├── package.json
│   │   └── src/
│   ├── project-b/     # 두 번째 프로젝트
│   │   ├── package.json
│   │   └── src/
│   └── shared/        # 공유 코드
│       ├── package.json
│       └── src/
├── package.json       # 루트 package.json

모노레포의 주요 특징

  • 코드 공유: 여러 프로젝트 간 코드와 컴포넌트를 쉽게 공유
  • 통합 버전 관리: 모든 프로젝트의 버전 히스토리를 통합적으로 관리
  • 일관된 개발 환경: 모든 프로젝트에 동일한 도구와 프로세스 적용
  • 원자적 변경: 여러 프로젝트에 걸친 변경사항을 한 번에 커밋 가능

모노레포가 적합한 상황

  1. 관련 프로젝트 관리: 서로 의존성이 높거나 함께 발전하는 프로젝트들
  2. 대규모 조직: 여러 팀이 협업하며 코드베이스를 공유하는 경우
  3. 일관된 개발 경험: 모든 프로젝트에 동일한 코딩 스타일, 테스트, 빌드 과정이 필요할 때
  4. 통합 테스트 중요성: 여러 컴포넌트 간의 통합 테스트가 중요한 경우
  5. 빠른 리팩토링: 여러 프로젝트에 걸친 리팩토링이 자주 필요할 때

모노레포 사용 시 고려사항

  • 저장소 크기: 시간이 지남에 따라 저장소 크기가 매우 커질 수 있음
  • 빌드 시간: 전체 빌드 시간이 길어질 수 있어 적절한 최적화 필요
  • 접근 제어: 대규모 팀의 경우 적절한 접근 권한 관리 필요
  • 도구 지원: 모노레포 관리를 위한 특별한 도구(Lerna, Nx, Turborepo 등) 필요

모노레포를 효율적으로 관리하기 위한 주요 도구

모노레포 관리: Lerna, Nx, Turborepo 등등

작은 모노레포는 Yarn/npm Workspaces가 충분하고, 대규모 프로젝트는 Nx나 Turborepo같은 고급 도구가 효과적이다.

 

소규모 모노레포 (2-5개 프로젝트)

  • Yarn Workspaces / npm Workspaces
    • 기본적인 모노레포 기능 제공
    • 설정이 간단하고 학습 곡선이 낮음
    • 의존성 호이스팅으로 디스크 공간 절약
    • 별도의 추가 도구 없이 기본 패키지 매니저만으로 관리 가능

중간 규모 모노레포 (5-20개 프로젝트)

  • Lerna (+ Yarn/npm Workspaces)
    • 버전 관리와 배포 자동화 기능 추가
    • 워크스페이스와 함께 사용하면 더 효과적
    • 명령어 실행 병렬화 지원
    • 패키지 간 의존성 관리 기능

대규모 모노레포 (20개 이상 프로젝트)

  • Nx 또는 Turborepo
    • 정교한 의존성 그래프 분석
    • 증분 빌드와 캐싱으로 성능 최적화
    • 영향 분석(affected commands)으로 변경된 부분만 빌드/테스트
    • 대규모 팀 작업에 효율적인 도구