Lerna์ Nx๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ์ ๊ฐ๋ ฅํจ์ ํ๊ตฌํ์ธ์. ๋๊ท๋ชจ ํ๋ก์ ํธ๋ฅผ ์ํ ์ํฌ์คํ์ด์ค ๊ด๋ฆฌ, ์ฝ๋ ๊ณต์ ๋ฐ ํจ์จ์ ์ธ ๋น๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ: Lerna ๋ฐ Nx ์ํฌ์คํ์ด์ค ๊ด๋ฆฌ
๋์์์ด ์งํํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋นํ ์ด๋ ค์์ด ๋ ์ ์์ต๋๋ค. ๊ธฐ์กด์ ๋ฉํฐ-๋ ํฌ ์ค์ ์ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฝ๋ ์ค๋ณต, ์์กด์ฑ ๊ด๋ฆฌ ๋ฌธ์ , ์ผ๊ด๋์ง ์์ ๋๊ตฌ ์ฌ์ฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ๋ชจ๋ ธ๋ ํฌ ์ํคํ ์ฒ๊ฐ ๋น์ ๋ฐํฉ๋๋ค. ๋ชจ๋ ธ๋ ํฌ๋ ์ฌ๋ฌ ํ๋ก์ ํธ(์ข ์ข ์๋ก ๊ด๋ จ๋จ)๋ฅผ ํฌํจํ๋ ๋จ์ผ ์ ์ฅ์๋ก, ์ด ํ๋ก์ ํธ๋ค์ ํจ๊ป ๋น๋๋๊ณ ๋ฒ์ ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ง์ ์ฅ์ ์ ์ ๊ณตํ์ง๋ง, ๋ชจ๋ ธ๋ ํฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด ์ ๋ฌธ์ ์ธ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ๊ธ์์๋ ๋ ๊ฐ์ง ์ธ๊ธฐ ์๋ ์๋ฃจ์ ์ธ Lerna์ Nx๋ฅผ ์ดํด๋ด ๋๋ค.
๋ชจ๋ ธ๋ ํฌ๋?
๋ชจ๋ ธ๋ ํฌ๋ ์ฌ๋ฌ ํ๋ก์ ํธ์ ์ฝ๋๋ฅผ ๋ด๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ์ฅ์์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ค์ ์๋ก ๊ด๋ จ๋ ์๋ ์๊ณ ์์ ํ ๋ ๋ฆฝ์ ์ผ ์๋ ์์ต๋๋ค. ํต์ฌ์ ๊ฐ์ ์ ์ฅ์๋ฅผ ๊ณต์ ํ๋ค๋ ๊ฒ์ ๋๋ค. Google, Facebook, Microsoft, Uber์ ๊ฐ์ ํ์ฌ๋ค์ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฑํํ์ต๋๋ค. Android, Chrome, Gmail์ ํฌํจํ ๊ฑฐ์ ๋ชจ๋ ์ฝ๋๋ฅผ ๋จ์ผ ์ ์ฅ์์ ์ ์ฅํ๋ Google์ ์๊ฐํด ๋ณด์ธ์.
๋ชจ๋ ธ๋ ํฌ์ ์ด์
- ์ฝ๋ ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ: ๋ณต์กํ ํจํค์ง ๋ฐ ๊ฒ์ ์ํฌํ๋ก ์์ด ํ๋ก์ ํธ ๊ฐ์ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋์ผํ ์ ์ฅ์ ๋ด์ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํํ๊ฒ ํตํฉ๋ ์ ์๋ ๋์์ธ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ํด ๋ณด์ธ์.
- ๊ฐ์ํ๋ ์์กด์ฑ ๊ด๋ฆฌ: ํ ๊ณณ์์ ์์กด์ฑ์ ๊ด๋ฆฌํ์ฌ ๋ชจ๋ ํ๋ก์ ํธ์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กด์ฑ์ ์ ๋ฐ์ดํธํ๋ฉด ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ๋ชจ๋ ํ๋ก์ ํธ๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ์์์ ๋ณ๊ฒฝ: ๋จ์ผ ์ปค๋ฐ์ผ๋ก ์ฌ๋ฌ ํ๋ก์ ํธ์ ๊ฑธ์ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ฌ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ํ ์คํธ๋ฅผ ๊ฐ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๋ชจ๋์ ์ํฅ์ ๋ฏธ์น๋ ๋ฆฌํฉํ ๋ง์ ์์์ ์ผ๋ก ์ํ๋ ์ ์์ต๋๋ค.
- ํฅ์๋ ํ์ : ํ์ ๋์ผํ ์ ์ฅ์ ๋ด์์ ์๋ก ๋ค๋ฅธ ํ๋ก์ ํธ์ ๋ํด ์ฝ๊ฒ ํ์ ํ์ฌ ์ง์ ๊ณต์ ๋ฐ ๊ต์ฐจ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ด์งํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์๋ก ๋ค๋ฅธ ํ์ ์ฝ๋๋ฅผ ์ฝ๊ฒ ํ์ํ๊ณ ์ดํดํ ์ ์์ต๋๋ค.
- ์ผ๊ด๋ ๋๊ตฌ ๋ฐ ๊ดํ: ๋ชจ๋ ํ๋ก์ ํธ์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฝ๋ฉ ํ์ค, ๋ฆฐํ ๊ท์น ๋ฐ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ ์ฉํฉ๋๋ค. ์ด๋ ์ฝ๋ ํ์ง๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค.
- ๊ฐ์ํ๋ ๋ฆฌํฉํ ๋ง: ๊ด๋ จ๋ ๋ชจ๋ ์ฝ๋๊ฐ ๋์ผํ ์ ์ฅ์ ๋ด์ ์์ผ๋ฏ๋ก ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง ํ๋ก์ ํธ๊ฐ ๊ฐ์ํ๋ฉ๋๋ค. ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์ ๊ฑธ์ณ ์๋ํ๋ ๋ฆฌํฉํ ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ชจ๋ ธ๋ ํฌ์ ๊ณผ์
- ์ ์ฅ์ ํฌ๊ธฐ: ๋ชจ๋
ธ๋ ํฌ๋ ๋งค์ฐ ์ปค์ง ์ ์์ผ๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ๋ณต์ ๋ฐ ์ธ๋ฑ์ฑ ์์
์ ๋ฆ์ถ ์ ์์ต๋๋ค.
git sparse-checkout๋ฐpartial clone๊ณผ ๊ฐ์ ๋๊ตฌ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. - ๋น๋ ์๊ฐ: ์ ์ฒด ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋น๋ํ๋ ๊ฒ์ ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์๊ฐ์ด ๋ง์ด ์์๋ ์ ์์ต๋๋ค. Lerna ๋ฐ Nx์ ๊ฐ์ ๋๊ตฌ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ต์ ํ๋ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ก์ธ์ค ์ ์ด: ๋ชจ๋ ธ๋ ํฌ์ ํน์ ๋ถ๋ถ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ํํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ต๋๋ค. ์ก์ธ์ค ์ ์ด ๋ฉ์ปค๋์ฆ์ ๋ํ ์ ์คํ ๊ณํ ๋ฐ ๊ตฌํ์ด ํ์ํฉ๋๋ค.
- ๋๊ตฌ ๋ณต์ก์ฑ: ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๋ ค๋ฉด ์ ๋ฌธ ๋๊ตฌ์ ์ง์์ด ํ์ํฉ๋๋ค. ์ด๊ธฐ ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฅผ ์ ์์ต๋๋ค.
Lerna: ๋ชจ๋ ธ๋ ํฌ์์ JavaScript ํ๋ก์ ํธ ๊ด๋ฆฌ
Lerna๋ ๋ชจ๋ ธ๋ ํฌ์์ JavaScript ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ธ๊ธฐ ์๋ ๋๊ตฌ์ ๋๋ค. Git ๋ฐ npm์ผ๋ก ๋ค์ค ํจํค์ง ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ ์ํฌํ๋ก๋ฅผ ์ต์ ํํฉ๋๋ค. npm ๋๋ Yarn์ ์์กด์ฑ ๊ด๋ฆฌ์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์ ํนํ ์ ํฉํฉ๋๋ค.
Lerna์ ์ฃผ์ ๊ธฐ๋ฅ
- ๋ฒ์ ๊ด๋ฆฌ: Lerna๋ ๋ง์ง๋ง ๋ฆด๋ฆฌ์ค ์ดํ ๋ณ๊ฒฝ๋ ์ฌํญ์ ๊ธฐ๋ฐ์ผ๋ก ํจํค์ง๋ฅผ ์๋์ผ๋ก ๋ฒ์ ๊ด๋ฆฌํ๊ณ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ค์ ๋ฒ์ ๋ฒํธ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ปจ๋ฒค์ ๋ ์ปค๋ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ: Lerna๋ ํจํค์ง ๊ฐ ์์กด์ฑ์ ์ฒ๋ฆฌํ์ฌ ๋ชจ๋ ธ๋ ํฌ ๋ด์ ํจํค์ง๊ฐ ์๋ก ์์กดํ ์ ์๋๋ก ํฉ๋๋ค. ๋ก์ปฌ ์์กด์ฑ์ ์์ฑํ๊ธฐ ์ํด ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์์
์คํ: Lerna๋ ์ฌ๋ฌ ํจํค์ง์ ๊ฑธ์ณ ๋ช
๋ น์ ๋ณ๋ ฌ๋ก ์คํํ์ฌ ๋น๋ ๋ฐ ํ
์คํธ ํ๋ก์ธ์ค ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
package.json์ ์ ์๋ ์คํฌ๋ฆฝํธ ์คํ์ ์ง์ํฉ๋๋ค. - ๋ณ๊ฒฝ ๊ฐ์ง: Lerna๋ ๋ง์ง๋ง ๋ฆด๋ฆฌ์ค ์ดํ ์ด๋ค ํจํค์ง๊ฐ ๋ณ๊ฒฝ๋์๋์ง ๊ฐ์งํ์ฌ ๋์ ๋น๋ ๋ฐ ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Lerna ์ฌ์ฉ ์์
Lerna์ ์ฌ์ฉ๋ฒ์ ๊ฐ์ํ๋ ์์๋ก ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค. package-a์ package-b ๋ ๊ฐ์ ํจํค์ง๋ฅผ ๊ฐ์ง ๋ชจ๋
ธ๋ ํฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. package-b๋ package-a์ ์์กดํฉ๋๋ค.
monorepo/
โโโ lerna.json
โโโ package.json
โโโ packages/
โ โโโ package-a/
โ โ โโโ package.json
โ โ โโโ index.js
โ โโโ package-b/
โ โโโ package.json
โ โโโ index.js
1. Lerna ์ด๊ธฐํ:
lerna init
์ด๋ ๊ฒ ํ๋ฉด lerna.json ํ์ผ์ด ์์ฑ๋๊ณ ๋ฃจํธ package.json์ด ์
๋ฐ์ดํธ๋ฉ๋๋ค. lerna.json ํ์ผ์ Lerna์ ๋์์ ๊ตฌ์ฑํฉ๋๋ค.
2. ์์กด์ฑ ์ค์น:
npm install
# or
yarn install
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ํจํค์ง์ package.json ํ์ผ์ ๋ฐ๋ผ ๋ชจ๋
ธ๋ ํฌ์ ๋ชจ๋ ํจํค์ง์ ๋ํ ์์กด์ฑ์ด ์ค์น๋ฉ๋๋ค.
3. ํจํค์ง ์ ๋ฐ์ ๊ฑธ์ณ ๋ช ๋ น ์คํ:
lerna run test
์ด๊ฒ์ package.json ํ์ผ์ test ์คํฌ๋ฆฝํธ๊ฐ ์ ์๋ ๋ชจ๋ ํจํค์ง์ ๋ํด test ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค.
4. ํจํค์ง ๊ฒ์:
lerna publish
์ด ๋ช ๋ น์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๋ถ์ํ๊ณ , ๋ณ๊ฒฝ๋ ํจํค์ง๋ฅผ ๊ฒฐ์ ํ๊ณ , ์ปจ๋ฒค์ ๋ ์ปค๋ฐ์ ๋ฐ๋ผ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ฆฌ๊ณ , npm(๋๋ ์ ํํ ๋ ์ง์คํธ๋ฆฌ)์ ๊ฒ์ํฉ๋๋ค.
Lerna ๊ตฌ์ฑ
lerna.json ํ์ผ์ Lerna ๊ตฌ์ฑ์ ํต์ฌ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ด Lerna์ ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
packages: ๋ชจ๋ ธ๋ ํฌ ๋ด ํจํค์ง์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ์ข ์ข["packages/*"]๋ก ์ค์ ๋ฉ๋๋ค.version: ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต์ ์ง์ ํฉ๋๋ค.independent(๊ฐ ํจํค์ง๊ฐ ์์ฒด ๋ฒ์ ์ ๊ฐ์ง) ๋๋ ๊ณ ์ ๋ฒ์ ์ผ ์ ์์ต๋๋ค.command:publish๋ฐrun๊ณผ ๊ฐ์ ํน์ Lerna ๋ช ๋ น์ ๋ํ ์ต์ ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
lerna.json ์์:
{
"packages": [
"packages/*"
],
"version": "independent",
"npmClient": "npm",
"useWorkspaces": true,
"command": {
"publish": {
"conventionalCommits": true,
"message": "chore(release): publish"
}
}
}
Nx: ์ค๋งํธํ๊ณ ๋น ๋ฅด๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋น๋ ์์คํ
Nx๋ ๋ชจ๋ ธ๋ ํฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ๋น๋ ์์คํ ์ ๋๋ค. ์ฆ๋ถ ๋น๋, ๊ณ์ฐ ์บ์ฑ ๋ฐ ์์ ์ค์ผ์คํธ๋ ์ด์ ์ ์ค์ ์ ๋์ด ๋น๋ ์๊ฐ๊ณผ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. Lerna๊ฐ ์ฃผ๋ก ํจํค์ง ๊ด๋ฆฌ์ ์ค์ ์ ๋ ๋ฐ๋ฉด, Nx๋ ์ฝ๋ ์์ฑ, ๋ฆฐํ , ํ ์คํธ ๋ฐ ๋ฐฐํฌ๋ฅผ ํฌํจํ ์ ์ฒด ๋ชจ๋ ธ๋ ํฌ ์ํฌํ๋ก ๊ด๋ฆฌ์ ๋ํ ๋ณด๋ค ํฌ๊ด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
Nx์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ฆ๋ถ ๋น๋: Nx๋ ํ๋ก์ ํธ์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ๊ณ ๋ง์ง๋ง ๋น๋ ์ดํ ๋ณ๊ฒฝ๋ ํ๋ก์ ํธ๋ง ๋ค์ ๋น๋ํฉ๋๋ค. ์ด๋ ๋น๋ ์๊ฐ์ ๊ทน์ ์ผ๋ก ๋จ์ถ์ํต๋๋ค.
- ๊ณ์ฐ ์บ์ฑ: Nx๋ ๋น๋ ๋ฐ ํ ์คํธ์ ๊ฐ์ ์์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ์ ๋ ฅ์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๋์ฑ ๊ฐ์ํํฉ๋๋ค.
- ์์ ์ค์ผ์คํธ๋ ์ด์ : Nx๋ ๋ณต์กํ ๋น๋ ํ์ดํ๋ผ์ธ์ ์ ์ํ๊ณ ํจ์จ์ ์ผ๋ก ์คํํ ์ ์๋๋ก ํ๋ ๊ฐ๋ ฅํ ์์ ์ค์ผ์คํธ๋ ์ด์ ์์คํ ์ ์ ๊ณตํฉ๋๋ค.
- ์ฝ๋ ์์ฑ: Nx๋ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ผ๊ด๋ ํ์ค์ ๋ฐ๋ฅด๋ฉด์ ์๋ก์ด ํ๋ก์ ํธ, ๊ตฌ์ฑ ์์ ๋ฐ ๋ชจ๋์ ๋น ๋ฅด๊ฒ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ ์ฝ๋ ์์ฑ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํ๋ฌ๊ทธ์ธ ์ํ๊ณ: Nx๋ React, Angular, Node.js, NestJS ๋ฑ๊ณผ ๊ฐ์ ๋ค์ํ ๊ธฐ์ ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ ํ๋ถํ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์์กด์ฑ ๊ทธ๋ํ ์๊ฐํ: Nx๋ ๋ชจ๋ ธ๋ ํฌ์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์๊ฐํํ์ฌ ํ๋ก์ ํธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ดํดํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- ์ํฅ์ ๋ฐ๋ ๋ช ๋ น: Nx๋ ํน์ ๋ณ๊ฒฝ ์ฌํญ์ ์ํด ์ํฅ์ ๋ฐ๋ ํ๋ก์ ํธ์ ๋ํด์๋ง ์์ ์ ์คํํ๋ ๋ช ๋ น์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฃผ์๊ฐ ํ์ํ ์์ญ์ ๋ ธ๋ ฅ์ ์ง์คํ ์ ์์ต๋๋ค.
Nx ์ฌ์ฉ ์์
Nx์ ์ฌ์ฉ๋ฒ์ ๊ฐ์ํ๋ ์์๋ก ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. React ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
1. Nx CLI ์ ์ญ ์ค์น:
npm install -g create-nx-workspace
2. ์๋ก์ด Nx ์ํฌ์คํ์ด์ค ์์ฑ:
create-nx-workspace my-monorepo --preset=react
cd my-monorepo
์ด๋ ๊ฒ ํ๋ฉด React ์ ํ๋ฆฌ์ผ์ด์
์ด ํฌํจ๋ ์๋ก์ด Nx ์ํฌ์คํ์ด์ค๊ฐ ์์ฑ๋ฉ๋๋ค. --preset=react ์ต์
์ React ๊ด๋ จ ๊ตฌ์ฑ์ผ๋ก ์ํฌ์คํ์ด์ค๋ฅผ ์ด๊ธฐํํ๋๋ก Nx์ ์ง์ํฉ๋๋ค.
3. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ:
nx generate @nrwl/node:library my-library
์ด๋ ๊ฒ ํ๋ฉด my-library๋ผ๋ ์๋ก์ด Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค. Nx๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทธ ์์กด์ฑ์ ์๋์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
4. ์ ํ๋ฆฌ์ผ์ด์ ๋น๋:
nx build my-app
์ด๋ ๊ฒ ํ๋ฉด React ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๋ฉ๋๋ค. Nx๋ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ๊ณ ํ์ํ ํ์ผ๋ง ๋ค์ ๋น๋ํฉ๋๋ค.
5. ํ ์คํธ ์คํ:
nx test my-app
์ด๋ ๊ฒ ํ๋ฉด React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋จ์ ํ ์คํธ๊ฐ ์คํ๋ฉ๋๋ค. Nx๋ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ํ์ ํ ์คํธ ์คํ ์๋๋ฅผ ๋์ ๋๋ค.
6. ์์กด์ฑ ๊ทธ๋ํ ๋ณด๊ธฐ:
nx graph
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ธ๋ ํฌ์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์๊ฐํํ๋ ์น ์ธํฐํ์ด์ค๊ฐ ์ด๋ฆฝ๋๋ค.
Nx ๊ตฌ์ฑ
Nx๋ ์ํฌ์คํ์ด์ค ๋ฃจํธ์ ์๋ nx.json ํ์ผ์ ํตํด ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด ํ์ผ์ ์ํฌ์คํ์ด์ค์ ํ๋ก์ ํธ, ํด๋น ์์กด์ฑ ๋ฐ ์คํํ ์ ์๋ ์์
์ ์ ์ํฉ๋๋ค.
nx.json์ ์ฃผ์ ๊ตฌ์ฑ ์ต์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
projects: ์ํฌ์คํ์ด์ค์ ํ๋ก์ ํธ์ ํด๋น ๊ตฌ์ฑ(์: ๋ฃจํธ ๋๋ ํ ๋ฆฌ ๋ฐ ๋น๋ ๋์)์ ์ ์ํฉ๋๋ค.tasksRunnerOptions: ์์ ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ ํ์คํฌ ๋ฌ๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.affected: Nx๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ํด ์ด๋ค ํ๋ก์ ํธ๊ฐ ์ํฅ์ ๋ฐ๋์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํฉ๋๋ค.
nx.json ์์:
{
"npmScope": "my-org",
"affected": {
"defaultBase": "main"
},
"implicitDependencies": {
"package.json": {
"dependencies": "*",
"devDependencies": "*"
},
".eslintrc.json": "*"
},
"tasksRunnerOptions": {
"default": {
"runner": "nx-cloud",
"options": {
"cacheableOperations": ["build", "lint", "test", "e2e"],
"accessToken": "...",
"canTrackAnalytics": false,
"showUsageWarnings": false
}
}
},
"targetDefaults": {
"build": {
"dependsOn": ["^build"],
"inputs": ["production", "default"],
"outputs": ["{projectRoot}/dist"]
}
},
"namedInputs": {
"default": ["{projectRoot}/**/*", "!{projectRoot}/dist/**/*", "!{projectRoot}/tmp/**/*"],
"production": ["!{projectRoot}/**/*.spec.ts", "!{projectRoot}/**/*.spec.tsx", "!{projectRoot}/**/*.spec.js", "!{projectRoot}/**/*.spec.jsx"]
},
"generators": {
"@nrwl/react": {
"application": {
"style": "css",
"linter": "eslint",
"unitTestRunner": "jest"
},
"library": {
"style": "css",
"linter": "eslint",
"unitTestRunner": "jest"
},
"component": {
"style": "css"
}
}
}
}
Lerna vs. Nx: ๋ฌด์์ ์ ํํด์ผ ํ ๊น?
Lerna์ Nx๋ ๋ชจ๋ ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ๋๊ตฌ์ด์ง๋ง, ์ฝ๊ฐ ๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค. ํ๋ก์ ํธ์ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๋ฐ ๋์์ด ๋๋ ๋น๊ต๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ๊ธฐ๋ฅ | Lerna | Nx |
|---|---|---|
| ์ด์ | ํจํค์ง ๊ด๋ฆฌ | ๋น๋ ์์คํ ๋ฐ ์์ ์ค์ผ์คํธ๋ ์ด์ |
| ์ฆ๋ถ ๋น๋ | ์ ํ์ (์ธ๋ถ ๋๊ตฌ ํ์) | ๋ด์ฅ ๋ฐ ๊ณ ๋๋ก ์ต์ ํ๋จ |
| ๊ณ์ฐ ์บ์ฑ | ์๋์ค | ์ |
| ์ฝ๋ ์์ฑ | ์๋์ค | ์ |
| ํ๋ฌ๊ทธ์ธ ์ํ๊ณ | ์ ํ์ | ๊ด๋ฒ์ |
| ํ์ต ๊ณก์ | ๋ฎ์ | ๋์ |
| ๋ณต์ก์ฑ | ๋ ๊ฐ๋จํจ | ๋ ๋ณต์กํจ |
| ์ฌ์ฉ ์ฌ๋ก | ์ฃผ๋ก npm ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๊ฒ์๋ฅผ ๋ชฉํ๋ก ํ๋ ํ๋ก์ ํธ. | ์ต์ ํ๋ ๋น๋ ์๊ฐ, ์ฝ๋ ์์ฑ ๋ฐ ํฌ๊ด์ ์ธ ๋น๋ ์์คํ ์ด ํ์ํ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ. |
Lerna๋ฅผ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ:
- ์ฃผ๋ก npm ํจํค์ง๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ฒ์ํด์ผ ํ๋ ๊ฒฝ์ฐ.
- ํ๋ก์ ํธ๊ฐ ๋น๊ต์ ์๊ฑฐ๋ ์ค๊ฐ ๊ท๋ชจ์ธ ๊ฒฝ์ฐ.
- ํ์ต ๊ณก์ ์ด ๋ฎ์ ๋ ๊ฐ๋จํ ๋๊ตฌ๋ฅผ ์ ํธํ๋ ๊ฒฝ์ฐ.
- npm ๋ฐ Yarn์ ์ด๋ฏธ ์ต์ํ ๊ฒฝ์ฐ.
Nx๋ฅผ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ:
- ์ต์ ํ๋ ๋น๋ ์๊ฐ๊ณผ ์ฆ๋ถ ๋น๋๊ฐ ํ์ํ ๊ฒฝ์ฐ.
- ์ฝ๋ ์์ฑ ๊ธฐ๋ฅ์ ์ํ๋ ๊ฒฝ์ฐ.
- ์์ ์ค์ผ์คํธ๋ ์ด์ ์ ํฌํจํ ํฌ๊ด์ ์ธ ๋น๋ ์์คํ ์ด ํ์ํ ๊ฒฝ์ฐ.
- ํ๋ก์ ํธ๊ฐ ํฌ๊ณ ๋ณต์กํ ๊ฒฝ์ฐ.
- ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ํ์ตํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ ์ํฅ์ด ์๋ ๊ฒฝ์ฐ.
Lerna์ Nx๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์๋์?
์, Lerna์ Nx๋ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์กฐํฉ์ Lerna์ ํจํค์ง ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด์ Nx์ ์ต์ ํ๋ ๋น๋ ์์คํ ๊ณผ ์์ ์ค์ผ์คํธ๋ ์ด์ ์ ์ด์ ์ ์ป์ ์ ์๋๋ก ํฉ๋๋ค. Nx๋ Lerna์์ ๊ด๋ฆฌํ๋ ํจํค์ง์ ๋ํด ์ฆ๋ถ ๋น๋ ๋ฐ ๊ณ์ฐ ์บ์ฑ์ ์ ๊ณตํ๋ ํ์คํฌ ๋ฌ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Lerna ๋๋ Nx ์ค ๋ฌด์์ ์ ํํ๋ , ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ช ํํ ํ๋ก์ ํธ ๊ตฌ์กฐ ํ๋ฆฝ: ํ๋ก์ ํธ๋ฅผ ๋ ผ๋ฆฌ์ ์ด๊ณ ์ผ๊ด๋๊ฒ ์ ๋ฆฌํฉ๋๋ค. ํจํค์ง ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ช ํํ ๋ช ๋ช ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
- ์ผ๊ด๋ ์ฝ๋ฉ ํ์ค ์ ์ฉ: ๋ฆฐํฐ์ ํฌ๋งทํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ๋ก์ ํธ์์ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ์ ๋ณด์ฅํฉ๋๋ค. ESLint ๋ฐ Prettier์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ํฌํ๋ก์ ํตํฉํ ์ ์์ต๋๋ค.
- ๋น๋ ๋ฐ ํ ์คํธ ํ๋ก์ธ์ค ์๋ํ: CI/CD ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ์ฌ ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค. Jenkins, CircleCI, GitHub Actions์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ ๊ตฌํ: ์ฝ๋ ํ์ง๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฒ ์ ํ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ํํฉ๋๋ค. ํ ๋ฆฌํ์คํธ ๋ฐ ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋น๋ ์๊ฐ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ๋น๋ ์๊ฐ ๋ฐ ์ฑ๋ฅ ์งํ๋ฅผ ์ถ์ ํ์ฌ ๋ณ๋ชฉ ํ์ ๋ฐ ๊ฐ์ ์์ญ์ ์๋ณํฉ๋๋ค. Nx๋ ๋น๋ ์ฑ๋ฅ ๋ถ์์ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ ๋ฐ ํ๋ก์ธ์ค ๋ฌธ์ํ: ๋ชจ๋ ธ๋ ํฌ์ ๊ตฌ์กฐ, ์ฌ์ฉ๋ ๋๊ตฌ ๋ฐ ๊ธฐ์ , ๊ฐ๋ฐ ์ํฌํ๋ก๋ฅผ ์ค๋ช ํ๋ ๋ช ํํ ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์ปจ๋ฒค์ ๋ ์ปค๋ฐ ์ฑํ: ์ปจ๋ฒค์ ๋ ์ปค๋ฐ์ ์ฌ์ฉํ์ฌ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ฆด๋ฆฌ์ค ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค. Lerna๋ ์ปจ๋ฒค์ ๋ ์ปค๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
๊ฒฐ๋ก
ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ๋ ์ฝ๋ ๊ณต์ , ๊ฐ์ํ๋ ์์กด์ฑ ๊ด๋ฆฌ, ํฅ์๋ ํ์ ์ ํฌํจํ์ฌ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ ๊ด๋ฆฌ์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. Lerna์ Nx๋ ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. Lerna๋ npm ํจํค์ง ๊ด๋ฆฌ์ ํ๋ฅญํ ์ ํ์ด๋ฉฐ, Nx๋ ์ฆ๋ถ ๋น๋ ๋ฐ ์ฝ๋ ์์ฑ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ฐ์ถ ๋ณด๋ค ํฌ๊ด์ ์ธ ๋น๋ ์์คํ ์ ์ ๊ณตํฉ๋๋ค. ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ํ๋ก ํธ์๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฑํํ๊ณ ๊ทธ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
Lerna์ Nx ์ค ํ๋๋ฅผ ์ ํํ ๋ ํ์ ๊ฒฝํ, ํ๋ก์ ํธ ๋ณต์ก์ฑ, ์ฑ๋ฅ ์๊ตฌ ์ฌํญ๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ ๋๊ตฌ๋ฅผ ๋ชจ๋ ์คํํ์ฌ ํน์ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ฐพ์ผ์ธ์.
๋ชจ๋ ธ๋ ํฌ ์ฌ์ ์ ํ์ด์ ๋น๋๋ค!