모노레포와 Turborepo

cansweep·2023년 2월 16일
3

모노레포란?

모노레포란 하나의 repository에 두 개 이상의 프로젝트를 저장할 수 있는 방식을 말한다.

모노레포를 이해하기 위해서는 모노레포의 등장 배경을 알아야 할 필요가 있다.

모놀리식 애플리케이션은 하나의 저장소에 모든 코드를 저장하는 방식이었다. 그래서 코드를 짜다가 무언가 필요하다면 다른 곳에서 이미 만들어둔 코드를 가져오기도 쉽고 빌드, 배포를 한 번만 하면 되니 이런 점에서는 편하지만 이를 반대로 말하자면 코드가 얽혀있어 기능의 추가나 삭제가 쉽지 않고 내가 지운 코드 한 줄이 전체 프로젝트를 다운시킬 수 있다는 것이다.
또한 여러 프로젝트에서 다른 버전의 라이브러리를 쓰고자 해도 이를 나누지 못한다는 단점도 있다.

따라서 모듈화를 통해 각 프로젝트를 하나의 저장소로 관리하는 멀티레포 방식이 등장했다.
모놀리식과는 달리 멀티레포는 각 프로젝트가 독자적인 저장소로 관리되기 때문에 하나의 라이브러리가 여러 버전으로 각 프로젝트에 쓰이는 것이 가능해졌으며 기능의 추가, 삭제가 다른 프로젝트에 영향을 미치지 않는다.
하지만 각기 다른 저장소에 존재하기 때문에 공통된 디자인 컴포넌트, 로직등을 공유해 재사용하기 어렵고 빌드와 배포 또한 각각 이루어져야 했다.

이러한 과정을 거쳐 모노레포가 등장하게 되었는데 모노레포는 모놀리식의 장점과 멀티레포의 장점을 둘 다 취할 수 있는 구조를 가지고 있다.
일단 모노레포는 하나의 저장소에 각각의 프로젝트가 존재하며 이를 각각 관리할 수 있다.

그러니까 모놀리식처럼 코드의 재사용이 쉬워지고 빌드, 배포를 한 번에 처리할 수 있으며 멀티레포처럼 각각의 프로젝트를 따로 관리할 수 있게 되는 것이다.

Turborepo

모노레포를 구성하기 위한 툴은 Lerna, Nx, Turborepo 등이 존재한다.
다양한 툴 중에서도 Turborepo를 골라 모노레포를 체험해 보기로 했다.

Turborepo를 고른 개인적인 이유로는 최근 Next.js를 자주 쓰는데 같은 회사인 Vercel이 Turborepo를 인수하기도 했고 Next.js로의 구축이 쉬워서이다.

또 다른 이유로는 Turborepo가 지원하는 기능을 써보고 싶어서였다.

  1. 캐싱(Incremental builds)
    Turborepo는 캐싱을 통해 한 번 빌드가 이루어진 파일은 다음 빌드시에 건너뛰어 빌드 시간을 줄여준다.

  2. Content-aware hasing
    타임스탬프가 아닌 파일의 내용을 파악하는 것으로 빌드할 항목을 확인한다. 따라서 변경된 파일만 빌드할 수 있다.

  3. Parallel execution
    빌드를 병렬로 실행하여 CPU를 낭비하지 않고 빠르게 빌드를 수행할 수 있다.

이 외에도 원격 캐싱을 통해 빌드 캐시를 팀원 및 CI/CD와 공유할 수 있는 등 다양한 장점이 존재한다.

찍먹 후기

https://github.com/rnrn99/turborepo-playground

일단 모노레포를 만들어본 결과는 위에 담겨있다.
아직 무언가 크게 프로젝트를 만들어본 것은 아니고 UI만 공유해보도록 만들려고 했으나 그건 이미 Turborepo 설치 시점에 example로 주어진다.

따라서 일단 새로 utils라는 폴더를 만들어 그 안의 함수를 공유할 수 있도록 해보았다.
이것 만으로도 만들어진 구조가 굉장히 마음에 들어서 다음에는 좀 더 큰 프로젝트에 적용할 수 있으면 좋을 것 같다!

profile
하고 싶은 건 다 해보자! 를 달고 사는 프론트엔드 개발자입니다.

0개의 댓글