노트

모노레포

Monorepo

인프라#tooling#architecture · 연결된 개념 13개

쉽게 말하면

모노레포는 여러 가게가 한 건물에 입점한 쇼핑몰 같아요. 가게(앱)는 따로 장사하지만 공용 시설(공통 패키지)을 같이 쓰고, 여러 가게에 걸친 공사도 한 번에 끝낼 수 있어요.

비유가 깨지는 곳 건물이 커질수록 관리비도 커져요. 클론, 설치, 빌드, CI가 느려지고 프로젝트별 권한을 나누기 어려워서, 바뀐 부분만 빌드하고 결과를 캐시하는 Turborepo나 Nx를 얹게 돼요.

모노레포는 여러 프로젝트·패키지를 하나의 저장소에 폴더로 나눠 함께 관리하는 방식이다. 프로젝트마다 저장소를 따로 두는 방식은 멀티레포(폴리레포)라고 부른다. 모노레포가 곧 하나의 거대한 앱(모놀리스, monolith)이라는 뜻은 아니다. 배포 단위는 여전히 따로일 수 있다.

repo/
├── apps/
│   ├── web/
│   └── admin/
├── packages/
│   ├── ui/        공통 컴포넌트
│   └── utils/
└── package.json   워크스페이스 루트

얻는 것

  • 코드 공유: 공통 UI·유틸·타입을 패키지로 두고 여러 앱이 쓴다. 고치면 모든 사용처에 바로 반영된다
  • 원자적 변경(atomic change): "API 타입과 그걸 쓰는 화면을 같이 고치는" 작업을 커밋·PR 하나로 끝낸다
  • 일관된 도구: 린터·포맷터·테스트·CI 설정을 한 번 맞추면 전체에 적용된다

내는 것 (monorepo tax)

  • 저장소가 커질수록 클론·설치·빌드·CI가 느려진다
  • 프로젝트별 권한을 세밀하게 나누기 어렵다
  • 한 패키지 변경이 어디에 영향을 주는지 알아야 해서 의존성 그래프(dependency graph) 관리가 필요하다

도구

  • 패키지 매니저의 워크스페이스(workspace)로 시작한다(pnpm 워크스페이스, npm과 pnpm)
  • 빌드가 느려지면 바뀐 부분만 빌드하고 결과를 캐시하는 도구를 얹는다: 가볍게는 Turborepo, 코드 생성·아키텍처 규칙·다중 언어까지 필요하면 Nx
  • 기존 저장소를 히스토리째 옮기는 방법은 여러 저장소 합치기

공통 코드를 쉽게 공유할 수 있는 만큼, 패키지 사이의 경계가 흐려지지 않게 결합도를 의식해야 한다. 런타임 아키텍처인 마이크로 프론트엔드와는 별개라 함께 쓸 수 있다. 배럴 파일(barrel file)로 패키지 공개 API를 정리하는 습관은 배럴 파일과 re-export을 본다.

출처: monorepo.tools: What is a monorepo? · Why a monorepo?

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

  • 필요 낭비 (Type 1 무다)

    부가가치를 만들지는 않지만 지금은 없앨 수 없는 일. 도요타 생산 방식(Toyota Production System)에서 나온 린(Lean) 사고는 활동을 부가가치 활동(Value-Added), 순수 낭비(Type 2 무다), 필요 낭비(Type 1 무다)로 나눈다. 소프트웨어 개발에서는 프로덕션 코드를 쓰는 일을 빼면 대부분이 둘 중 하나의 낭비다.

  • 리팩터링 기법 카탈로그

    리팩터링 기법을 무엇을 정리하는지에 따라 묶어 본 지도. 기법마다 거의 항상 반대 방향 기법이 짝으로 있어서(추출↔인라인, 올리기↔내리기) 상황에 따라 양쪽으로 오간다. 아래 묶음은 Refactoring.Guru 카탈로그(1판 기반)의 분류를 따랐고, 기법 이름은 2판 기준으로 적었다.

  • GitOps

    GitOps는 "환경이 어떤 상태여야 하는가"를 전부 git 저장소에 선언해 두고, git에 적힌 것을 유일한 진실(single source of truth)로 삼아 실제 환경을 맞추는 운영 방식이다. 서버에 직접 손대지 않고, 바꾸고 싶으면 git을 고친다.

  • 정리(Tidying)

    동작을 바꾸지 않는 아주 작은 구조 변경. 켄트 벡은 리팩터링이라는 말이 "기능 개발 중간의 긴 공사"처럼 쓰이며 동작 보존 원칙이 흐려지자, 더 작고 겁나지 않는 단위를 정리라는 이름으로 따로 불렀다. refactoring의 부분집합이다.

보기 옵션