-
[Monorepo] 모노레포는 멀티레포로부터 어떻게 구원을 해줄까?feat:Turborepogood tips for dev 2023. 9. 6. 00:48
모노레포를 알아보기전에 우선 모놀리식 , 멀티레포를 알아야 합니다.
모노레포의 등장배경과 모노레포의 장점을 파악하려면 기존의 프로젝트 구성에 어떤 단점이 있는지 알아봐야합니다.
모놀리식이란?
모놀리식 애플리케이션은 모듈화 없이 모든 구성 요소가 한 프로젝트 안에 통합된 소프트웨어 애플리케이션을 이야기합니다. DB 커넥션을 맺고, 데이터를 요청하며, 화면을 그리는 로직이 한 프로젝트 안에 구현된 초기 웹 서비스를 모놀리식 애플리션으로 볼 수 있습니다.
모놀리식의 장점
소수의 개발자가 빠르게 개발할 수 있음.
모놀리식의 단점
1. 관심사 분리가 어려워서 설계, 리팩토링 어려움
2. 매번 거대한 프로젝트를 배포 해야함.
3. 일부분의 에러가 전체 서비스에 영향을 줄 수 있음.
멀티레포란 ?
폴리레포(Poly repo) 라고도 부릅니다. 멀티레포란, 만약 모노레포가 지금 어떤것인지 모른다면 현재 사용되고있는 프로젝트는 멀티레포로 되어있을 가능성이 큽니다. 프로젝트별로 레파지토리를 생성하여 만든 프로젝트를 멀티레포라고 합니다.
각각의 프로젝트가 자신만의 고유의 저장소를 가지게 되고 , 다른 프로젝트와 의존성을 전혀 갖고 있지 않아, 독립적으로 빠르게 개발이 가능합니다.
그리고 독립적으로 관리가 되기 때문에 크기가 가벼우므로 프로젝트 관리 또한 쉬운 편 입니다.
멀티레포의 장점
1.독립성과 격리: 각 리포지토리는 독립적으로 관리되므로 하나의 리포에서 발생한 문제가 다른 리포에 영향을 미치지 않습니다. 이는 다수의 독립적인 프로젝트나 서비스를 관리해야 하는 경우 유용합니다.
2. CI/CD 파이프라인 분리: 멀티 리포에서는 각 리포의 CI/CD 파이프라인을 분리하여 관리할 수 있으므로, 특정 프로젝트에 대한 배포 및 테스트 프로세스를 개별적으로 조정할 수 있습니다.
멀티레포의 단점
1.코드 중복성: 공통 코드나 라이브러리가 여러 리포지토리에 중복해서 들어갈 수 있습니다. 이로 인해 코드 변경 사항을 유지하거나 버그를 수정할 때 중복된 작업이 필요할 수 있습니다.
2.관리 오버헤드: 멀티 리포에서는 각각의 리포지토리를 별도로 관리해야 하므로, 리포지토리 생성, 업데이트, 보안 관리 등에 추가적인 관리 오버헤드가 발생할 수 있습니다.
3.한가지 feature을 개발을 위해 여러 레파지토리에 merge를 해야합니다.
멀티레포의 단점에 대해 Turborepo에서 든 예시를 보면 멀티레포의 단점의 대해서 더욱 이해가 잘 되었습니다.
예를 들어, App, Doc 및 shared-utils 세 개의 별도 저장소가 있다고 가정해보겠습니다.
App 과 Doc 모두 npm 패키지로 게시되는 shared-utils에 의존합니다. shared-utils에서 버그가 발생하여 앱과 문서에 중요한 이슈가 발생한다고 가정해봅시다. 이러한 경우 다음과 같은 과정이 필요합니다.
1. shared-utils에서 오류를 수정하는 커밋 생성
2. shared-utils 내에서 npm에 게시하기 위한 게시 작업 실행
3. App 내에서 shared-utils 종속성의 버전을 올리는 커밋 생성
4. Doc 내에서 shared-utils 종속성의 버전을 올리는 커밋 생성
5. 위 4단계를 거쳐야 App , Doc이 버그가 수정된 버전으로 배포를 완료 할 수 있습니다.
App 이나 Doc이 shared-utils에 의존하는 수가 늘어날수록 이 프로세스가 더 오래 걸릴 수 있으며 매우 번거로울 수 있습니다.
모노레포의 등장
우선 간단하게 모노레포의 정의를 설명하자면 두 개 이상의 프로젝트 코드를 하나의 버전 관리 저장소(repository)에서 관리하는 방법을 말합니다. 멀티레포처럼 독립적으로 관리 되는것이 아닌, 멀티레포의 반대로 모두 하나의 레파지토리에서 모든것이 관리가 됩니다. (최상위 폴더부터 트리구조로 서비스 폴더가 구성된다고 합니다.)
Google, Facebook, Microsoft, Uber, Airbnb 그리고 Twitter 등 여러 글로벌 기업들은 자신들의 운영 전략 아래 대규모 모노레포를 이미 운영하고 있다고 합니다.
프로젝트를 진행할때 규모가 작으면 굳이 모노레포 구성의 프로젝트 세팅을 할 필요는없곘지만, 서비스가 거대해지면
코드내에서 공유되는 코드 그리고 의존성 패키지들이 분명히 점차 많이 생겨날것입니다.
모노레포의 장점
1. 코드 공유와 재사용: 모노리포에서는 모든 애플리케이션 및 모듈이 하나의 코드베이스에서 관리됩니다. 이로 인해 코드 공유와 재사용이 용이해집니다. 공통 라이브러리, 유틸리티 함수 및 컴포넌트를 쉽게 다른 프로젝트에서 공유하고 활용할 수 있습니다.
2. 테스트 및 통합 용이성: 모노리포에서는 모든 코드가 함께 있으므로 서로 다른 애플리케이션 간의 테스트 및 통합이 용이합니다. 코드 변경 사항이 다른 애플리케이션에 어떤 영향을 미치는지 빠르게 확인할 수 있습니다.
3.배포 및 릴리스 관리 단순화: 모노리포에서는 하나의 릴리스 프로세스를 사용하여 모든 프로젝트를 동시에 배포할 수 있습니다. 이로 인해 배포 및 버전 관리가 단순화되며, 다수의 애플리케이션 간의 버전 호환성을 보다 쉽게 유지할 수 있습니다.
4.NPM에 배포할 필요가없어서 의존성관리가 쉬움
이 외에도 의존성 관리가 쉽고 , 여러 프로젝트팀 간의 협업이 수월 해집니다.
모노레포의 단점
1. CI 속도 저하 가능성이 있음.
2. 무분별한 리팩토링의 가능성이 있음
모노레포를 사용해야 할때는 언제?
1. 기존에 있는 서비스와 새로 개발 될 서비스가 비슷해서 로직관련한 코드의 중복성이 생길 수 있을때 모노레포를 사용하면 좋습니다. 예를들어 PC 페이지 모바일 페이지로 나뉘어지고 기능은 같을때 모노레포로 구성 하는것이 좋습니다.
2. 멀티레포처럼 여러 레파지토리를 확인하면서 코드를 파악하지 않고 한눈에 하나의 저장소에서 여러 프로젝트를 파악 해야할때도 모노레포로 구성 하는것이 좋습니다.
3. NPM과같은 디펜던시뿐만 아니라 전체적인 개발자의 코드 configuration 파일들도 모노레포에서 설정을 할 수 있기때문에
eslint, prettier 과 같은 세팅을 동일하게 줄 수 있어서 통일감 있는 코드를 작성할 수 있을때 , 또한 모노레포로 구성 하는것이 좋습니다.
FYI , 마치며
이런 모노레포를 구성해주는 도구도 있습니다.
Yarn , Turborepo ,, Nx , npm , pnmp 등 여러가지가 있습니다.
개인적으로 저는 최근에 사이드프로젝트를 Next.js13으로 구성했었던적이 있어서 앞으로 Next.js 13을 멀티레포로 구성할때는
Vercel에서 관리 되는 Turborepo를 사용해서 사이드프로젝트를 진행 해볼 예정입니다 :)
각각의 프레임워크, 라이브러리에 맞는 모노레포의 구성을 도와주는 도구가 있으니 참고하시면 될것같습니다.
Reference
Turbo
Turbo is an incremental bundler and build system optimized for JavaScript and TypeScript, written in Rust.
turbo.build
https://www.youtube.com/watch?v=mxLLIwZ93nY
https://www.youtube.com/watch?v=Ix9gxqKOatY&t=408s
'good tips for dev' 카테고리의 다른 글
코드 가독성에 대해 (feat: KISS, Boy scout rule) (1) 2024.01.14 [Yarn Berry] Yarn Berry가 node_modules의 문제를 어떻게 해결할까? (0) 2023.09.05 mixed content 에러시 http://localhost 허용? (feat:CORS error) (0) 2023.07.22 GraphQL vs REST API (0) 2022.11.30