발행일

[ZBF] 7주차 보충 : 모노레포(Monorepo) > 개념, 장점, 단점 및 사례

[ZBF] 7주차 보충 : 모노레포(Monorepo) > 개념, 장점, 단점 및 사례

이 글은 네이버 블로그에 2024년 6월 30일에 올렸던 것을 그대로 옮겨온 것입니다.

현대 소프트웨어 개발에서는 다양한 프로젝트를 효율적으로 관리하기 위해 여러 가지 전략을 사용합니다. 그중 모노레포(Monorepo)는 여러 프로젝트를 단일 리포지토리(저장소)에서 관리하는 접근 방식으로 점점 더 많은 인기를 얻고 있습니다. 이번 포스트에서는 모노레포의 개념, 장점, 단점 및 유명 사례에 대해 알아보겠습니다.

모노레포란 무엇인가?

모노레포(Monorepo)는 "Monolithic Repository"의 줄임말로, 여러 개의 프로젝트를 하나의 리포지토리에서 관리하는 방법을 의미합니다. 이는 각각의 프로젝트를 별도의 리포지토리에서 관리하는 멀티레포(Multi-repo)와 대조됩니다.

주요 개념

  • 단일 리포지토리: 모든 코드베이스가 하나의 리포지토리에 저장됩니다.
  • 공유 종속성: 프로젝트 간에 공통으로 사용되는 종속성을 쉽게 공유할 수 있습니다.
  • 통합 빌드 시스템: 모든 프로젝트가 동일한 빌드 시스템을 사용하여 일관성을 유지합니다.

모노레포의 장점

1. 코드 공유 및 재사용

모노레포에서는 모든 코드가 하나의 리포지토리에 있기 때문에, 프로젝트 간에 코드를 공유하고 재사용하는 것이 용이합니다. 이는 중복 코드를 줄이고, 코드 품질을 향상시키는 데 도움이 됩니다.

2. 일관된 개발 환경

모노레포는 모든 프로젝트가 동일한 빌드 도구, 테스트 도구, 린트 도구 등을 사용하게 하여 일관된 개발 환경을 제공합니다. 이는 새로운 개발자가 프로젝트에 참여할 때 학습 곡선을 줄이는 데 유리합니다.

3. 통합된 코드 리뷰 및 배포

모노레포에서는 모든 변경 사항이 하나의 리포지토리에 모이기 때문에, 코드 리뷰와 배포 프로세스를 일관되게 유지할 수 있습니다. 이는 코드 품질을 높이고, 배포 프로세스를 간소화합니다.

4. 버전 관리 용이성

모노레포에서는 모든 프로젝트가 동일한 버전 관리 시스템을 사용하므로, 종속성 관리가 간단해집니다. 프로젝트 간의 호환성을 유지하기 쉽고, 버전 충돌을 방지할 수 있습니다.

모노레포의 단점

1. 리포지토리 규모

모노레포는 모든 프로젝트를 하나의 리포지토리에 포함하기 때문에, 리포지토리의 크기가 매우 커질 수 있습니다. 이는 클론(clone) 속도를 느리게 하거나, CI/CD 파이프라인에서 병목 현상을 초래할 수 있습니다.

2. 복잡한 권한 관리

여러 팀이 하나의 리포지토리를 관리하기 때문에, 프로젝트별로 세밀한 권한 관리를 설정하는 것이 어려울 수 있습니다. 이는 보안 문제를 야기할 수 있습니다.

3. 도구 및 워크플로우 설정

모노레포에서는 각 프로젝트의 특성을 고려한 맞춤형 도구 및 워크플로우 설정이 필요합니다. 이는 초기 설정에 많은 시간을 소모할 수 있습니다.

모노레포 사례

1. Google

Google은 전 세계적으로 가장 큰 모노레포를 운영하는 회사 중 하나입니다. Google의 모노레포는 수십억 줄의 코드와 수백 개의 프로젝트를 포함하며, 이를 통해 코드 공유와 협업을 촉진하고 있습니다.

2. Facebook

Facebook도 모노레포를 사용하여 다양한 프로젝트를 관리합니다. Facebook의 모노레포는 여러 팀이 협력하여 일관된 코드베이스를 유지하는 데 중요한 역할을 합니다.

3. Microsoft

Microsoft는 주요 프로젝트들을 모노레포로 관리하여 개발자들이 통합된 환경에서 작업할 수 있도록 지원합니다. 이는 코드 일관성을 유지하고, 효율적인 배포 프로세스를 가능하게 합니다.

결론

모노레포는 여러 프로젝트를 단일 리포지토리에서 관리하여 코드 공유, 일관된 개발 환경, 통합된 코드 리뷰 및 배포, 버전 관리 용이성 등 많은 장점을 제공합니다. 그러나 리포지토리 규모, 권한 관리, 도구 및 워크플로우 설정 등의 단점도 존재합니다. 모노레포의 성공적인 적용 사례를 통해, 이 접근 방식을 통해 얻을 수 있는 이점을 잘 이해하고, 프로젝트 특성에 맞는 전략을 선택하는 것이 중요합니다.


모노레포를 관리하기 위한 주요 도구

모노레포를 효과적으로 관리하기 위해서는 다양한 도구와 프레임워크가 필요합니다. 다음은 모노레포 관리에 유용한 주요 도구들입니다:

Lerna

Lerna는 JavaScript 프로젝트를 위한 모노레포 관리 도구입니다. 패키지의 버전 관리, 의존성 설치, 변경된 패키지의 배포 등을 쉽게 할 수 있습니다.

주요 기능: 의존성 관리, 배포 자동화, 패키지 링크

Nx

Nx는 대규모 모노레포를 위한 강력한 도구로, Angular 팀에서 만든 도구입니다. React, Angular, Node.js 등 다양한 프레임워크를 지원하며, 개발 워크플로우를 최적화합니다.

주요 기능: 빌드 캐싱, 분산 캐시, 터미널 명령어

Bazel

Bazel은 Google에서 개발한 빌드 및 테스트 도구로, 대규모 코드베이스를 효율적으로 관리할 수 있습니다. 여러 언어를 지원하며, 빌드 속도를 최적화합니다.

주요 기능: 증분 빌드, 분산 빌드, 테스트 실행

Rush

Rush는 Microsoft에서 개발한 모노레포 관리 도구로, 대규모 JavaScript 프로젝트에서 의존성 관리와 빌드 프로세스를 효율적으로 처리할 수 있습니다.

주요 기능: 고급 의존성 관리, 증분 빌드, 프로젝트 파이프라인

Yarn Workspaces

Yarn Workspaces는 Yarn 패키지 매니저의 기능으로, 모노레포에서 패키지를 쉽게 관리할 수 있게 합니다. 의존성을 공유하고 설치 속도를 최적화합니다.

주요 기능: 패키지 설치 최적화, 의존성 공유, 일관된 버전 관리

모노레포와 멀티레포는 각각의 장단점이 있으며, 다음과 같은 상황에서 모노레포가 더 적합합니다:

코드 공유가 빈번한 경우

여러 프로젝트 간에 코드 공유가 빈번히 이루어질 때, 모노레포는 코드 중복을 줄이고 일관된 코드베이스를 유지할 수 있습니다.

일관된 개발 환경이 필요한 경우

모든 프로젝트가 동일한 빌드 도구, 테스트 도구, 린트 도구 등을 사용해야 하는 경우, 모노레포는 일관된 개발 환경을 제공합니다.

프로젝트 간의 긴밀한 의존성이 있는 경우

여러 프로젝트가 서로 긴밀하게 연결되어 있는 경우, 모노레포를 통해 변경 사항을 쉽게 추적하고 통합할 수 있습니다.

중앙화된 코드 리뷰와 배포 프로세스가 필요한 경우

중앙화된 코드 리뷰와 배포 프로세스를 통해 코드 품질을 유지하고, 배포를 간소화할 수 있습니다.

Q3: 모노레포에서 발생할 수 있는 성능 문제를 해결하기 위한 방법에는 무엇이 있나요?

모노레포에서 발생할 수 있는 성능 문제를 해결하기 위한 방법은 다음과 같습니다:

빌드 캐싱 및 증분 빌드

빌드 캐싱을 사용하여 이전 빌드의 결과를 재사용하고, 증분 빌드를 통해 변경된 부분만 빌드하여 빌드 시간을 단축할 수 있습니다. Nx와 Bazel은 이러한 기능을 지원합니다.

분산 빌드 시스템

분산 빌드 시스템을 도입하여 빌드 작업을 여러 서버에 분산시켜 처리 속도를 향상시킬 수 있습니다. Bazel은 분산 빌드를 지원합니다.

의존성 최적화

의존성을 최적화하여 불필요한 의존성을 제거하고, 필요한 의존성만 설치하도록 합니다. Yarn Workspaces와 Lerna는 의존성 최적화에 도움을 줍니다.

모듈화 및 코드 분할

모듈화를 통해 코드베이스를 작고 독립적인 모듈로 분할하여 빌드와 테스트를 병렬로 처리할 수 있습니다.

효율적인 CI/CD 파이프라인 구성

효율적인 CI/CD 파이프라인을 구성하여 병렬 빌드와 테스트를 수행하고, 빌드 시간을 줄일 수 있습니다.