모노레포
프로젝트 관리 방식 중 하나인 모노레포에 대해 정리
소프트웨어 아키텍처
단일(Mono) 저장소(Repository)
- 관련 있는 여러 프로젝트의 소스 코드를 단 하나의 Git 저장소에서 모두 관리하는 방식
우리팀_프로젝트/ <-- 하나의 Git 저장소
├── 📂 frontend/
│ ├── package.json
│ └── src/
├── 📂 backend/
│ ├── package.json
│ └── src/
└── package.json
장점
원자적 커밋
- 하나의 기능이 FE와 BE 양쪽의 변경을 모두 필요로 할 때, 관련된 모든 변경사항을 하나의 커밋으로 묶을 수 있음
- 이를 통해 코드 변경의 히스토리를 이해하기 쉽고, 문제가 생겼을 때 이전 상태로 되돌리기도 간편해짐
통일된 개발 환경과 표준화
- 모든 프로젝트가 하나의 저장소에 있으므로, ESLint와 Prettier, 테스트 도구 등을 한 번만 설정하면 됨
- 전체 프로젝트의 코드 스타일과 품질을 일관되게 유지하는 데 큰 도움이 됨
간소화된 의존성 관리
- 프로젝트 전체에서 사용하는 라이브러리의 버전을 하나로 통일하기 쉬움
모노레포 vs 폴리레포
모노레포의 반대 개념은 폴리레포(Polyrepo) 또는 멀티레포(Multi-repo)라고 부른다. 이는 프로젝트마다 별도의 Git 저장소를 만드는 것을 의미한다.
| 특징 | 모노레포 (Monorepo) | अलग 폴리레포 (Polyrepo) |
|---|---|---|
| 저장소 구조 | 하나의 저장소에 모든 프로젝트 | 프로젝트마다 개별 저장소 |
| 코드 공유 | 매우 쉬움 (단순히 파일 경로로 참조) | 별도의 패키지로 만들어 배포/설치해야 함 |
| 의존성 관리 | 단일 버전으로 관리 용이 | 각 프로젝트가 다른 버전을 가질 수 있어 충돌 가능 |
| 변경 작업 | 여러 프로젝트에 걸친 변경을 한번에 커밋 가능 | 여러 저장소에 각각 커밋 및 PR 필요 |
| 빌드/배포 | 설정이 복잡할 수 있음 (특정 프로젝트만 빌드해야 함) | 프로젝트별로 빌드/배포가 명확하고 독립적임 |
| 팀 자율성 | 코드 표준화 및 일관성 유지에 유리 | 각 팀이 독립적으로 기술 스택이나 라이브러리 선택 가능 |
| 저장소 크기 | 프로젝트가 많아질수록 저장소 크기가 커짐 | 저장소 크기가 작고 가벼움 |
언제 모노레포를 쓰는 게 좋을까?
모노레포는 여러 프로젝트가 서로 긴밀하게 연결되어 있고, 코드 공유가 많을 때 매우 강력한 힘을 발휘한다. 특히 풀스택 프로젝트나 마이크로서비스 아키텍처(MSA)의 초기 단계에서 팀 전체의 생산성을 높이는 데 효과적이다.
반면, 프로젝트들이 완전히 독립적이거나 팀별로 자율성을 극대화하고 싶을 때는 폴리레포 방식이 더 적합할 수 있다.
지금 진행하는 풀스택 프로젝트처럼 프론트엔드와 백엔드가 긴밀하게 소통해야 하는 경우, 모노레포가 아주 적합하다.