Skip to content

모노레포와 터보레포란?

Sunny edited this page Dec 3, 2024 · 3 revisions

1️⃣ 모노레포란?

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

멀티레포 등장 배경

  • 모놀리식 애플리케이션의 한계를 느낌
    • 모놀리식 애플리케이션 : 모듈화 없이 설계된 소프트웨어
  • 모듈화 프로그래밍 진행
    • 재사용성 증가
  • 모듈을 다른 애플리케이션에서도 사용되길 원함
    • 멀티레포 등장

멀티레포 문제

  • 번거로운 프로젝트 생성
    • 새로운 패키지가 개발될때마다 저장소 파고, 환경 구축하고, CICD하고…
  • 관리 포인트 증가
  • 패키지 중복 코드 가능성
  • 일관성 없는 개발자 경험
    • 패키지별로 다른 명령어 쓰고 그래서
  • 다른 패키지의 변경 사항 파악을 계속 해야함

그렇다면 모듈을 적절히 분리하여 관심분리도 하면서, 분리된 모듈을 쉽게 관리하고 참조하고 테스트 빌드 배포과정도 한번에 할 수 있는것은? 💡 모노레포 💡

image

모노레포가 해결하는 멀티레포의 문제

  • 더 쉬운 프로젝트 생성
    • 저장소 생성 > 커미터 추가 > 개발환경 구축 > CI/CD 구축 > 빌드 > 패키지 저장소에 publish
  • 더 쉬운 의존성 관리
  • 관리 포인트가 단 하나
  • 일관된 개발자 경험 제공

2️⃣ 모노레포의 Workspace (with pnpm)

  • pnpm의 Workspace는 여러 개의 패키지를 하나의 모노레포에서 관리할 수 있게 해주는 기능

Workspace의 주요 기능

1. 단일 레포지토리에서 여러 패키지 관리

  • 모노레포 구조를 통해 여러 프로젝트나 라이브러리를 하나의 레포지토리에서 관리할 수 있음

2. 의존성 공유

  • 공통으로 사용되는 의존성들을 Root의 node_modules에 설치하여, 모든 패키지에서 이를 사용하여 중복 설치를 줄이고 디스크 공간을 절약

3. 로컬 패키지 간 의존성 관리

  • Workspace 내의 다른 패키지를 의존성을 추가할 때, 해당 패키지를 다운로드하지 않고 로컬 파일 시스템을 통해 해당 패키지를 참조
  • 예를 들어, package-b에서 package-a를 의존성으로 추가하는 경우,package-b는 package-a의 최신 버전을 로컬에서 직접 참조하게 되며, 코드 변경 사항이 즉시 반영

3️⃣ 그럼, 터보레포란?

Vercel에서 만든 JavaScript/TypeScript 모노레포를 위한 빌드 시스템
빠른 증분 빌드를 지원하는 스마트한 빌드 시스템

터보레포의 주요 기능

캐싱

  • 로컬과 원격에서 빌드 캐시를 저장하고 재사용
  • 이전에 실행된 태스크의 결과물을 캐시하여 불필요한 재빌드를 방지
  • 캐시된 결과물은 팀원들 간에 공유 가능

병렬 실행

  • 태스크들의 의존성 그래프를 분석하여 최대한 병렬적으로 실행
  • CPU 코어를 최대한 활용하여 빌드 시간 단축
  • 패키지 간 의존성을 고려한 스마트한 스케줄링

파이프라인 설정

  • turbo.json에서 태스크 간의 의존성을 선언적으로 정의
  • 입/출력 파일을 명시하여 캐싱 효율성 극대화
  • 태스크 간의 의존성을 기반으로 실행 순서 최적화

프루닝(Pruning)

  • 변경된 패키지와 그에 영향받는 패키지만 선택적으로 빌드
  • turbo prune 명령어로 필요한 패키지만 추출하여 새로운 워크스페이스 생성 가능

4️⃣ 모노레포와 터보레포의 관계

터보레포는 모노레포를 더 효율적으로 관리하기 위한 빌드 시스템
모노레포의 단점을 보완하고 장점을 극대화하는 도구

터보레포가 해결하는 모노레포의 문제점

1. 빌드 속도 문제

  • 모노레포의 규모가 커질수록 빌드 시간이 길어지는 문제
  • 터보레포의 캐싱과 병렬 실행으로 빌드 시간 대폭 감소
  • 변경된 패키지만 선택적으로 빌드하여 효율성 증가

2. 의존성 관리의 복잡성

  • 패키지 간 의존성이 많아질수록 관리가 어려워지는 문제
  • 터보레포의 파이프라인 설정으로 의존성 관계를 명확하게 정의
  • 의존성 그래프 기반의 스마트한 빌드 순서 결정

3. 팀 협업의 어려움

  • 여러 팀원이 동시에 작업할 때 발생하는 충돌과 동기화 문제
  • 터보레포의 원격 캐싱으로 팀원 간 빌드 결과물 공유
  • CI/CD 파이프라인 최적화로 배포 프로세스 개선

참고자료

우리는 하나다! 모노레포 with pnpm #우아콘2022 #Day2_음식그이상의것을문앞으로

모던 프론트엔드 프로젝트 구성 기법 - 모노레포 개념 편

Pnpm으로 Monorepo 구축하기 - 2. 프로젝트 구축(Vite, React, TypeScript)

[NestJS] PNPM으로 NestJS에서 모노레포 구축하기

https://github.com/sitek94/pnpm-monorepo

👥 팀 강점

🧑‍💻 개발 일지

📌 ALL

📌 FE

📌 BE

💥 트러블 슈팅

📌 FE

📌 BE

🤔 고민

📚 학습 정리

📌 김광현

📌 백지연

📌 전희선

📌 한승헌

🤝 회의록

🗒️ 데일리 스크럼

💬 팀 회고


👨‍👩‍👧‍👦 소개

🌱 문화

🔨 기술 스택

⚙️ 서비스 아키텍쳐

🚧 CI/CD

🌊 Flow

💭 6주를 보내면서

Clone this wiki locally