Multi Repo vs Mono Repo와 lerna 레르나에 대하여
- 멀티리포와 모노리포의 차이를 이해해보자 !
- 형상 관리 시스템상에서 소스 리포지토리를 관리하는 방법인, 멀티리포와 모노리포를 비교하고 분석해보자.
- 실무적인 구조를 이해하고, 적용하기 위해서는 프로젝트 구조에 대한 이해가 있어야 하기 때문이다.
- 실제로 내가 들어가야하는 회사 프로젝트 레포를 받고, 멀티레포의 구조가 명확하지 않아 공부를 시작한다... !
- 모노리딕 시스템의 프로젝트
- 프로젝트 초기에는 대부분 개발자의 수도코드가 적고, 모든것을 한 곳에서 처리하기 때문에 하나의 레포로 관리한다.
- 하지만 프로젝트가 거대화되면서 모노리딕 시스템은, 낮은 결합도와 응집력이라는 치명적인 단점을 지니게 된다.
- 따라서 각 부분을 도메인 별로 분리해서 마이크로 서비스로 구성하기 시작하고, 개발 조직은 쪼개진 각 서비스를
하나의 리포지토리에서 관리할지, 각자 다른 리포지토리에서 관리할지 고민한다.
- 여기서 멀티리포와 모노리포에 대하여 고민하게 되는 시점이다.
-멀티리포 vs 모노리포
- 시스템의 각 모듈을 개별 리포지토리에서 관리하는것, 멀티리포
- 시스템의 각 모듈을 하나로 관리하는것, 모노리포
- 멀티리포
시스템의 서비스별로 리포지토리를 각자 만들어서 관리하며, 서비스간의 연동이 소스 단위로 이루어지지 않는다.
각 서비스가 별도의 폴더로 구성된다.
장점 : 리포지토리별로 오너를 지정, 코드베이스가 나눠어 있기 때문에 작업 충돌 및 마스터 코드가 깨질 여지가 적음, 형상 관리, ci 속도가 빠르다, 리포지토리 크기가 작기 때문에, 리포지토리 훅을 기반으로 동작하는 도구들의 속도가 빨라진다.
단점 : 코드 재사용이 쉽지 않아, 중복코드 가능성 높아짐. 하나의 피쳐개발을 위해 여러 리포지토리에 머지해야함. 버전 연동이 깨질 위험이 있음. 디펜던시 헬( 프로젝트가 거대화가 됨에 따라 의존 그래프가 복잡해진다)
- 모노리포
시스템의 각 서비스가 하나의 리포지토리에서 일괄 관리된다. 서비스 간의 연동이 소스단위로 이루어진다.
최상위 폴더부터 트리 구조로 서비스 폴더가 구성된다.
장점 : 지속적인 소스의 무결성 보장 ( 모든 서비스가 연동된 올바른 상태가 유지된다), 통합된 버전관리, 코드 공유와 재사용이 용이 , 의존성 관리가 쉬움(패키지를 넘나들며 모듈화 시켜 사용가능), 협업이 쉬우며 유연한 팀 바운더리 설정이 가능하다.
단점 : 무분별한 의존성 연결 가능, 형상관리 및 ci 속도 저하
- 하지만, 실무 레포를 받고 구조를 파악했을때 멀티리포인지 모노리포인지 명확하게 보이지 않을때가 있다.
나의 경우 또한, 통합 배포와 모듈관리가 가능한 하나의 리포지토리를 받았지만, 그 안의 개별적 배포와 버전관리가 가능한 폴더로 구성이 되어있다.
이를 이해하기 위해, 마이크로 서비스 구축여부도 판단해야하며, 프로젝트 구성과 통합 관리를 도와주는 lerna 라이브러리와 webpack설정등을 뜯어보고 폴더 작동 & 배포 구조를 이해하며 파악해보자 !
- Lerna 란?
- 레르나. 단일저장소(하나의 레퍼지토리)에서 다양한 패키지를 구성하는 것을 도와주는 라이브러리이다.
프로젝트 전체를 빌드하거나, 테스트 할 때 변경이 있는 패키지들을 배포할 때 도움을 준다.
- 공식사이트의 소개는 Build System for managing & Publishing 이라고 소개하고 있다.
# lerna init
// lerna init
$ lerna init
$ lerna init - independent // 패키지들의 버저닝 정책을 독립으로 가져감
다양한 명령어를 통해 프로젝트에 맞게 lerna 설정을 해줄수 있다.
# lerna version
- 이전 배포 버전에서 변경이 있는 패키지들을 변경시켜준다.
# lerna bootstrap
- 패키지들의 의존을 설치하고 cross-dependencies를 연결, 재정비해준다.
# lerna run
- 패키지들의 npm 명령어를 실행한다. scope를 지정할 수 있다
# lerna publish
- 프로젝트에서 지난 릴리즈 이후 변경이 있었던 패키지를 배포한다
# lerna clean
- 각 패키지들의 node_modules 폴더를 삭제한다
# lerna link convert
- 각 패키지들의 devDependencies를 루트에서 관리할 수 있다.
- 기본적으로 Lerna 프로젝트를 생성했다면 파일과 폴더가 아래와 같이 생성된다
our-project-repo/ //상위폴더
- packages/
// lerna세팅이 적용되는 패키지들이 들어가는 폴더
- package.json
// npm패키지관리파일
- lerna.json
//lerna의 세팅정보