Croot Blog

Home About Tech Hobby Archive

모노레포 구축

개념

정의

하나의 대규모 저장소(repository)에 여러 프로젝트나 애플리케이션의 코드를 포함하는 소프트웨어 개발 방식

개념도

0Untitled.png

모노리틱 아키텍처, 멀티 레포, 모노 레포 비교 표

특징/속성 모노리틱 아키텍처 멀티 레포지토리 모노 레포지토리
개념적 일관성 높음 낮음 높음
코드 공유 및 재사용 용이 어려움 용이
빌드 및 배포 통합 용이 어려움 용이
프로젝트 간 의존성 관리 용이 어려움 용이
통합된 버전 관리 용이 어려움 용이
협업과 통합 테스트 편리 어려움 편리
유연성 낮음    
(하나의 기술 스택) 높음    
(다양한 기술 스택 사용 가능) 높음    
(다양한 기술 스택 사용 가능)      
큰 프로젝트에서 관리 용이성 어려움 (커다란 코드베이스 관리 어려움) 어려움 (다수의 저장소 관리 어려움) 편리
도구 및 자동화 지원 풍부한 지원 일부 도구들은 멀티레포注意 일부 도구들은 모노레포지토리에 적합함

도구

모노레포 구현을 위한 도구로는 대표적으로 Lerna, Turberepo, Nx 와 같은 것들이 있다.

Lerna

특징:

- 주로 JavaScript 프로젝트의 모노레포를 관리하기 위한 도구.
- 프로젝트를 패키지로 분리하고, 각 패키지를 개별적으로 관리할 수 있도록 지원.
- 패키지 간 의존성 관리 및 공통된 빌드 및 배포 프로세스를 제공.

장점:

- 간단하고 가볍다.
- 기본적인 모노레포 요구 사항을 충족시킬 수 있다.

단점:

- 일부 복잡한 멀티레포 요구 사항에는 한계가 있을 수 있다.

Turborepo

특징:

- Bazel 빌드 시스템을 기반으로 한 고성능 모노레포 도구.
- 대규모 프로젝트 및 고성능 빌드에 최적화되어 있음.
- 다양한 언어 및 플랫폼에서 사용 가능.

장점:

- 높은 성능과 확장성을 제공.
- 복잡한 모노레포 환경에서 효과적으로 작동.

단점:

- 학습 곡선이 다소 가파르다.
- 설정 및 구성이 다른 도구에 비해 더 복잡할 수 있다.

Nx

특징:

- Angular용으로 시작된 오픈 소스 도구. 이제는 Angular 이외의 프로젝트도 지원.
- 모노레포를 구성하고, 코드의 일관성을 유지하며, 빌드 및 테스트를 효율적으로 수행.
- 코드 생성, 의존성 분석, 테스트 등을 위한 **`풍부한 기능`** 제공.

장점:

- Angular 프로젝트와 관련된 개발에 특히 적합.
- 개발자 경험을 향상시키기 위한 다양한 도구와 플러그인을 제공.

단점:

- Angular 이외의 프로젝트에 대한 지원이 덜 강조될 수 있음.

구현 예시

설치

# 프로젝트 폴더 생성
mkdir lerna-sample
cd lerna-sample

# lerna 설치 및 실행
npx lerna init -i

설정

// lerna.json 수정
{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "version": "independent",
  "packages": [
    "packages/*"
  ],
  "npmClient": "yarn"
}

version: "independent"

- 패키지 배포와 관련된 버전을 패키지별로 독립적으로 가져가기 위한 설정

`npmClient: "yarn"`

- `npm` 대신에 `yarn`을 사용하기 위해 선언

패키지 추가

**lerna create** **<패키지명>**

의존성 설치

# 공통 의존성 설치
**yarn add <모듈명>**

# 개별 의존성 설치
**yarn workspace <모듈명> add <패키지명>**

실제 사용 사례 예시를 쓰고 싶은데 너무나 시간이 부족하다 🫠