모노레포는 '하나의 저장소'를 의미하는 'Monolithic Repository'의 줄임말로, 많은 프로젝트를 단일 저장소에서 관리하는 방식을 말합니다. 즉, 여러 개의 소규모 레포지토리(다중 레포지토리, 또는 멀티레포) 대신 하나의 거대한 리포지토리를 사용하는 것을 의미합니다.
모노레포는 언제 사용해야 효율적일까?
- 유사한 서비스들을 만들 때
- 한 서비스의 모바일 페이지, PC 페이지를 만들어야 할 경우 공통 기능들이 존재할 수 있는데, 이 때 사용하면 효율성 증가
- 여러 프로젝트를 한 눈에 파악해야 할 때
- 하나의 저장소에 여러 프로젝트를 구성 가능
- 동일한 개발자 경험을 느껴야 할 때
- 하나의 저장소에서 동일한 린트, 프리티어를 설정해 동일한 개발자 경험 제공
모노레포의 배포 방식
모노레포는 많은 장점이 있지만, 확장성 면에서는 어려움을 겪습니다. 각 워크스페이스(Repo)는 자체 테스트, 자체 린팅, 그리고 자체 빌드 프로세스를 가지고 있습니다. 즉, 각 프로젝트를 독립적으로 빌드한다고 생각해보면, 프로젝트별로 전부 빌드해야 하는 번거로움이 생깁니다. 하나의 모노레포에는 실행해야 할 작업이 수천 개에 이를 수 있습니다. 따라서, 이러한 속도 저하 및 번거로움은 대규모로 소프트웨어를 개발할 때 팀의 작업 방식에 큰 영향을 미칠 수 있습니다.
이러한 모노레포의 문제점을 해결해주는 것이 바로 터보레포입니다.
터보레포의 특징
1. Content-aware hasing
타임스탬프가 아닌 콘텐츠를 인식하는 방식으로 해싱을 지원합니다. 이를 통해 모든 파일을 다시 빌드하는 것이 아니라 변경된 파일만 빌드합니다.
2. Cloud caching
클라우드 빌드 캐시를 팀원 및 CI/CD와 공유합니다. 이를 통해 로컬 환경을 넘어 클라우드 환경에서도 빠른 빌드를 제공합니다.
3. Incremental builds
작업 진행을 캐싱해 이미 계산된 내용은 건너 뛰는 것을 의미합니다. 빌드는 딱 한 번만 하는 것을 목표로 합니다.
4. Parallel execution
모든 코어를 사용하는 병렬 실행을 목표로 합니다. 지정된 태스크 단위로 의존성을 판단해 최대한 병렬적으로 작업을 진행합니다.
5. Task Pipelines
태스크 간의 연결을 정의해서 빌드를 언제 어떻게 실행할지 판단해 최적화합니다.
6. Zero Runtime Overhead
런타임 코드와 소스 맵을 다루지 않기 때문에 런타임 단계에서 파악하지 못한 리스크가 불거질 위험이 없습니다.
7. Pruned subsets
빌드에 필요한 요소만으로 모노 레포의 하위 집합을 생성해 PaaS 배포 속도를 높입니다.
8. JSON configuration
별도의 코드 작업 없이 JSON 설정으로 터보를 사용할 수 있습니다.
// turbo.json
{
"baseBranch": "origin/main",
"pipeline": {
"build": {
...
}
}
}
9. Profile in browser
빌드 프로필로 빌드 과정을 시각화하면 병목 지점을 쉽게 찾을 수 있습니다.
References
https://medium.com/musinsa-tech/journey-of-a-frontend-monorepo-8f5480b80661
https://engineering.linecorp.com/ko/blog/monorepo-with-turborepo
https://fastcampus.co.kr/pages/43837
https://turbo.build/
'1. 웹개발 > 1_3_2 IT 상식' 카테고리의 다른 글
[IT 상식] 버전 표기법 (1.0.0) (0) | 2024.07.27 |
---|---|
[IT 상식] PoC란? (0) | 2024.07.20 |
[IT 상식] pnpm을 사용하는 이유 (vs npm) (0) | 2024.06.15 |
[IT 상식] DMZ 서버란? (0) | 2022.04.16 |