728x90
반응형
SMALL

Monorepo에 대한 강의를 듣고 생소한 개념이라 블로그에 정리해두면 필요할때 볼 수 있어 블로그에 정리 해보려고한다.
Monorepo는 새로운 프로젝트를 설계하거나 기존 프로젝트가 성장하면서 규모가 커질 때 개발자는 효율적인 프로젝트 구조를 고민한다. 또한, Google, Facebook, Microsoft, Uber, Airbnb, 그리고 Twitter 등 글로벌 테크 회사들은 이미 각자 자신들의 운영 전략 아래 대규모 모노레포를 운영하고 있다.
목차
1. 모노레포를 배워야 하는 이유
2. Monorepo의 개념
3. 프로젝트 구성의 발전
4. 언제 모노레포를 사용해야 하는지?
5. 모노레포 구축을 도와주는 도구
1. 모노레포를 배워야 하는 이유
모노레포는 유지 보수와 최적화 작업을 간소화한다. 이는 모노레포가 코드 재사용, 버전 관리, 종속성 관리 등의 장점을 제공하기 때문이다. 한 곳에서 전체 코드를 관리하므로, 변경 사항을 쉽게 추적하고 반영할 수 있다. 예를 들면, 여러 프로젝트에서 공통으로 사용되는 UI 컴포넌트나 유틸리티 함수가 있을 때, 모노레포를 사용하면 이러한 코드들을 한곳에서 관리할 수 있어서, 한 번의 수정으로 모든 프로젝트에 반영될 수 있다. 이렇게 하면 코드의 일관성을 유지하면서 중복을 줄일 수 있다.
2. Monorepo의 개념
- 하나의 저장소(Repository)에서 여러개의 프로젝트를 관리하는 방식을 모노레포라고 한다. 즉, 독립된 여러 프로젝트를 관리한다.
3. 프로젝트 구성의 발전

- 프로젝트 구성은 모든 기능들을 담고 있는 모놀리식 애플리케이션에서 → 기능들을 분리하여 각각의 저장소에서 관리하는 멀티레포 → 하나의 저장소에서 여러개의 프로젝트를 관리하는 모노레포 형태로 발전하였다.
1) 모놀리식 애플리케이션 (Monolithic application)
- 모놀리식 애플리케이션은 모듈화 없이 모든 구성 요소가 한 프로젝트 안에 통합된 소프트웨어 애플리케이션이다.
장점
- 소수의 개발자가 빠르게 개발할 수 있음
단점
- 관심사 분리가 어려워서 설계, 리팩토링이 어려움
- 매번 거대한 프로젝트를 배포해야 함
- 일부분의 에러가 전체 서비스에 영향을 줄 수 있음
2) 멀티레포 (Multirepo)

- 멀티레포는 하나의 서비스는 하나의 repository에 관리하는 방식이다.
장점
- 다른 프로젝트와 의존성이 없고, 독립적으로 개발이 가능하다.
- 모듈화하여 관심사 분리가 쉬움
- 서로 각기 다른 버전의 라이브러리를 사용할 수 있음
단점
- 서로 독립적이기 때문에 개발, 테스트, 빌드 다 따로 존재한다.
- 각 프로젝트의 코드 컨벤션 통일이 어려움
- 코드 재사용성이 적기 때문에 중복 코드가 발생할 가능성이 높음
- 관리 포인트 증가한다.
3) 모노레포 (Monorepo)

- 하나의 저장소에 여러 프로젝트를 관리하는 구조이다. npm 배포 없이 프로젝트 사이의 코드 공유가 가능하다.
- yarn(workspace 패키지), lerna, turborepo, nx, npm, pnpm을 사용하면 node_modules를 하나로 사용할 수 있다.
장점
- 코드 재사용이 용이함
- NPM에 배포할 필요가 없어 의존성 관리가 쉬움
단점
- 관심사 분리가 어려워서 설계하거나 리팩토링 할 때 어려울 수 있음(과도한 의존 관계)
- CI 속도 저하 가능성이 있음
- 모든 project가 동일한 버전의 library사용하기 때문에 버전 업그레이드의 어려움이 있을 수 있음
- Package 규모가 커짐으로 인해 Build 속도가 느릴 수 밖에 없음
- 일부분 에러가 전체 서비스에 영향 줄 수도 있는 가능성이 있음
4) 서브모듈(Submodule)

- 서브모듈는 서브로 사용하는 모듈이다.
- Git 저장소 안에 다른 Git 저장소를 디렉터리로 분리해서 넣은 것이다.
- 두 프로젝트를 별개로 다루면서 그 중 하나를 다른 하나 안에서 사용할 수 있어야 하는 상황에서 사용한다.
4. 언제 모노레포를 사용해야 하는지?
- 유사한 서비스들을 만들 경우 한 서비스의 모바일 페이지, PC 페이지를 만들어야 할 경우 공통 기능들이 존재할 수 있기 때문에 모노레포로 구성하는 것이 좋다.
- 여러 프로젝트를 한 눈에 파악해야 할 경우 하나의 저장소에 여러 프로젝트를 구성할 수 있기 때문에 어떤 프로젝트들이 있는지 한 눈에 파악해야 할 때에도 모노레포를 사용하는 것이 좋다.
- 동일한 개발자 경험을 느껴야 할 경우 하나의 저장소에서 동일한 eslint, prettier를 설정하여 동일한 개발자 경험을 줄 수 있다.
5. 모노레포 구축을 도와주는 도구
- Yarn: React, React-router, Babel (Yarn Berry)
- Lerna + Yarn:
- Next.js, Babel (v7.12.12), Jest, Create React App, Storybook, Vue-cli, Nuxt.js, Webpack-cli , 모든 레퍼런스
- Turborepo: Next 13(+ Pnpm), 그 외 모든 레포 링크
- Nx: Storybook, FluentUI, NgRx
- Npm: Apollo-server
- Pnpm: Vue 3, 모든 레퍼런스
참고
728x90
반응형
LIST