모노레포(monorepo)도입에 대한 고민(1)

권준혁·2022년 7월 10일

monorepo

목록 보기
2/2

모노레포란?

버전 관리 시스템에서 두 개 이상의 프로젝트 코드가 동일한 저장소에 저장되는 소프트웨어 개발 전략

1. 배경

Monolith Application란 고전적인 소프트웨어 개발방식으로서 모듈화 없이 소프트웨어를 개발합니다.

1-1. 모듈화를 하지 않았을 때 발생하는 문제 (monolith)

  • 코드들이 직접적으로 의존한다.
  • 관심분리가 안돼 유지보수가 어렵다.
  • 작은 작업에서도 매번 거대한 코드를 관리해야한다.

따라서 많은 비효율과 제약이 발생하게 됩니다.

1-2. 모듈화 (modular)

  • 전체를 교체하거나 관리할 필요없이 필요한 부분만 수정,관리할 수 있다.
  • 핵심은 재사용성!

모듈화를 사용하지 않는 애플리케이션은 특수한 경우를 제외하곤 거의 없습니다. 자바스크립트에서도 import문, require문으로 모듈시스템을 지원하고 있습니다..
모듈화된 코드들은 일반적으로 재사용성을 고려해 작성하게 되는데,
위 사진에서 i18n모듈의 useKorean()을 다른 Application에서 사용하고 싶을 때를 예로 들 수 있습니다.

1-3. 멀티레포,폴리레포 (multirepo,polyrepo)

1-2 모듈화에서 그림처럼 각 모듈들이 고유한 저장소를 갖는 구조입니다.

각 모듈이 고유한 저장소를 가지기 때문에 자율성이 높고 배포,테스트,빌드같은 독립적인 개발과정이 가능합니다.
멀티레포 환경에서 자율성이 높다는 것이 장점인 이유는 각 팀원의 개발과정이 다른 팀원에게 영향을 미치지않기 때문입니다.
현재 대부분의 애플리케이션을 개발하는 표준적인 방법이기도 합니다.

이렇게 Google, Microsoft, Facebook, Stripe 같은 회사들이 Monorepo방식을 채택하는 이유, 그리고 Polyrepo의 단점은 무엇일까요?
방금 전 장점으로 밝혔던 자율성의 이면이 있기 때문인데, 자율성이 곧 고립을 발생시키기 때문입니다.
각 팀원의 개발과정이 다른 팀원에게 영향을 미치지 않는다는 장점(자율성)이 있으면서도 완전히 독립적이기 때문에 고립이 발생합니다.

  • 폴리레포 환경에서 공유하고싶은 모듈이 있을 때
  • 독립적으로 관리되는 모듈레포에서 코드중복 발생 (라이브러리관리 포함)
  • 각 레포에서 라이브러리 관리가 힘들다.
  • 각 레포는 building, testing, serving, linting, deploying같은 명령을 위해사용 하는 명령집합의 통합에서 발생하는 mental overhead

1-4. 모노레포 (monorepo)

1-3. 폴리레포 에서 발생하는 문제들을 모노레포가 해결해줄 수 있습니다.

  • 새로운 프로젝트 생성에 부담이 없다.
  • 의존 패키지가 같은 저장소에 있어 관리가 용이하다.
  • 하나의 레포이기 때문에 공통모듈을 관리하기가 용이
  • 개발환경에서 다양한 도구들을 일관되게 구축할 수 있어 편하고, 한번에 업데이트도 가능 (extension, lint 등)

단순히 여러개의 프로젝트가 하나의 저장소를 사용한다고해서 momorepo라고 부르긴 어렵습니다.


2. 모노레포에서 고려해야할 측면

출처
https://monorepo.tools/#monorepo-features
https://d2.naver.com/helloworld/0923884#ch1

1. 관리 측면

  • 코드 공유: 서로 다른 프로젝트 간에 쉽게 소스 코드를 공유
  • 일관성 있는 도구: 서로 다른 프로젝트들(심지어 서로 다른 프레임워크를 사용하더라도)에서 일관된 개발 경험을 제공
  • 스케폴딩: 새로운 프로젝트를 생성할 때 초기 코드를 쉽게 생성
  • 프로젝트 제약 및 가시성(visibility): 저장소 내에서 의존 관계를 제한하는 규칙 정의 지원. 예를 들어, 일부 프로젝트를 팀 전용으로 표시하거나 특정 프레임워크을 사용 중임을 기술.

2. 속도 측면

  • 로컬 캐싱: 같은 머신에서 같은 것을 두 번 빌드하거나 테스트하지 않음
  • 분산 캐싱: 다양한 환경에서 캐시 아티팩트를 공유. 즉, 조직 단위로 여러 CI 환경에 걸쳐 같은 것을 두 번 빌드, 테스트하지 않음
  • 로컬 작업 오케스트레이션: 빌드 및 테스트 등의 작업을 순서에 맞게 병렬로 실행
  • 분산 작업 실행: 단일 시스템에서 실행되어 여러 시스템에 명령을 전달
  • 변화에 영향을 받는 프로젝트 감지: 변경의 영향을 받을 수 있는 항목을 결정하여 영향을 받는 프로젝트만 빌드/테스트

3. 구조 파악 측면

  • 워크스페이스 분석: 추가 구성 없이 주어진 워크 스페이스의 의존성 관계를 분석
  • 의존성 그래프 시각화: 프로젝트 및 작업 간의 종속 관계를 시각화

작업권한 문제

Github에서는 CODEOWNERS로 폴더기반 소유권을 지정할 수 있습니다.

3. 모노레포 도구

https://2021.stateofjs.com/ko-KR/libraries/monorepo-tools/
다양한 모노레포 도구들을 .만족도, 관심도, 사용량, 인지도 별로 확인할 수 있습니다.
인지도가 10% 미만인 기술은 평가하지 않고 있습니다.

3-1. How happy are you with the state of monorepo tools?

3-2. Positive/Negative Split

사용 전/사용 후/긍정/부정 대해서 각각 볼 수 있습니다.

Naver D2 - 모노레포 개념편
Naver D2 - 모노레포 도구편
monorepo.tools

profile
웹 프론트엔드, RN앱 개발자입니다.

1개의 댓글

comment-user-thumbnail
2024년 3월 19일

당신은 항상 우리에게 가장 유용한 정보를 제공합니다. 항상 진심으로 감사하고 응원합니다.
https://slice-masters.io

답글 달기