모노레포란?
- 모노레포란 같은 레포지토리에서 서로 다른 프로젝트들을 관리하는 소프트웨어 개발 전략입니다.
- 한 레포에서 관리하다보니 변경사항 파악 용이, 코드 재사용, 외부 의존성 관리, 리팩토링 측면에서도 장점이 있습니다.
도입 이유
- 하나의 레포지토리에 백엔드(nest), 프론트엔드(react) 두 개의 프로젝트를 구성해야하는 상황이 생김
- 의존성 관리와 공통으로 사용하는 node_modules, json파일, Type등을 한 곳에서 관리하기 위해 모노레포를 구성
도구 정하기
- 간단히 모노레포 구성을 위해 yarn workspace(npm도 가능) 사용
- lerna와 함께 구성한다면 프로젝트 별 배포 시 버전 관리에 용이한 장점이 있다.
- lerna는 각 패키지들을 배포하고 버전 관리하는 역할을 합니다.
- yarn은 각 패키지간의 의존성 관리 하는 역할을 합니다.
- Yarn(1.x) 워크스페이스 필드를 사용해 간단히 모노레포를 구성할 수 있다. yarn link(워크스페이스) 기능을 선언적으로 사용하는 것으로 node_modules 디렉터리에 workspace에 대한 심볼릭 링크가 생성된다. 이를 통해 하나의 저장소에 있는 여러 프로젝트가 서로 쉽게 상호 참조할 수 있다.
프로젝트 구성 순서
- 빈 프로젝트 폴더에
yarn init
를 통해 package.json 초기화
- 각각의 프로젝트 구성을 위해 package.json에서 하위 경로 추가 (workspaces)
- private: true
- 루트 프로젝트가 NPM Repository로 배포되는 것을 금지합니다.
- NPM 패키지를 배포하기 위한 용도가 아니라면 불필요한 옵션입니다.
- workspaces: []
- workspace에 담길 패키지를 지정합니다. (packges 폴더 하위의 모든 레포 적용)
- 하위 폴더를 구성해주고 각각 필요한 프로젝트를 구성한다.
- 루트 폴더 - 하위(client) 폴더에 cra로 react 설치, 하위(nest) 폴더에 cra로 nest 설치
- 하위 레포(client or nest)에 종속적인 패키지 설치는 해당 프로젝트 폴더내에서 패키지 설치해서 사용한다.
- 전역적으로 공통으로 사용할 패키지 설치는 루트 경로에서 설치해서 사용한다.
- 루트 프로젝트에 의존성 추가 : workspace가 아니라 루트 프로젝트에 의존성을 추가하려면 다음 명령을 실행한다.
yarn add <PACKAGE_NAME> -W