모노레포(Monorepo)란?

모노레포란?

Monorepo는 잘 정의된 관계를 가진 여러 개의 구별된 프로젝트를 포함하고 있는 하나의 저장소이다. 저장소에는 두 개 이상의 코드가 저장되어 있다.

처음에는 모노레포를 단순히 하나의 레포지토리 안에 여러 모듈이 들어있는 게 아닌가 생각해서 하나의 모듈을 쓰기 위해 전체 모듈을 불러와 사용하고 모든 의존성이 동일해야 하는 방식이 비효율적이지 않나 생각했었다. 하지만 모노레포는 단순히 하나의 레포지토리에 모든 것을 몰아넣는 방식이 아니라 프로젝트 세팅과 의존 모듈을 공통으로 편리하게 관리할 수 있으면서 사용할 때는 개별적으로 불러 쓸 수 있는 것이라고 한다.

멀티레포

멀티레포는 모노레포와 반대되는 개념으로 여러 개의 저장소를 가지는 것을 의미한다.

기존에 이렇게 여러 개의 레포지토리를 유지하는 멀티레포 방식을 선택한 것은 팀의 자율성 때문이라고 한다. 각 레포지토리에서 세팅을 자유롭게 하고 각 레포지토리에 기여하는 사람을 달리하기 위해서였다. 나도 새로운 프로젝트를 생성할 때는 보통 멀티레포 형태로 생성하곤 하는데, 그룹에서 생성할 때는 레포지토리별로 오너십을 분리하기 위한 목적도 있는 것 같다.

멀티레포의 단점

멀티레포 방식의 여러 단점으로는 아래와 같은 것들이 있다.

  • 새로운 프로젝트 생성 시마다 개발환경을 구축과 세팅을 해야해서 번거롭다.
  • 중복되는 코드나 모듈이 생길 수 있다.
  • 프로젝트 별로 설정과 명령어가 달라 개발자 경험의 일관성이 없어질 수 있다.

모노레포의 이점

모노레포 방식을 사용함으로써 얻는 이점으로는 다음과 같은 것들이 있다.

  • 간단하게 프로젝트를 생성할 수 있고 저장소를 생성, 개발환경 및 CI/CD 구축, 빌드 등 일련의 과정이 간편해진다.
  • 의존성을 필요에 따라 다르거나 같게 관리할 수 있다.

    • 하나의 레포지토리 안에 여러 개의 모듈을 몰아넣는 방식은 관리가 편리하지만 의존성을 별도로 관리할 수 없는데 모노레포를 사용하면 각각의 모듈이 다른 의존성을 가질 수 있다.
    • 멀티레포와 비교하면, 공통의 작업을 하는 경우에 여러 군데에 동일하게 적용해줘야 하는 번거로움이 있지만 모노레포는 명령 한 번으로 여러 개의 모듈에 동일한 작업을 할 수 있다.
  • 코드의 공유와 재사용이 용이하다.
  • 팀간의 협업이 용이하다.
  • 팀간의 경계와 오너십을 유연하게 할 수 있다.

모노레포 툴

모노레포를 구축하기 위해 사용할 수 있는 툴이 여러가지 있는데 다음과 같은 것들이 있다.

  • Yarn Workspace, Bit, Nx, Rush, Lerna, Bazel, Buck

마치며

새로운 프로젝트를 생성할 때의 번거로움을 해결하기 위해서나 일관성 있는 개발자 경험을 위해서는 공통 템플릿을 사용하는 것으로도 해결할 수 있을 것 같다. 하지만 한 곳에서 버저닝을 하고 코드의 공유와 재사용, 수정이 용이한 점 등이 모노레포 방식의 큰 장점인 것 같다. 다음엔 모노레포를 직접 구축해보고 싶다.


Written by@jaeeun
I explain with words and code. I explain with words and code. I explain with words and code.