MonoRepo
는 Monolithic Repositories
의 약자로, 하나의 리포지토리에서 여러개의 프로젝트가 구성된 것을 의미합니다.
일반적으로는 보통 하나의 리포지토리 안에 하나의 프로젝트가 들어있는 것이 일반적입니다. 이러한 일반적인 형태의 프로젝트 구성을 Multi-repo
, PolyRepo
라고 합니다.
MonoRepo
를 사용하는 이유는 여러가지가 있습니다. 물론 장점만 있는것은 아니기에 프로젝트의 목적 및 환경 등 여러가지 조건을 고려해서 결정하면 좋을것 같습니다.
하나의 리포지토리가 여러개의 프로젝트를 포함하고 있는것은 큰 편의성을 가집니다. 코드를 짜는 입장에서도 IDE를 열거나, IDE에서 프로젝트를 스위치해가며 개발할 필요없이 하나의 IDE에서 하위폴더로 구분된 여러 패키지들이 코드를 작성할 수 있습니다.
A, B, C, D
패키지로 구성된 MonoRepo
가 있고, 여러 프로젝트들이 공통으로 사용해야 하는 로직이 있을때, 이를 쉽게 추가적인 E
패키지로 분리하고, A~D
패키지에서 import
하여 사용할 수 있습니다.
A, B, C, D
패키지 모두 node 16.1.0
버전을 사용한다고 가정하면, 각각의 패키지에서 node를 설치할 필요 없이, root path에만 node 를 설치하고 A~D
에서 끌어다 쓸 수 있습니다.
특정 패키지가 특정 버전의 모듈을 필요로 하는 경우, 다른 버전의 모듈을 사용하는 패키지와 Dependency 충돌이 발생할 수 있습니다.
여러 프로젝트를 하나의 리포지토리에서 관리하기 때문에 오히려 관리가 어려워 질 수 있습니다.
MonoRepo
로 관리하는 패키지가 많지 않을 경우에는 해당되지 않지만, 관리하는 패키지가 증가함에 따라 오히려 가독성이나 여러가지 측면에서 비효율적이게 될 수 있습니다.
MonoRepo
로 포함되는 모든 프로젝트를 사용한다면 상관없지만, 그 중 일부만 필요한 경우에도 node_module 설치가 이루어 져야 합니다.
MonoRepo
를 구성하는 방법은 아래와 같이 여러가지 방법이 있습니다.
node package manager
중에 하나인 yarn
에서는 workspace 기능을 통해서 MonoRepo
를 가능하게 해 줍니다.
Lerna
는 node module로, yarn
의 workspace와 같은 역할을 합니다. MonoRepo
를 가능하게 해주는 기능을 제공함과 동시에, 설치된 의존성을 제거해주는 clean
기능이나, MonoRepo
로 구성한 package를 npm 배포할 수 있는 기능들을 제공합니다.
yarn
의 workspace 기능을 통해서 MonoRepo
를 구성하는 방식은 아주 간단합니다.
yarn init
위 커맨드를 통해서 Project를 초기화 하고, package.json
에 아래와 같이 private
과 workspaces
Property를 설정하면 됩니다.
// package.json
{
...
"private": true,
"workspaces": [
"packages/*"
],
...
}
위 방식대로 설정을 마치고, 패키지를 구성한 뒤 의존성을 설치하게 되면, 패키지 각각의 패키지에서 요구하는 모듈의 버전을 확인하여 공통되는 부분은 root의 node_modules
폴더 안에 설치를 하고 symlink를 통해 각각의 패키지로 연결하여 사용하면 됩니다.