모노레포(monorepo)란?
모노레포란 버전 관리 시스템에서 두 개 이상의 프로젝트 코드가 동일한 저장소에 저장되는 소프트웨어 개발 전략이다. 아래과 같은 프로젝트 구조를 보면 이해하기 빠를 것이다.
모노레포 장점
팀 간 협업 개선
모든 프로젝트가 동일한 리포지토리에 포함된다. 즉, 회사의 모든 사람이 코드를 보고 사용할 수 있으므로 공유 라이브러리를 더 쉽게 찾고 활용할 수 있다. 이는 협업 및 코드 재사용을 할 수 있어서 리소스를 절약할 수 있다.
간편한 종속성 관리
모노레포는 내부 및 타사 종속성 관리를 더 간편하고 수월하게 할 수 있다. 특정 버전의 종속성을 고정하여 업데이트가 필요할 때 전체 코드에서 변경 사항 및 이전 버전과의 호환성을 더 쉽게 테스트할 수 있다. 즉, 종속성의 취약점을 관리하는 것도 더 쉬워진다. 하나의 종속성만 패치하거나 업데이트하면 단위 테스트를 한 번에 더 빠르고 쉽게 실행할 수 있고 공유 라이브러리의 일반적인 사용을 찾는 능력이 향상된다.
대규모 코드 리펙토링
주요 이점인 대규모 코드 리팩토링 및 원자적 커밋으로 이어진다. 내부 API와 같은 특정 기능을 리팩토링하기 위해 여러 프로젝트에 걸쳐 여러 PR을 작성해야 하는 대신 모노레포를 사용하면 한 번의 커밋으로 기능을 활용하는 서비스를 처리할 수 있다. 이렇게 하면 프로세스를 며칠 또는 몇 달에서 더 확신을 가지고 배포할 수 있는 몇 개의 커밋으로 가속화할 수 있을 것이다.
모노레포 단점
파이프라인 구축
규모가 커질수록 분산된 CI 파이프라인보다 속도가 느려질 수밖에 없다. 이러한 단점으로 인하여 Facebook과 Google은 모두 자체 빌드 도구(각각 Buck 및 Bazel)를 개발하여 거대한 모노레포의 빌드 프로세스를 관리하고 있다.
형상관리 과제
형상관리 도구는 몇 가지 문제도 제시할 수 있습니다. 빌드 파이프라인과 유사하게 대규모 코드 기반과 수백만 건의 커밋이 있는 시스템은 git 성능이 저하될 수 있다. 이러한 이유로 인하여 Google은 이를 위해 자체 맞춤형 도구를 만들었다. Microsoft 또한 과부하를 관리하는데 도움이 되는 git용 VFS(가상 파일 시스템) 를 출시했다.
액세스 제어 제한 사항
액세스 제어도 문제가 될 수 있다. 회사에서 모든 엔지니어가 전체 코드베이스에 액세스하는 것을 원하지 않는 경우가 있을 수 있다. 여기에는 계획, 조정 및 사용자 지정도 필요하다.
오픈 소스 취약성 우선 순위 지정 및 라이선스
단일 저장소를 사용하면 오픈 소스 종속성을 더 쉽게 관리할 수 있지만 취약점 수정의 우선 순위를 지정하고 제품별 속성 보고서를 생성하는 프로세스가 복잡해질 수 있다. 각 제품을 빌드하는 데 사용되는 파일 및 종속성을 이해하려면 SCA(소프트웨어 구성 분석) 또는 오픈 소스 관리 소프트웨어를 빌드 시스템과 통합해야 한다.