utils

모노레포(Monorepo)

모노레포란 Monolithic Repository의 줄임말로 여러 프로젝트를 단일 저장소에서 관리하는 방법을 말합니다. 싱글레포와 멀티레포들에 대해 알아보고 모노레포를 장단점에 대해 정리해 보려합니다.

싱글 레포지토리

싱글 레포지토리는 보통 GitHub Repository 하나에 프로젝트가 하니씩 있는 경우를 의미합니다. 싱글 레포지토리를 통해서 프로젝트를 생성한다고 해보면 레포지토리의 구성은 소스 코드(js, ts, css 등), 정적 파일(png, assets 등), 프로젝트 설정(package.json 등)이 모두 포함되어 있습니다. 또한 npm install과 같은 명령어로 외부 라이브러리(node_module)들도 외부 저장소(Npm, github)를 통해 다운받아 사용 할 수 있습니다. 이러한 하나의 레파지토리만 가지고 App을 만들거나 NPM Package를 만드는 것을 싱글 레포지토리라고 합니다.

멀티 레포지토리(Multirepo = Polyrepo)

멀티 레포지토리는 여러개의 싱글 레포지토리를 사용하는 것을 의미합니다. 사실 이러한 의미가 싱글 레포지토리 처럼 보일 수도 있습니다. 하지만 멀티 레포지토리라고 불리는 이유는 각각의 싱글 레포지토리들이 유기적으로 함께 개발되는 경우를 멀티 레포지토리라고 합니다. 모노레포와 멀티레포를 비교해 보면, 모듈로 나누어 연관을 짓는 개념에서는 동일하다고 할 수 있습니다. 차이점은 하나의 레포에서 관리를 하는 것이 모노레포이고, 모듈마다 각각의 레포를 가진다면 멀티레포라고 할 수 있습니다.

모노 레포지토리(Monorepo)

모노레포는 잘 정의된 관계를 가진 여러 개의 개별 프로젝트가 포함된 단일 리포지토리입니다. 모노 레포지토리는 싱글 레포지토리 처럼 하나의 레파지토리를 사용합니다. 하나의 레피지토리 내부에서 싱글 레포지토리(App이나 NPM Package)가 여러개 들어있는 형태로 이루어집니다. 이러한 싱글 레포지토리를 프로젝트 패키지나 워크스페이스라고 합니다. 모노레포 개발 시 내부의 워크스페이스들이 독립적으로 개발된다면, 이는 모노 레포지토리라고 할 수 없습니다.

외부 라이브러리는 독립적인 라이브러리입니다. 멀티 레포지토리에서의 패키지들의 관계는 함께 개발되면서 유기적으로 연결되어 있는 것이라고 할 수 있습니다. 만약 독립적으로 쓰는 패키지로 개발되고 있다면, 이것은 멀티 레포지토리가 아니라 싱글 레포지토리 여러개를 개발하고 있는 것이라고 할 수 있습니다. 모노 레포지토리에서는 하나의 레포지토리에서 여러개의 워크스페이스를 가지고 유기적인 관계를 가집니다. 이 때 여러 워크스페이스들의 root에서 package.json이 존재하여 외부 라이브러리도 가지게 됩니다.

Monorepo 특징

Root 프로젝트에 Package.json이 존재하고, 내부에 여러개의 워크스페이스가 존재합니다. 이때 Root 프로젝트는 Application이나 라이브러리가 되지 않고 각각의 워크스페이스를 관리합니다. 이러한 워크스페이스틑 하나의 패키지 라고 부르거나 모듈이라고도 부릅니다. 각각의 워크스페이스에는 Application이 있고 Application들이 사용하는 패키지가 있습니다.

Root 프로젝트와 워크스페이스 프로젝트의 외부 의존성과 동작 방법이 패키지 매니저들 마다 다릅니다. 이러한 이유 때문에 패키지 관리자 선정이 중요하다고 할 수 있습니다. 규모가 커질 수록 패키지 간 의존성이 커지기 때문에 모노레포 빌드 시스템 도구를 사용할 필요성이 생기게 됩니다. 모노레포를 구성하는 구성요소들에 대해 알아보고, 실습을 진행해 봅시다.


reference