개발 분야 (Development Area)

[번역] TikTok이 Sparo를 사용하여 20만 개 파일이 있는 모노레포를 관리하는 방법

vanillinav 2024. 10. 9. 19:31
728x90
반응형
소개
이 글은 TikTok 개발 블로그(원문)의 내용을 바탕으로 작성된 자료를 한국어로 번역한 것입니다. 기술적인 세부 사항은 TikTok 엔지니어링 팀에 의해 제공되었으며, 원문은 참조 자료에서 확인하실 수 있습니다. 이 글에서는 TikTok의 프론트엔드 팀이 대규모 모노레포에서 성능 문제를 해결하기 위해 Sparo라는 도구를 어떻게 개발하고 활용했는지를 다룹니다. 또한, 모노레포의 복잡성과 성장이 개발자 생산성에 미치는 영향을 줄이기 위한 방안을 설명합니다.

 


TikTok의 모노레포 성장 배경

TikTok은 빠르게 성장하는 짧은 형식의 비디오 공유 플랫폼으로, 웹 프론트 엔드의 코드베이스도 이에 발맞추어 커져왔습니다. 이 코드베이스는 TypeScript로 작성되었으며, 하나의 Git 저장소에 다수의 프로젝트와 라이브러리를 포함하는 모노레포(monorepo) 구조로 관리됩니다.

TikTok의 프론트엔드 팀이 확장됨에 따라, 모노레포도 1,000개 이상의 프로젝트와 20만 개 이상의 소스 파일로 확장되었습니다. 이러한 모노레포 구조는 코드 공유와 도구 지원 측면에서 여러 이점을 제공했으나, 성능 문제도 발생하게 되었습니다.

모노레포에서 발생한 Git 성능 문제

모노레포는 여러 프로젝트를 하나의 저장소에서 관리하는 방법으로, 대형 기술 기업들이 널리 채택하는 방식입니다. 그러나, 모노레포가 커짐에 따라 Git 명령어의 속도 저하가 개발자들에게 큰 불편을 초래했습니다.

주요 성능 문제:

  • git clone: 저장소 복제 시간이 느려져 개발자들이 작업을 시작하기까지 오랜 시간이 소요되었습니다. 느린 네트워크 연결에서는 최대 40분이 걸렸으며, 빠른 연결에서도 20분이 넘는 시간이 필요했습니다.
  • git checkout: 다른 브랜치로 전환하는 데 1분 30초 이상이 소요되었습니다.
  • git status: 현재 상태를 확인하는 데 7초가 걸렸으며, 개발자들의 작업 흐름을 방해했습니다.
  • git commit: 코드 변경 사항을 저장하는 데 15초 정도가 소요되었습니다.

Sparo의 등장과 Git 성능 향상

TikTok의 프론트엔드 인프라 팀은 이러한 성능 문제를 해결하기 위해 Sparo라는 도구를 개발했습니다. 이 도구는 Git의 sparse checkoutpartial clone 기능을 활용하여 모노레포 작업 속도를 크게 향상시켰습니다.

Sparse Checkout

Sparse checkout은 전체 코드베이스를 체크아웃하는 대신, 필요한 파일들만 선택적으로 가져올 수 있는 Git 기능입니다. Sparo는 이 기능을 활용하여 특정 애플리케이션과 그 의존성에 필요한 파일들만 체크아웃함으로써 데이터 처리량을 줄이고 체크아웃 시간을 단축시켰습니다.

Partial Clone

Partial clone 기능은 Git clone 시, 불필요한 파일과 객체를 제외하고 필요한 파일만 가져오도록 최적화합니다. 이를 통해 대형 저장소의 데이터를 효율적으로 처리하고, 이후에 필요한 파일만 로컬에 다운로드할 수 있습니다.

추가적인 Sparo 기능

Sparo는 Git의 기본 기능 외에도 몇 가지 중요한 향상 기능을 추가했습니다.

체크아웃 프로필

Sparo는 체크아웃 프로필이라는 기능을 도입하여, 미리 정의된 디렉터리 세트를 쉽게 체크아웃할 수 있도록 했습니다. Checkout 프로필은 미리 정의된 디렉토리 세트를 기반으로 체크아웃할 수 있도록 하는 기능입니다. 이를 통해 새로운 개발자들이 팀에서 필요한 코드베이스 부분을 빠르게 설정할 수 있습니다. 프로필은 JSON 파일로 정의되며, 팀원들 간 쉽게 공유될 수 있습니다.

{
  "selections": [
    {
      "selector": "--to",
      "argument": "project-a"
    },
    {
      "selector": "--to",
      "argument": "project-b"
    },
    {
      "selector": "folder",
      "argument": "docs"
    }
  ]
}

미러링된 명령어

Sparo는 Git 명령어와 동일한 구문을 사용하는 명령줄 인터페이스를 제공합니다. 즉, git clone, checkout, status, add, commit 등 익숙한 명령어들이 그대로 제공되며, 이를 통해 개발자들이 기존 워크플로우를 크게 바꾸지 않고도 Sparo를 사용할 수 있습니다.

Sparo 도입 후 성능 향상

Sparo를 도입한 후, TikTok의 프론트엔드 팀은 다음과 같은 성능 향상을 경험했습니다:

  • clone 시간: 23분에서 2분으로 단축
  • checkout 시간: 1분 30초에서 30초로 단축
  • status 명령어 실행 시간: 7초에서 1초로 단축
  • commit 시간: 15초에서 11초로 단축

이러한 성능 개선은 개발자들의 생산성을 크게 향상시켰고, 더 빠르게 작업을 반복하며 변경 사항을 저장할 수 있게 되었습니다.

결론

TikTok의 프론트엔드 팀은 모노레포의 급성장에 따라 Git 작업의 속도가 점점 느려지는 문제를 경험했습니다. 이를 해결하기 위해 자체 개발한 도구인 Sparo는 Git의 sparse checkout 및 partial clone 기능을 활용하여 성능을 크게 개선했습니다. Sparo는 오픈소스 도구로 공개되어 있으며, 앞으로 더 많은 회사들이 대형 모노레포에서 발생하는 성능 문제를 해결하는 데 중요한 역할을 할 것입니다.

참고 자료

  1. 프론트엔드 모노레포를 위한 더 빠른 Git: https://developers.tiktok.com/blog/2024-sparo-faster-git-for-frontend-monorepos
  2. TikTok, 모노레포 성능을 개선하기 위한 도구 출시: https://www.infoq.com/news/2024/09/tiktok-monorepo-sparo/
  3. Sparo GitHub: https://tiktok.github.io/sparo/
  4. sparse-checkout으로 모노레포 크기를 줄이세요: https://github.blog/open-source/git/bring-your-monorepo-down-to-size-with-sparse-checkout/
728x90
반응형