회사 내의 코드베이스를 검토하다 보면 과도하게 분산되어 있는? 성향이 조금 있는 것 같아(사실은 그냥 정리가 안된 거일 수도,,,) 과연 옳은 방법으로 코드들이 관리되는 것인가 고민을 한 적이 있습니다. 회사 내 서비스 특성상 하나의 서비스지만 버전이 여러 개로 나뉠 수밖에 없는 구조이지만 분명 하나로 통일 할 수 있는 방법이 있을 것이고 각자 관리됨에 있어 항상 컨벤션 검토를 거쳐야 되는 번거로움도 해결이 가능할 것이라고 생각했습니다.
예전부터 MSA(Microservices Architecture)가 인기이면서 회사 내에서도 지향하는 듯한 느낌이긴 한데, 과도하게 늘어나는 관리 포인트와 가지각색의 컨벤션은 가장 먼저 해결해야 되지 않을까 싶습니다.
찾아보니 꼭 분산만 지향하는 쪽으로 개발 방법론만 있는 것이 아닌 Monorepo의 개념으로 하나로 통합해 관리하는 방법이 있으며 여러 개발 프레임워크에서 이를 지원하고 있다는 것을 알게 되었습니다. 그래서 이번에는 잠깐 알아본 Monorepo에 대한 내용을 정리해 볼까 합니다.
Monorepo란?
Monorepo는 모노레포(Monolithic Repository)의 약어로, 하나의 대규모 코드 저장소에 모든 코드, 커밋 기록, 이슈, 브랜치 등을 관리하는 개발 방식입니다. 즉, 여러 프로젝트나 서비스들이 여러 개의 독립적인 저장소 대신 하나의 저장소에서 관리됩니다.
Monorepo를 사용하는 주요 이점은 아래와 같습니다.
- 코드 공유 및 재사용 용이성: 다양한 프로젝트 및 서비스에서 공통으로 사용되는 코드들을 모든 저장소에서 관리할 필요 없이, 하나의 저장소에서 관리할 수 있습니다.
- 코드 일관성 유지: Monorepo를 사용하면 개발자들이 모든 코드를 하나의 저장소에서 관리하므로, 코드 일관성 유지와 버전 관리가 용이해집니다.
- 프로젝트 간 종속성 관리: Monorepo를 사용하면 프로젝트 간 종속성 관리가 용이해집니다. 즉, 공통 라이브러리 및 패키지의 버전 충돌 문제가 발생할 가능성이 줄어듭니다.
Monorepo와 대비되는 개념
Monorepo의 대비되는 개념은 "Multirepo"입니다. Multirepo는 각 프로젝트마다 개별적인 저장소를 사용하는 개발 방식입니다.
Multirepo를 사용하는 경우, 프로젝트 간 종속성 관리 및 코드 공유가 어려워집니다. 예를 들어, 여러 프로젝트에서 공통으로 사용되는 코드를 수정하려면, 해당 코드가 있는 모든 저장소에서 수정해야 합니다. 이러한 작업은 번거로우며, 시간과 노력이 많이 필요합니다.
반면, Monorepo를 사용하면 하나의 저장소에서 코드를 수정할 수 있으므로, 이러한 문제가 발생하지 않습니다.
Monorepo와 Multirepo의 장단점
Monorepo
장점:
- 코드 공유: 여러 프로젝트 간의 공통된 코드를 공유하여 코드의 중복을 제거하고, 유지보수성을 높일 수 있습니다.
- 코드 일관성: 모든 코드가 하나의 저장소에 있으므로, 코드의 일관성을 유지하기 쉽습니다.
- 중복 제거: 코드 중복을 최소화하여 개발자가 코드를 유지보수하기 쉽습니다.
- 통합 테스트: 하나의 저장소에 모든 코드가 있으므로, 통합 테스트를 쉽게 수행할 수 있습니다.
- 모듈 관리: 프로젝트 간의 모듈 관리가 쉽습니다.
- 협업 용이성: 모든 코드가 하나의 저장소에 있으므로, 다수의 팀이 함께 작업할 때 협업을 용이하게 할 수 있습니다.
단점:
- 빌드 시간: 모든 코드를 함께 빌드해야 하므로, 빌드 시간이 길어질 수 있습니다.
- 코드 복잡성: 저장소가 커질수록 코드의 복잡성이 증가할 수 있습니다.
- 충돌 가능성: 다수의 개발자가 동시에 코드를 수정할 경우 충돌이 발생할 가능성이 있습니다.
Multirepo
장점:
- 독립성: 각각의 프로젝트가 독립적으로 운영될 수 있으므로, 다른 프로젝트의 변경 사항에 영향을 받지 않습니다.
- 빌드 시간 단축: 각각의 프로젝트가 독립적으로 운영될 수 있으므로, 빌드 시간이 단축될 수 있습니다.
- 코드 안정성: 각각의 프로젝트가 독립적으로 운영될 수 있으므로, 코드의 안정성이 높아질 수 있습니다.
- 개발자 자유도: 각각의 프로젝트가 독립적으로 운영될 수 있으므로, 개발자들이 자유롭게 개발할 수 있습니다.
- CI/CD의 용이성: 각각의 프로젝트가 독립적으로 운영될 수 있으므로, 코드의 버전 관리 및 배포 관리가 용이해집니다.
단점:
- 코드 중복: 프로젝트 간의 코드 중복이 발생할 수 있습니다.
- 코드 일관성: 각각의 프로젝트가 독립적으로 운영되므로, 코드의 일관성을 유지하기 어려울 수 있습니다.
- 모듈 관리: 프로젝트 간의 모듈 관리가 어려울 수 있습니다.
- 코드 공유: 코드의 공유가 어렵거나 제한될 수 있습니다.
- 통합 테스트: 다수의 프로젝트가 있으므로, 통합 테스트를 수행하기 어려울 수 있습니다.
- 협업 용이성: 다수의 프로젝트가 있으므로, 협업 용이성이 떨어질 수 있습니다.
따라서, Monorepo와 Multirepo 중 어떤 것이 뛰어나다는 부분은 찾을 수 없고 프로젝트 특성 또는 규모에 따라 선택해야 되는 부분인 것 같습니다. Monorepo는 대규모 프로젝트에서 특히 효과적이며, 다수의 팀이 함께 작업할 때 협업을 용이하게 할 수 있습니다. Multirepo는 작은 프로젝트에서 더 효과적일 수 있으며, 각각의 프로젝트가 서로 독립적으로 운영되어야 하는 경우에도 유용해 보입니다.
Monorepo는 대규모 프로젝트에서 유용한 개발 방식으로 보입니다. 코드 공유 및 재사용 용이성, 코드 일관성 유지, 프로젝트 간 종속성 관리, 빌드 및 배포 편의성 등의 이점이 있습니다. 하지만, Multirepo와 비교할 때, 저장소 용량과 레포지토리 관리의 복잡성이 증가할 수 있습니다. 따라서, 프로젝트의 크기와 특성에 따라 Monorepo와 Multirepo 중 어떤 개발 방식을 선택할지는 신중하게 결정해야 될 것 같습니다.
+ 추가로 찾아보니 node.js 패키지 관리 툴들이 monorepo를 편리하게 관리할 수 있도록 workspace라는 것을 지원한다는 것을 알게 되었습니다. 다음에는 사용을 해보는 포스팅을 작성해 보겠습니다.
참고
https://www.perforce.com/blog/vcs/what-monorepo
https://vikasg11.medium.com/mono-vs-multi-repository-94c1618cc9c9
'Backend > 개발 방법론 & 디자인 패턴' 카테고리의 다른 글
[Rate Limiting] Token Bucket 알고리즘 (2) | 2024.10.27 |
---|---|
API 디자인 패턴 (0) | 2023.12.13 |
DTO (Data Transfer Object)의 설계법 (0) | 2023.12.12 |
[Design Pattern] 싱글톤 패턴이란? (Singleton Pattern) (0) | 2023.03.11 |
[Design Pattern] Factory Pattern (0) | 2022.08.05 |