프론트 개발자를 위한 여정

모든 영역을 안내하는 개발자

Frontend

터보레포와 모노레포: 개념, 목적, 그리고 장단점 비교

ji-frontdev 2024. 12. 28. 11:00
반응형

1. 터보레포와 모노레포란 무엇인가?

모노레포(Monorepo)

모노레포는 여러 프로젝트를 하나의 저장소(repository) 안에서 관리하는 소프트웨어 개발 방식입니다. 이 방식은 서로 관련된 코드베이스를 한곳에 모아 버전 관리를 일관되게 하고, 코드 공유를 쉽게 하며, 팀 간 협업을 강화하는 것을 목표로 합니다.

터보레포(TurboRepo)

터보레포는 모노레포를 효율적으로 관리할 수 있도록 도와주는 빌드 시스템입니다. 터보레포는 캐싱, 병렬 처리, 작업 스케줄링 등을 활용해 모노레포 환경에서의 빌드 속도를 대폭 향상시키고, 작업 간의 의존성을 효율적으로 처리합니다.

2. 모노레포의 등장 배경

전통적인 멀티레포의 한계

과거에는 각 프로젝트별로 독립적인 저장소를 운영하는 멀티레포(Multi-repo)가 일반적이었습니다. 하지만 이 방식에는 다음과 같은 문제가 있었습니다:

  • 코드 중복: 여러 저장소에서 중복된 코드가 발생하며 유지보수가 어려움.
  • 종속성 관리 어려움: 서로 다른 프로젝트 간의 종속성 버전을 동기화하는 데 많은 시간이 소요됨.
  • 팀 간 협업 저하: 분리된 저장소로 인해 코드 공유와 협업이 비효율적임.

이러한 한계를 극복하기 위해 모노레포 방식이 주목받기 시작했습니다.

3. 터보레포와 모노레포가 이루고자 하는 구조

통합된 코드 관리

모노레포의 핵심은 모든 프로젝트를 하나의 저장소에서 관리하면서 공통 코드와 종속성을 재사용하는 것입니다. 이를 통해 코드의 일관성과 유지보수성이 향상됩니다.

효율적인 작업 관리

터보레포는 모노레포의 효율성을 극대화하기 위해 다음과 같은 기능을 제공합니다:

  • 스마트 캐싱: 동일한 작업을 반복 수행하지 않도록 결과를 캐싱하여 빌드 속도를 가속화.
  • 병렬 실행: 작업 간 의존성을 분석하고 병렬로 실행해 시간을 절약.
  • 지능형 변경 감지: 변경된 부분만 다시 빌드하고, 나머지는 건너뜀.

4. 터보레포와 모노레포의 디렉토리 구조

모노레포의 기본 디렉토리 구조

모노레포는 일반적으로 다음과 같은 구조를 따릅니다:

root/
├── apps/
│   ├── app1/
│   ├── app2/
├── packages/
│   ├── package1/
│   ├── package2/
├── package.json
├── tsconfig.json
└── pnpm-workspace.yaml (pnpm 사용 시)
  • apps/: 실행 가능한 애플리케이션이 위치하며, 예를 들어 웹앱, 백엔드 서버 등이 포함됩니다.
  • packages/: 공통으로 사용되는 라이브러리나 유틸리티 패키지가 위치하며, 여러 apps/에서 재사용됩니다.

터보레포의 디렉토리 구조

터보레포는 모노레포의 표준 디렉토리 구조를 따르며, 필요에 따라 유연하게 커스터마이징할 수 있습니다. 기본적인 디렉토리 구조는 다음과 같습니다:

root/
├── apps/
│   ├── app1/
│   ├── app2/
├── packages/
│   ├── package1/
│   ├── package2/
├── turbo.json
├── package.json
├── tsconfig.json
└── pnpm-workspace.yaml (pnpm 사용 시)
  • turbo.json: 터보레포의 설정 파일로, 작업(workflow)과 캐싱, 병렬 처리 등을 정의합니다.
  • pnpm-workspace.yaml: pnpm을 사용하는 경우, 워크스페이스와 디렉토리 간의 의존성을 관리합니다.

커스터마이징된 구조

터보레포는 디렉토리 이름을 자유롭게 변경할 수 있습니다. 다음은 커스터마이징된 예시입니다:

root/
├── services/
│   ├── web/
│   ├── api/
├── libs/
│   ├── ui/
│   ├── utils/
├── turbo.json
├── package.json
└── tsconfig.json

핵심 차이점

터보레포는 디렉토리 구조보다는 turbo.json을 통해 작업의 흐름과 의존성을 관리하며, 디렉토리 구조는 이를 지원하는 방식으로 설계됩니다.

5. 모노레포와 터보레포의 장단점

모노레포의 장점

  • 코드 재사용: 공통 코드를 쉽게 공유할 수 있어 개발 생산성이 높아짐.
  • 일관된 버전 관리: 모든 프로젝트가 동일한 버전의 종속성을 사용할 수 있음.
  • 팀 간 협업 강화: 단일 저장소로 인해 다른 팀의 코드 접근과 이해가 쉬워짐.

모노레포의 단점

  • 규모가 커짐: 저장소가 커지면서 관리 복잡성이 증가.
  • 빌드 성능 문제: 모든 프로젝트를 한꺼번에 빌드하면 시간이 오래 걸릴 수 있음.
  • 도구 제한: 기존 빌드 도구가 대규모 저장소를 처리하는 데 한계가 있을 수 있음.

터보레포의 장점

  • 빠른 빌드: 캐싱과 병렬 처리를 통해 빌드 시간을 대폭 단축.
  • 효율적 워크플로우: 변경된 파일만 빌드해 리소스를 절약.
  • 모던 개발 환경 지원: TypeScript, React 등 현대적인 기술 스택과의 호환성.

터보레포의 단점

  • 학습 곡선: 처음 사용하는 개발자에게는 설정과 사용법이 복잡할 수 있음.
  • 제약 사항: 특정 프로젝트 구조에 맞춰야 최적의 성능을 발휘.
  • 추가 의존성: 터보레포 자체를 설치하고 유지 관리해야 함.

6. 비교 및 결론

목적 여러 프로젝트를 하나의 저장소에서 관리 모노레포 환경에서 빌드 효율성 향상
장점 코드 재사용, 일관된 버전 관리, 협업 강화 빌드 속도 향상, 병렬 처리, 스마트 캐싱
단점 저장소 규모 증가, 빌드 성능 문제 학습 곡선, 추가 의존성 관리 필요
적용 사례 대규모 팀 프로젝트, 공통 코드 사용 복잡한 모노레포 환경

 

모노레포는 팀 간 협업과 코드 관리의 일관성을 높이는 데 적합하며, 터보레포는 이를 효과적으로 운영하기 위한 도구로써 강력한 성능을 발휘합니다. 두 방식을 적절히 조합하면 대규모 프로젝트에서도 높은 생산성을 유지할 수 있습니다.

반응형