12월 프리온보딩 프론트엔드 챌린지 - 모노레포 시스템
· 약 12분
12월 프리온보딩 프론트엔드 챌린지 수강 도중 애매하게 알고 있었거나 새로이 알게된 정보 정리합니다.
모노레포 도입 케이스
1. B2C, B2B, admin를 하나로
- 멀티레포를 모노레포로 가져가며 같은 설정을 반복하고 싶지 않을 때 도입
- 단단히 하나로 되어있는 git 저장소를 볼 수 있다.
2. monolith -> Microservice로 전환
- 기존에는 한 패키지 안에 여러 개의 서비스가 있었음
- 이를 한 패키지에 하나의 서비스로 갖고 가겠다
예를 들어...
- 한 페이지 안에 menu가 몇 개 안 돼보이지만, 그 내부를 보면 수많은 서비스가 같이 있다.
- 하나의 거대한 빌딩을 보는 듯한 page folder 때문에 배포 시간도, 서비스 속도도, 트래픽도 점차 감당이 되지 않음.
- 라이브러리 하나가 몇 메가짜리인데, 한 페이지를 위해 거대한 라이브러리를 설치해버리면 다른 서비스에도 영향이 가고 맘.
- 그리하여 마이크로서비스를 택하게 된다.
즉, 모노레포란?
"여러 개의 개별 프로젝트를, 잘 정의된 관계를 통해서 하나의 Repo에 담은 것" "Monorepo ≠ Monolith"
yarn
yarn을 사용하여 모노레포를 구축하는 방법은 두 가지가 있다. yarn1, yarn berry가 그것이다.
yarn1을 사용하여 모노레포를 구축하는 경우는 별로 없고, yarn berry로 가는 경우가 많은 듯 하다.
yarn1
1. root package.json
두 줄의 코드가 yarn1의 모노레포 핵심이다.
package.json
{
"private": true,
"workspaces": ["packages/*"]
}
2. packages 폴더 하위에 workspace 생성하기
mkdir packages
mkdir ./packages/common
mkdir ./packages/server
1) common
이제 공통 모듈을 만들어 볼 것이다.
- packages/common/package.json 생성
./packages/common/package.json
{
"name": "@study/common",
"version": "1.0.0", // 버전 명시 해주자
"main": "index.js", // main을 꼭 적어주자
"license": "MIT"
}
질문
package name에 @를 같이 넣어주는 이유가 궁금해요 컨벤션일까요?
이는 관습입니다. 패키지 네임이 겹치는 일이 있을 수도 있기 때문에 @를 씁니다. 보통 회사이름을 앞에 쓰거나 본인의 id를 씁니다.
- packages/common/index.js 생성
module.exports = () => {
console.log('hello from common');
};
2) server
서버 프로젝트에서 common 모듈을 쓰기 위해 기초 세팅을 해준다.
- packages/server/package.json 생성
./packages/server/package.json
{
"name": "@study/server",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"dev": "node index.js"
},
"license": "MIT"
}
- packages/server/index.js 생성
packages/server/index.js
// server 프로젝트 안에서 common 모듈을 가져다 쓸 수 있도록 한다. 아직 의존하기 전이므로 모듈을 찾을 수 없을 것이다.
const foo = require('@study/common');
console.log('hello from server');
foo();
common 폴더는 공통으로 가져갈 요소이고, 이제 server가 common 프로젝트에 의존하게 만들 것이다.
3. server 가 common 에 의존하게 하기
yarn1은 버전을 뒤에 붙여주어야 한다.
yarn workspace @study/server add @study/common@1.0.0
- packages/server/package.json
./packages/server/package.json
{
"name": "@study/server",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"@study/common": "1.0.0"
},
"scripts": {
"dev": "node index.js"
},
"license": "MIT"
}
root에서 실행해보기
yarn workspace @study/server dev