모노레포 프로젝트에 Turborepo 도입하여 빌드 최적화하기

2025. 10. 13. 21:28

Next.js 모노레포 구조로 개발하면서 Turborepo를 알게 되어 도입한 내용 중 일부를 기록한다.

Turborepo에 대해 쉽게 설명된 글: https://engineering.linecorp.com/ko/blog/monorepo-with-turborepo

 

Turborepo로 모노레포 개발 경험 향상하기

안녕하세요. 저는 LINE+ UIT 조직에서 프런트엔드 개발을 하고 있는 이상철입니다. 저는 UVP(Universal Video Player)라는 사내 동영상 컴포넌트 라이브러리를 모노레포 환경에서 개발하고 있는데요. 어떻

engineering.linecorp.com

간단히 말하면 Turborepo는 여러 패키지를 효율적으로 빌드하기 위한 모노레포 빌드 시스템이며 다음 특징을 갖는다고 한다.

고급 빌드 시스템을 구축하는 복잡한 과정을 Turborepo가 대신해 주기 때문에 개발자는 복잡한 설정과 스크립트에 신경 쓰는 대신 개발에 더 집중할 수 있습니다. Turborepo의 기본 원칙은 한 번 작업을 수행하며 수행한 계산은 이후 다시 수행하지 않는 것입니다. 따라서 두 번째 실행할 때는 이전에 계산한 작업은 건너뛰고 이전에 캐싱해 놓은 로그를 다시 보여줍니다. 

 

아래 파이프라인은 PR main 머지하기 전에 빌드가 성공하는지 검증하는 역할을 한다.
이때 Turborepo의 강력한 기능을 사용할 수 있다.

name: CI

on:
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      # ... 생략
      TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
      TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
      TURBO_CACHE: remote:rw

    steps:
      # ... 생략

      - name: Install dependencies
        run: pnpm install

      - name: Build project
        run: pnpm run build

Vercel Remote Cache(=Turborepo의 원격 캐시 저장소)사용을 위해 Vercel Account Settings에서 토큰을 새로 하나 발급 받고, 
원격 캐시를 적용하기 위해 팀 또는 개인 계정 이름도 TURBO_TEAM이라는 key에 적용했다.

이렇게 필요한 환경변수들을 Github Actions Secrets에 저장한다.

ci.yaml에서 빌드 검증차 빌드를 돌릴 때(run: pnpm run build 부분),
Turbo 내부에서는 Vercel Remote Cache에서 캐시를 검색(Read)한다.

이때 캐시가 있으면 빌드를 스킵하고 그 빌드 결과물을 다운로드 받는다.
캐시가 없으면, 빌드를 실행하고 그 결과물을 Vercel Remote Cache에 업로드(Write)한다.

env의 TURBO_CACHE: remote:rw라는 부분이 이 Read, Write를 의미한다.

이 CI 과정에서 빌드 캐시를 업데이트하기 때문에, 추후 실제 Vercel 배포 시 캐시된 빌드 결과를 재사용해 시간이 단축된다.
또한, CI에서 빌드한 결과 === Vercel에서 배포하는 결과(동일한 캐시 사용)이기 때문에 일관성도 보장된다.