
TL;DR
Front에 재사용 컴포넌트가 많이 생기는 경우, 컨벤션이 난잡해지는 경우
Front와 Back의 타입을 공유하려는 경우 MonoRepo는 유용하다. Pnpm이 도입도 쉽고 성능도 준수하다.
MonoRepo란?

Project 여러개를 하나의 버전관리 시스템으로 관리하는 것이다.
프로젝트 각각 snap-shot이 남는지,
프로젝트의 뭉치단위로 snap-shot이 남는지의 차이다.
프로젝트가 3개 Repo로 나누어져 있는데, 합치면 MonoRepo인가요?
내 책상의 서랍장 처럼,
하나의 시스템에 우겨넣는다고 MonoRepo가 되지는 않는다.

하나의 시스템에 여러개의 프로젝트를 넣으면 마법이 일어나는게 아니다.
그렇게 했을 때, 이득을 보는 시나리오가 존재하기 때문에 사용하는 것이다.
여러 프로젝트를 뭉쳤을 때, 어떤 이점을 기대할 수 있을까?
- 프로젝트의 컨벤션을 하나로 통일시킬 수 있다.
- MultiRepo의 구조에서 중복이 발생하는 경우, DRY하게 개발할 수 있다.

장점은 하나에 뭉쳐져있다는 점이다.
단점도 하나에 뭉쳐져 있다는 점이다.
뭉쳐져 있어서 관리가 편해지고, 재사용성이 올라간다.
뭉쳐져 있어서, 다른 코드를 쉽게 변경해버리거나 Repo가 너무 무거워 질 수 있다.
(글의 끝에 Toss에서 해결한 방식에 대한 아티클을 읽어보면 좋다.)
역시나 은 탄환은 존재 하지 않으며, 적정 기술만이 존재한다.
우리가 MonoRepo를 도입하는 이유
- Front와 Back 둘 다 TS를 사용한다. 타입 공유를 통해서 Front의 생산성을 올릴 수 있다.
- Front나 Back에 일시적으로 인력이 부족할 때, 인력을 유동적으로 활용할 수 있다.
- util함수를 공유하여 DRY하게 개발할 수 있다.
우리 팀은 소규모이다.
높은 동기화라는 장점을 가지며, 일손 부족이라는 단점을 가진다.
높은 동기화를 활용하여 일손 부족을 해결하기 위해서는,
단일 언어기반 MonoRepo를 가져가는게 유리하다고 판단했다.
나는 이전까지 Fast-API & Spring으로 개발해왔지만,
지금은 NestJS를 공부하면서 사용하고 있다.
(팀을 위해서는 이게 맞다고 생각한다. 나보다 팀이 중요하다.)
pnpm과 함께하는 MonoRepo
npm, yarn, pnpm, lerna, nx, turboRepo 등등.. 방법은 상당히 많다.
pnpm을 이미 사용하고 있고, 모노레포를 충분히 지원하기 때문에 이를 사용한다.
PNPM: Fast & efficient 패키지 관리자
TL;DRhard-link 기반의 효율적인 의존성 관리 툴이다.빠른 속도, 적은 용량을 사용하는 패키지 관리자이며 MonoRepo에 유용하다. Pnpm (Performant npm)공식문서의 Motivation 항목이다.아래의 그림으로 Pnpm의
tagite.tistory.com
다음과 같이 workspace.yaml을 이용해서 분리할 수 있다.
//pnpm-workspace.yaml
packages:
- apps/*
- libs/*
onlyBuiltDependencies:
- '@biomejs/biome'
- '@nestjs/core'
- '@scarf/scarf'
- '@swc/core'
- esbuild
- sqlite3
filter로 특정 폴더에 명령을 할 수 있다.
-w로 workspace에 명령을 할 수 있다.
프로젝트별로 package.json에 맞게 스크립트를 구성하고,
work-space에서 이들을 조합한 스크립트를 구성하면 편하다.
// package.json
"start:client": "pnpm --filter client dev",
"start:server": "pnpm --filter server start:dev",
"start": "pnpm run start:client & pnpm run start:server",
"add": "pnpm add -w",
"remove": "pnpm remove -w",
"add:server": "pnpm add --filter server",
"remove:server": "pnpm remove --filter server",
"add:client": "pnpm add --filter client",
"remove:client": "pnpm remove --filter client",
참고 아티클
Dev: MonoRepo 개념 알아보기
여러 프로젝트를 한 레포지토리에서 관리하는 MonoRepo의 개념과 그 장단점에 대해 알아보자
medium.com
200여개 서비스 모노레포의 파이프라인 최적화
토스 프론트엔드 챕터에서는 하나의 모노레포에서 200여개가 넘는 서비스를 관리하고 있어요. 이렇게 커진 모노레포에서도 git push 부터 배포까지 5분을 유지할 수 있는 비결을 소개합니다!
toss.tech
장난감 모노레포 삽질기 - 1. 초기 세팅하기
pnpm workspace로 장난감 모노레포를 세팅해보자.
witch.work
'프로젝트 > 1. EggERP' 카테고리의 다른 글
DX를 위한 API 전략 (0) | 2025.03.30 |
---|---|
실용주의 Agile 도입기 (0) | 2025.03.06 |