모노레포란?
모노레포(MonoRepo)
는 Monolithic Repositories
의 약자로, 하나의 레포지토리에서 여러 개의 프로젝트가 구성된 것을 의미한다.
보통 하나의 레포지토리 안에 하나의 프로젝트가 들어가있는 것이 일반적인데, 이러한 일반적인 형태의 프로젝트 구성을 Multi-repo
, PolyRepo
라고 한다.
모노레포를 사용하는 이유
모노레포를 사용하는 이유는 무엇보다 컴포넌트의 공통화
를 위해 많이 사용할 것이다.
일반적으로 디자인시스템을 기반으로 공통 컴포넌트들이 도출될텐데 이는 보통 여러 프로젝트(코어 프로젝트, CMS, ADMIN 등)에서 공통적으로 사용될 것이다.
이를 프로젝트마다 별도로 관리하는 것은 매우 개발 생산성이 저할 될 것이다. 단순하게 생각해봐도 공통 컴포넌트들이 수정되었을때 여러 프로젝트를 하나씩 다 대응해주는 것은 매우 비효율적인 방법일 것이다.
모노레포로 구성시의 장단점
Monorepo
를 사용하는 이유는 여러가지가 있다. 물론 장점만 있는 것은 아니기에 프로젝트의 목적 및 환경 등 여러가지 조건을 고려해서 결정하면 좋을 것이다.
장점
1) 하나의 레포지토리로 여러 개의 프로젝트 관리
코드를 짜는 입장에서 IDE에서 프로젝트를 스위치해가며 개발할 필요없이 하나의 IDE에서 하위 폴더로 구분된 여러 패키지들에 코드를 작성할 수 있다.(개발 편의성 증가)
2) 중첩 코드의 공통화
A, B, C, D
패키지로 구성된 MonoRepo
가 있고, 여러 프로젝트들이 공통으로 사용해야 하는 로직이 있을때, 이를 쉽게 추가적인 E
패키지로 분리하고, A~D
패키지에서 import
하여 사용할 수 있습니다.
3) 중첩되는 모듈은 하나만 설치해서 사용
A, B, C, D 패키지 모두 typescript 4.6.3 버전을 사용한다고 가정하면, 각각의 패키지에서 typescript를 설치할 필요 없이, root path에만 typescript 를 설치하고 A~D 에서 끌어다 쓸 수 있다.
단점
1) 버전 관리가 상당히 힘들어진다.
여러 프로젝트의 개발자들이 동시에 하나의 master, develop branch 를 향해 개발하고 있으므로 버전 관리가 좀 더 힘들어지게 된다.(아예 못하는건 아니겠지만 일반적으로 더 노고가 들 것이다)
2) repository 크기가 크기 때문에 repo기반으로 동작하는 도구(CI)들의 속도가 느려진다.
하지만 패키지별로 배포를 할 경우엔 큰 영향력이 없을 것이라 생각된다.
모노레포를 구성하는 여러가지 방법
Monorepo
를 구성하는 방법은 아래와 같이 여러가지 방법이 있다.
1) yarn workspace
패키지 관리 도구 중의 하나인 yarn
에서는 workspace
기능을 통해 MonoRepo
를 가능하게 한다.
2) Lerna
Lerna
는 node_modules
로, yarn
의 worksapce와 같은 역할을 한다. MonoRepo
를 가능하게 해주는 기능을 제공함과 동시에, 설치된 의존성을 제거해주는 clean
기능이나, MonoRepo
로 구성한 package를 npm 배포할 수 잇는 기능들을 제공한다.
Note: 이외에
Git-repo
,Git submodule
등이 있다.