
모노레포란 두 개 이상의 프로젝트가 동일한 레포지토리에 저장되는 소프트웨어 개발 전략이다. 모듈들이 각각 분리되어있지만 저장소는 같은 곳을 사용한다. 단순이 여러 프로젝트가 하나의 저장소를 사용한다기보다 모노레포에서는 프로젝트 사이 의존성이 존재하거나 같은 제품군일 때 사용한다.

멀티 레포지토리일 경우엔 프로젝트마다 서로 다른 컨벤션 때문에 서로의 레포지토리에서 작업할 때 문제가 발생할 수 있다. 모노 레포의 경우 모든 프로젝트와 라이브러리가 하나의 저장소에 있어 버전 관리가 통합된다. 또한 프로젝트 간 공유되는 코드 및 라이브러리에 대한 의존성 관리가 용이하다는 장점이 있다. 공통된 빌드, 테스트, 배포 스크립트 및 도구를 전체 저장소에 걸쳐 일관되게 사용할 수 있어 개발 프로세스 표준화에 도움이 된다. CI/CD 파이프라인을 한 곳에서 관리할 수 있어, 전체 프로젝트에 걸쳐 일관된 테스트 및 배포 프로세스를 구축할 수 있다.
package manager(npm, pnpm, yarn)을 통해 구성하는 방법과 모노레포 빌드 시스템 도구를 이용해 구성하는 방법이 있다.
TurboRepo란 자바스크립트 및 타입스크립트 코드 베이스를 위한 고성능 빌드 시스템이다. 모노레포는 많은 장점이 있지만 확장성이 떨어지며, 단일 모노레포가 수천 개의 작업을 실행하며 속도가 저하될 수 있고 이는 대규모로 소프트웨어를 개발하는 팀에 영향을 미친다.
Turborepo는 이러한 모노레포 확장 문제를 해결해준다. 원격 캐시는 모든 작업의 결과를 저장하기 때문에 CI에서 동일한 작업을 두 번 수행할 필요가 없다. 또 빌드 후 테스트한 뒤, 린트 작업을 이어 해야하는 경우가 있는데 이러한 작업을 병렬화하여 최대 속도로 작업을 예약한다. npm 생태계 규칙을 따르기 때문에 모든 패키지 관리자 (npm, yarn, pnpm)와 사용 가능하다.

1. Incremental builds
작업 진행을 캐싱해 이미 계산된 내용은 건너뛰고, 빌드는 딱 한 번만 하는 것을 목표로 한다.
2. Content-aware hasing
타임스탬프가 아닌 콘텐츠를 인식하는 방식으로 해싱을 지원한다. 이를 통해 모든 파일을 빌드하는 것이 아니라 변경된 파일만 빌드한다.
3. Cloud caching
클라우드 빌드 캐시를 팀원 및 CI/CD와 공유하는데, 이를 통해 클라우드 환경에서도 빠른 빌드를 제공한다.
4. Parallel execution
모든 코어를 사용하는 병렬 실행을 목표로 한다. 지정된 태스크 단위로 의존성을 판단해 병렬로 작업을 진행한다.
5. Task Pipelines
태스크 간의 연결을 정의해서 빌드를 언제 실행할지 판단해 최적화한다.
6. Zero Runtime Overhead
런타임 코드와 소스 맵을 다루지 않기 때문에 런타임 단계에서 파악하지 못한 리스크가 불거질 위험이 없다.
7. Purned subsets
빌드에 필요한 요소만으로 모노레포의 하위 집합을 생성해 PaaS 배포 속도를 높인다.
8. JSON configuration
별도의 코드작업 없이 JSON 설정으로 사용 가능하다
9.Profile in browser
빌드 프로필로 빌드 과정을 시각화하면 병목 지점을 쉽게 찾을 수 있다.
pnpm install turbo --global // 전역 설치
pnpm dlx create-turbo@latest
yarn dlx create-turbo@latest
npx create-turbo@latest
https://velog.io/@bnb8419/%EB%AA%A8%EB%85%B8%EB%A0%88%ED%8F%AC-%EA%B5%AC%EC%84%B1%EB%B0%A9%EB%B2%95
https://d2.naver.com/helloworld/0923884
https://medium.com/musinsa-tech/journey-of-a-frontend-monorepo-8f5480b80661
https://ace0507.tistory.com/163
https://toss.tech/article/monorepo-pipeline
https://turbo.build/