Search

Monorepo X Bazel

Bazel은 Monorepo에 왜 적합한 툴일까요?

Bazel은 monorepo(모노레포, 단일 저장소)에 적합한 빌드 도구입니다.
monorepo는 여러 개의 프로젝트와 코드를 하나의 저장소에서 관리하는 방식입니다. Bazel이 monorepo에 적합한 이유는 아래와 같습니다.
1.
증분 빌드: Bazel은 증분 빌드를 지원하므로, 변경된 부분만 빌드할 수 있습니다. monorepo에서는 다양한 프로젝트와 코드가 함께 저장되기 때문에, 증분 빌드를 통해 빌드 시간을 크게 줄일 수 있습니다.
2.
병렬 빌드: Bazel은 병렬 빌드를 지원하여 여러 코어를 활용하여 빌드 작업을 동시에 수행할 수 있습니다. monorepo에서는 프로젝트 간의 종속성이 적을 가능성이 높기 때문에, 병렬 빌드를 통해 빌드 성능을 향상시킬 수 있습니다.
3.
정확한 종속성 관리: Bazel은 명시적인 종속성 관리를 지원하므로, 각 프로젝트의 종속성이 명확하게 정의됩니다. monorepo에서는 프로젝트 간의 공유된 종속성 관리가 중요하므로, Bazel의 명시적인 종속성 관리가 유용합니다.
4.
공유된 빌드 설정: Bazel은 공유된 빌드 설정을 지원하여, 저장소 전체에 걸쳐 일관된 빌드 환경을 제공할 수 있습니다. monorepo에서는 여러 프로젝트를 일관된 방식으로 빌드하고 배포해야 하므로, 공유된 빌드 설정이 필요합니다.
5.
언어 및 플랫폼 간 상호 운용성: Bazel은 다양한 언어 및 플랫폼에 대한 빌드 규칙을 제공하므로, 여러 프로젝트를 통합하여 관리할 수 있습니다. monorepo에서는 다양한 언어 및 플랫폼을 사용하는 프로젝트가 함께 저장되므로, Bazel의 상호 운용성이 유용합니다.
6.
원격 빌드 및 캐싱: Bazel은 원격 빌드 및 캐싱을 지원하여, 대규모 monorepo의 빌드 성능을 더욱 향상시킬 수 있습니다. 원격 빌드를 통해 서버에서 빌드 작업을 수행하고 결과를 로컬 머신으로 가져올 수 있습니다. 캐싱을 통해 이전에 빌드된 결과물을 재사용하여 빌드 시간을 단축할 수 있습니다.
7.
코드 재사용성: Monorepo에서는 코드 재사용성이 중요한데, Bazel은 코드 및 라이브러리를 모듈화하여 재사용하기 쉽게 만들어줍니다. 이를 통해 프로젝트 간의 코드 중복을 줄이고, 개발 및 유지보수 비용을 절감할 수 있습니다.
8.
테스트 자동화: Bazel은 테스트 자동화를 지원하여 프로젝트 전체에 걸쳐 테스트를 실행하고 결과를 집계할 수 있습니다. monorepo에서는 프로젝트 간의 의존성 때문에 테스트 자동화가 중요하며, Bazel을 사용하면 프로젝트 전체의 테스트를 효율적으로 관리할 수 있습니다.
9.
프로젝트 구조화: Bazel은 프로젝트를 구조화하기 위한 명확한 규칙과 레이아웃을 제공합니다. Monorepo에서는 다양한 프로젝트가 함께 저장되므로, Bazel의 프로젝트 구조화 기능이 프로젝트 관리에 도움이 됩니다.
총체적으로 볼 때, Bazel은 증분 빌드, 병렬 빌드, 정확한 종속성 관리, 공유된 빌드 설정, 언어 및 플랫폼 간 상호 운용성, 원격 빌드 및 캐싱, 코드 재사용성, 테스트 자동화, 프로젝트 구조화 등의 기능을 제공하여 monorepo에 적합한 빌드 도구입니다. 이러한 기능들을 통해 monorepo에서 프로젝트를 빠르고 효율적으로 빌드, 테스트 및 배포할 수 있습니다.

monorepo와 polyrepo의 장단점

monorepo와 polyrepo는 각각 프로젝트의 소스 코드를 저장하는 방식에 있어 서로 다른 접근 방식을 가지고 있습니다. 각 방식의 장단점과 고려사항을 살펴보겠습니다.

monorepo (단일 저장소): 장점:

1.
코드 재사용: 공통 라이브러리와 코드를 쉽게 공유하고 재사용할 수 있어 중복을 최소화합니다.
2.
종속성 관리: 프로젝트 전체에 걸친 종속성을 일관되게 관리할 수 있습니다.
3.
통합된 빌드 및 테스트: 모든 프로젝트를 함께 빌드하고 테스트할 수 있어 전체 시스템에 대한 통합 테스트가 용이합니다.
4.
원자적 커밋: 여러 프로젝트 간의 변경 사항을 한 번의 커밋으로 처리할 수 있어, 프로젝트 간의 일관성을 유지하는 데 도움이 됩니다.

단점:

1.
크기와 복잡성: 저장소가 커질수록 관리 및 빌드 속도가 느려질 수 있습니다. 적절한 빌드 도구 및 구조화가 필요합니다.
2.
권한 관리: 여러 프로젝트를 하나의 저장소에서 관리하므로, 접근 권한 관리가 복잡해질 수 있습니다.
3.
학습 곡선: 새로운 개발자가 프로젝트에 적응하는 데 시간이 더 걸릴 수 있습니다.

polyrepo (다중 저장소): 장점:

1.
독립성: 각 프로젝트가 독립적으로 관리되므로 프로젝트 간의 영향을 최소화할 수 있습니다.
2.
권한 관리: 프로젝트별로 접근 권한을 쉽게 설정할 수 있습니다.
3.
저장소 크기 및 복잡성: 각 저장소가 작고 관리하기 쉽습니다.

단점:

1.
코드 중복: 코드 및 라이브러리를 재사용하려면 별도의 저장소에 배포하고 각 프로젝트에서 가져와야 하므로 중복이 발생할 수 있습니다.
2.
종속성 및 버전 관리: 여러 저장소에서 동일한 종속성을 사용할 때 동기화 및 버전 관리가 어려울 수 있습니다.
3.
통합 테스트: 전체 시스템을 테스트하기 위해 여러 저장소를 동시에 빌드 및 테스트해야 하므로 통합 테스트가 어려울 수 있습니다.
4.
원자적 커밋 불가: 여러 프로젝트 간의 변경 사항을 한 번의 커밋으로 처리할 수 없어, 프로젝트 간의 일관성을 유지하는 데 어려움이 있을 수 있습니다.

어떤 방식을 선택해야 할까?

monorepo와 polyrepo 중 어떤 접근 방식을 선택할지 결정할 때 고려해야 할 몇 가지 요소는 다음과 같습니다.
1.
프로젝트 크기 및 복잡성: monorepo는 대규모 프로젝트와 코드베이스를 관리하는 데 더 적합할 수 있지만, 적절한 도구와 구조화가 필요합니다. 반면에, polyrepo는 작은 프로젝트에 더 적합할 수 있습니다.
2.
팀 구조 및 협업: monorepo는 팀 간 협업과 코드 공유를 촉진하지만, polyrepo는 프로젝트 간의 독립성을 보장합니다. 팀의 협업 방식과 목표를 고려하여 결정해야 합니다.
3.
코드 재사용 및 종속성 관리: monorepo는 코드 재사용과 종속성 관리에 더 강점이 있습니다. 반면에, polyrepo에서는 이러한 작업이 복잡해질 수 있으므로, 프로젝트의 요구사항과 일치하는지 확인해야 합니다.
4.
빌드 및 테스트 전략: monorepo는 통합 빌드 및 테스트에 유리하지만, 적절한 빌드 도구와 전략이 필요합니다. 반면에, polyrepo는 빌드 및 테스트의 독립성을 보장하지만, 통합 테스트를 수행하는 데 어려움이 있을 수 있습니다.
결론적으로, monorepo와 polyrepo 각각의 장단점을 고려하여 프로젝트의 규모, 복잡성, 팀 구조, 협업 방식, 코드 재사용 및 종속성 관리 요구사항, 빌드 및 테스트 전략 등을 종합적으로 고려해 결정해야 합니다.

알아두면 좋은 개념들

Bazel CI/CD 통합
Bazel CI/CD 통합