이번 인턴을 진행하며 패키지를 관리하던 도중, 이번 프로젝트는 monorepo방식으로 구현되어 있다는걸 들었다. Team Lead가 항상 monorepo에 들어가 무엇을 구현, 수정 등등을 요구했었는데 monorepo가 그저 저장소 이름인줄 알았는데 아니였다!
그렇다면, Monorepo란 무엇일까?
모노리포(Monorepo)는 여러 프로젝트(패키지)를 단일 저장소(repository)에서 관리하는 방법론을 말합니다. 이는 다수의 관련된 프로젝트를 한 곳에서 관리하고 배포할 수 있도록 돕습니다.
### 모노리포의 특징
1. **단일 저장소**:
- 여러 프로젝트를 하나의 저장소에서 관리합니다.
2. **코드 재사용**:
- 공통 코드나 라이브러리를 여러 프로젝트에서 쉽게 재사용할 수 있습니다.
3. **일관된 버전 관리**:
- 저장소 전체에 대해 일관된 버전 관리와 의존성 관리를 할 수 있습니다.
4. **일관된 빌드 및 테스트**:
- 여러 프로젝트에 대해 일관된 빌드 및 테스트 파이프라인을 설정할 수 있습니다.
### 모노리포의 장점
1. **통합된 개발 환경**:
- 모든 프로젝트가 동일한 환경에서 개발되므로 일관성을 유지하기 쉽습니다.
2. **코드 공유**:
- 공통 모듈이나 유틸리티 코드를 쉽게 공유하고 유지 관리할 수 있습니다.
3. **의존성 관리**:
- 모든 프로젝트에서 동일한 의존성 버전을 사용하므로 버전 충돌을 피할 수 있습니다.
4. **코드 리팩토링**:
- 리팩토링 시 단일 커밋으로 모든 관련 프로젝트에 변경 사항을 반영할 수 있습니다.
5. **일관된 테스트 및 빌드**:
- 통합된 빌드 및 테스트 스크립트를 통해 모든 프로젝트에 대해 일관된 빌드 및 테스트를 수행할 수 있습니다.
### 모노리포의 단점
1. **빌드 시간 증가**:
- 모든 프로젝트를 한 번에 빌드하면 빌드 시간이 길어질 수 있습니다.
2. **복잡한 의존성 관리**:
- 여러 프로젝트의 의존성을 동시에 관리해야 하므로 의존성 관리가 복잡해질 수 있습니다.
3. **저장소 크기 증가**:
- 모든 프로젝트의 코드를 단일 저장소에 포함하므로 저장소 크기가 커질 수 있습니다.
### 모노리포 도구
모노리포를 효율적으로 관리하기 위해 다양한 도구들이 사용됩니다. 대표적인 도구로는 다음이 있습니다:
- **Lerna**: JavaScript/TypeScript 프로젝트에서 모노리포를 관리하는 도구로, 여러 패키지의 버전 관리를 쉽게 할 수 있습니다.
- **Nx**: 모노리포 관리와 빌드를 최적화하는 데 도움을 주는 도구로, 특히 대규모 프로젝트에 적합합니다.
- **Bazel**: 구글에서 개발한 빌드 도구로, 대규모 코드베이스를 효율적으로 빌드하고 테스트할 수 있게 도와줍니다.
### 모노리포 예시
모노리포 구조의 예시는 다음과 같습니다:
```
/monorepo
├── /packages
│ ├── /package-a
│ │ ├── package.json
│ │ └── src/
│ ├── /package-b
│ │ ├── package.json
│ │ └── src/
│ └── /shared-utils
│ ├── package.json
│ └── src/
├── package.json
└── lerna.json (or nx.json)
```
여기서 `/packages` 디렉토리 아래에 여러 개의 패키지가 있으며, 각 패키지는 독립적인 `package.json` 파일을 가지고 있지만 공통된 유틸리티(`shared-utils` 같은)를 공유할 수 있습니다.
이와 같은 구조를 통해 프로젝트 관리와 개발의 효율성을 높일 수 있습니다. 모노리포에서 `cookie-parser`와 같은 의존성을 추가하고 관리하는 것도 이러한 구조 덕분에 일관되게 수행할 수 있습니다.
그렇다. 여러 프로젝트 패키지를 하나의 저장소에서 통합/관리하는 시스템이다. 이렇게 보니 이해가 간다. 현재 진행중인 프로젝트의 디렉토리를 보면 root - apps 안에 3개의 서로 다른 app들이 있으며, 이것들을 같이 관리 하는 것이였다.
그렇다면, monorepo와 반대되는 개념인 Multirepo는 무엇일까?
모노리포(Monorepo)와 반대되는 개념은 멀티리포(Multi-repo)입니다. 멀티리포는 각 프로젝트나 패키지를 독립된 저장소에서 관리하는 방법입니다. 이 접근 방식은 많은 개별 저장소로 프로젝트를 분리하여 관리합니다.
### 멀티리포의 특징
1. **다중 저장소**:
- 각 프로젝트나 패키지가 독립된 저장소에서 관리됩니다.
2. **독립된 버전 관리**:
- 각 프로젝트는 독립적으로 버전 관리를 합니다.
3. **독립된 빌드 및 배포**:
- 각 프로젝트는 독립적으로 빌드하고 배포됩니다.
### 멀티리포의 장점
1. **독립성**:
- 프로젝트가 완전히 독립적이므로 각 프로젝트가 다른 프로젝트에 영향을 받지 않습니다.
2. **작은 규모의 저장소**:
- 각 저장소가 상대적으로 작기 때문에 관리가 용이합니다.
3. **특화된 빌드 및 배포**:
- 각 프로젝트가 자신만의 빌드 및 배포 파이프라인을 가질 수 있어 특정 요구사항에 맞게 최적화할 수 있습니다.
4. **팀별 관리 용이**:
- 각 팀이 자신들의 프로젝트만 관리하기 때문에 책임 범위가 명확해집니다.
### 멀티리포의 단점
1. **코드 공유 어려움**:
- 공통 모듈이나 유틸리티 코드를 여러 저장소에서 공유하고 유지 관리하기 어렵습니다.
2. **의존성 관리 복잡성**:
- 여러 저장소 간의 의존성을 관리하는 것이 복잡할 수 있습니다.
3. **중복 작업**:
- 공통된 설정이나 스크립트가 여러 저장소에 중복될 수 있습니다.
4. **일관된 버전 관리 어려움**:
- 여러 프로젝트의 버전을 일관되게 유지하는 것이 어려울 수 있습니다.
### 멀티리포 예시
멀티리포 구조의 예시는 다음과 같습니다:
```
/repo1
├── package.json
└── src/
/repo2
├── package.json
└── src/
/repo-shared-utils
├── package.json
└── src/
```
여기서 각 프로젝트(`repo1`, `repo2`, `repo-shared-utils`)는 독립된 저장소에서 관리됩니다. 공통 유틸리티는 `repo-shared-utils`에서 관리되며, 필요한 경우 이를 다른 프로젝트에 의존성으로 추가하여 사용할 수 있습니다.
### 모노리포와 멀티리포 비교
- **코드베이스 관리**: 모노리포는 하나의 큰 저장소에서 모든 코드를 관리하지만, 멀티리포는 각 프로젝트를 별도의 저장소에서 관리합니다.
- **코드 공유**: 모노리포에서는 공통 코드를 쉽게 공유할 수 있지만, 멀티리포에서는 코드 공유가 어렵고 번거로울 수 있습니다.
- **의존성 관리**: 모노리포에서는 의존성 관리를 통합하여 쉽게 할 수 있지만, 멀티리포에서는 각 프로젝트마다 별도로 관리해야 합니다.
- **빌드 및 배포**: 모노리포는 통합된 빌드 및 배포 파이프라인을 사용하지만, 멀티리포는 각 프로젝트별로 별도의 빌드 및 배포 파이프라인을 가질 수 있습니다.
각 접근 방식은 특정 상황에서 더 유리할 수 있으므로, 프로젝트의 성격과 팀의 요구에 따라 적절한 방식을 선택하는 것이 중요합니다.
'Internship' 카테고리의 다른 글
Dependency? 의존성은 무엇일까? (0) | 2024.06.27 |
---|