Turborepo는 JavaScript·TypeScript 모노레포의 태스크(빌드·린트·테스트)를 빠르게 돌리는 빌드 시스템이다. 기존 package.json 스크립트는 그대로 두고, 스크립트 사이의 의존 관계만 알려 주면 병렬 실행과 캐싱을 맡는다. 의도적으로 "빠른 실행과 캐시" 한 가지에 집중한다.
동작 원리
- 태스크 그래프(task graph):
turbo.json에 관계를 선언한다.^build는 "의존하는 패키지들의 build가 먼저"라는 뜻이다. Turborepo는 이 그래프로 가능한 곳을 병렬로 돌린다 - 캐시: 태스크 입력(소스 파일, 환경변수, 설정, 의존성)으로 해시를 계산하고 결과물과 로그를 저장한다. 같은 해시가 다시 나오면 실행하지 않고 저장된 결과를 재생한다
- 원격 캐시(remote caching): 캐시를 팀과 CI가 공유한다. CI가 main에서 이미 빌드한 패키지를 내 컴퓨터는 다시 빌드하지 않는다
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"] },
"lint": {}
}
}turbo run build test
turbo run test --affected # 변경된 패키지와 그 의존자만주의
outputs를 빠뜨리면 캐시가 결과물을 복원하지 못한다. 빌드에 영향을 주는 환경변수는env에 적어야 해시에 들어간다- 잘 맞는 곳: 패키지 수가 수~수십 개인 JS·TS 저장소, pnpm 워크스페이스와 함께 쓸 때
- 덜 맞는 곳: 복잡한 코드 생성, 여러 CI 머신에 작업 분산, JS 외 언어가 중심인 경우 → Nx나 Bazel
흔히 권하는 순서는 워크스페이스로 시작 → 빌드가 느려지면 Turborepo → 더 많은 구조가 필요하면 Nx다(2026 기준). 입력 해시로 결과를 재사용하는 원리는 Dockerfile: 레이어 캐시와 멀티 스테이지의 레이어 캐시와 같고, 모노레포 자체는 모노레포를 본다.