๐ Turborepo์ PNPM์ผ๋ก Monorepo ์์ํ๊ธฐ
์์ฆ์ ๋ชจ๋๋ฆฌ์ ํน์ ๋ฉํฐ๋ ํฌ ๊ตฌ์กฐ๋ณด๋ค ์ค๋ณต ์ฝ๋์ ์์กด์ฑ ๊ด๋ฆฌ ์ธก๋ฉด์์ ์ ๋ฆฌํ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๊ฐ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง ์ ๋ Turborepo๋ก ์์ฝ๊ฒ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
๐ Turborepo๋?
Turborepo๋ Vercel์์ ๊ฐ๋ฐํ JS/TS ๋ชจ๋ ธ๋ ํฌ ๋น๋ ์์คํ ์ ๋๋ค.
๊ธฐ์กด ๋ชจ๋ ธ๋ ํฌ ๊ด๋ฆฌ ๋๊ตฌ์ธ Lerna๋ Nx์ ์ ์ฌํ์ง๋ง, ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๋น๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์บ์ฑ ๋ฐ ๋ณ๋ ฌ ์คํ
- ๊ฐ์ ์์ ์ ์ฌ๋ฌ ๋ฒ ์คํํ์ง ์๊ณ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ์ฌ ๋ถํ์ํ ์ค๋ณต ๋น๋๋ฅผ ๋ฐฉ์ง
- ์ฌ๋ฌ ํจํค์ง์ ๋น๋๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ์ฌ ์๋ ์ต์ ํ
- ํจ์จ์ ์ธ ์์กด์ฑ ๋ถ์
- ๊ฐ ํจํค์ง์ ์์กด์ฑ์ ๋ถ์ํ์ฌ, ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ค์ ๋น๋ํด์.
- turbo run build ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ณ๊ฒฝ๋ ํจํค์ง๋ง ๋ค์ ์ฒ๋ฆฌํด์ ๋น๋ ์๊ฐ์ ๋จ์ถํ ์ ์์ด์.
- ์๊ฒฉ ์บ์ฑ
- Vercel๊ณผ ํตํฉํ์ฌ ํ์๋ค๋ผ๋ฆฌ ์บ์๋ฅผ ๊ณต์
- ๋ก์ปฌ์์ ๋น๋ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํ์์ด ๋ค์ ์คํํ ๋๋ ์ฌ์ฌ์ฉ
์ ๋ ์ง๊ธ์ ๊ณ์ํด์ ํ์ตํ๋ ์ค์ด์ง๋ง ์ค์ ์ด ์ง๊ด์ ์ด๋ผ ๋ฌ๋์ปค๋ธ๊ฐ ๋์ง ์๋ค๋ ๊ฒ๋ ํฐ ์ฅ์ ์ด๋ผ ์๊ฐ๋ฉ๋๋ค.
๐ Turborepo + pnpm ๋ชจ๋ ธ๋ ํฌ ํ๋ก์ ํธ ์์ฑ
Installation | Turborepo
Learn how to get started with Turborepo.
turbo.build
$ npx create-turbo@latest
์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ค์นํ๋ฉด ํด๋๋ช ๊ณผ ํจํค์ง ๋งค๋์ ๋ฅผ ์ ํํ๊ณ , ๊ธฐ๋ณธ์ ์ธ monorepo ํ ํ๋ฆฟ๊ณผ ํจ๊ป ํ๋ก์ ํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ ๋ ํจํค์ง ๋งค๋์ ๋ก pnpm์ ์ ํํ์ผ๋ฉฐ, pnpm workspace๋ก ์์ฑ๋ ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ํด๋๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
๋ค์ํ ํ๋ ์์ํฌ์ ๊ธฐ๋ฐํ ์์ ๋ค์ ํ์ธํ๊ณ ์ถ์ผ์๋ฉด ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
๊ทธ๋ผ monorepo๋ฅผ ๊ตฌ์ฑํ๋ ์ฃผ์ ํ์ผ๋ค์ ๋ํด ์ค๋ช ๋๋ฆฝ๋๋ค.
๐ pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
pnpm-workspace.yaml
์ pnpm์์ ๋ชจ๋
ธ๋ ํฌ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ ์ํฌ์คํ์ด์ค ์ค์ ํ์ผ์
๋๋ค.
packages ํค์๋๋ก ๋ชจ๋ ธ๋ ํฌ ๋ด์์ ๊ด๋ฆฌํ ํจํค์ง๋ค์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, ์์์ ์์ฑํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ apps/*, packages/* ํด๋๋ฅผ ๊ด๋ฆฌํ ํจํค์ง๋ก ๋ฑ๋กํฉ๋๋ค.
์ด๋ ๊ฒ ๋ฑ๋กํ ํจํค์ง๋ค์ ์๋ก ๊ฐ ํด๋ ๋ด package.json์ dependencies๋ก ์ถ๊ฐํด ๋งํฌํ ์ ์์ผ๋ฉฐ, install์ ๊ฐ ํจํค์ง์ ์ต์ ๋ฒ์ ์ด ์๋์ผ๋ก ๋ฐ์๋์ด ์ค๋ณต๋ ์ฝ๋๋ฅผ ์์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
"dependencies": {
"@repo/ui": "workspace:*",
...
},
์ ํ๋ก์ ํธ์์ packages/ui ํจํค์ง๋ฅผ apps/web์์ ์ฌ์ฉํ๊ธฐ ์ํด์ , ์์ ๊ฐ์ด ์ฌ์ฉํ ํจํค์ง ์ด๋ฆ๊ณผ ๋ชจ๋
ธ๋ ํฌ์์ ์ฌ์ฉ๋๋ ๋ฒ์ ["@repo/ui: "workspace:*"]
์ ์ง์ ํด ์ฃผ๋ฉด ํญ์ ๋ก์ปฌ์ ์ต์ ๋ฒ์ ์ ์ฐธ์กฐํ ์ ์๊ฒ ๋ฉ๋๋ค.
"workspace:"๋ pnpm, Yarn, npm์์ ์ ๊ณตํ๋ ์ํฌ์คํ์ด์ค ๊ธฐ๋ฅ ์ค ํ๋๋ก, ๋ชจ๋ ธ๋ ํฌ ๋ด์์ ํน์ ํจํค์ง๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ์ฉํ๋ ๋ฒ์ ์ง์ ๋ฐฉ๋ฒ์ ๋๋ค.
์ด๋ฌํ ๊ณตํต ์ปดํฌ๋ํธ๋ฟ๋ง ์๋๋ผ eslint, tsconfig, prettier ์ค์ ๋ค๋ ํ๋๋ก ๋ชจ์์ ๊ด๋ฆฌํ ์ ์์ด ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
๐ turbo.json
{
"$schema": "https://turbo.build/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".next/**", "!.next/cache/**"]
},
"lint": {
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"cache": false,
"persistent": true
}
}
}
turbo.json์ Turborepo์์ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๋ฑ์ ์์ ์ ๊ตฌ์ฑํ๋ ํต์ฌ ์ค์ ํ์ผ์ ๋๋ค.
์ด ํ์ผ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ธ๋ ํฌ ๋ด์์ ๊ฐ ํจํค์ง์ ์์ ์คํ ์์, ์บ์ฑ, ๋ณ๋ ฌ ์คํ ๋ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ์์ฑ๋ค์ด ์์ง๋ง ์ฃผ์ํ ํค์๋๋ค๋ง ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๐ tasks
{
"tasks": {
"build": {
...
},
"lint": {
...
},
}
}
tasks๋ turbo.json์์ ๊ฐ ์์ ์ ์คํ ๋ฐฉ์, ์คํ ์์, ์บ์ฑ, ์ ์ถ๋ ฅ ํ์ผ ๋ฑ์ ์ ์ํ๋ ๋ถ๋ถ์ ๋๋ค.
์ด ์์ฑ ์์ ์๋ ๋ด๋ถ ์์ฑ๋ค์ key ๊ฐ๋ค์ ์คํ ๊ฐ๋ฅํ ์์
์ผ๋ก ๋ฑ๋ก๋๊ณ , $ turbo run <task-key>
๋ก ์คํํ ์ ์์ต๋๋ค.
$ turbo run <task-key>
๊ฐ ์คํ๋์๋ค๋ฉด ๋ฑ๋ก๋ workspace ํจํค์ง๋ค์ package.json์ ํด๋นํ๋ task-key ๋ช
๋ น์ด๊ฐ ์คํ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด turbo run build๋ฅผ ์คํํ๋ค๋ฉด ๋ชจ๋ ํจํค์ง์ build ๋ช ๋ น์ด๊ฐ ์คํ๋ฉ๋๋ค.
๐ dependsOn
"dependsOn": ["^build"]
dependsOn์ ์์ ๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ์์ฑ์ ๋๋ค.
์ฆ, ํน์ ์์ ์ ์คํํ๊ธฐ ์ ์ ๋ค๋ฅธ ์์ ์ด ๋จผ์ ์คํ๋๋๋ก ์ง์ ํ ์ ์์ด, ์ด๋ฅผ ํตํด ์์ ์คํ ์์๋ฅผ ๋ช ์์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด ์ค์ ํด ๋์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
{
"tasks": {
"build": {
"dependsOn": ["^build"]
},
"lint": {
"dependsOn": ["^lint"]
},
"test": {
"dependsOn": ["build", "lint"]
}
}
}
"build": { "dependsOn": ["^build"] }
- ^build๋ ํ์ฌ ์์ ๋ฟ๋ง ์๋๋ผ, ์์กดํ๋ ๋ชจ๋ ํจํค์ง์์ build ์์ ์ ๋จผ์ ์คํํ๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
- build ์์ ์ด ์คํ๋๊ธฐ ์ ์, ๋ชจ๋ ์์กด์ฑ ํจํค์ง๋ค์ build ์์ ์ด ๋จผ์ ์๋ฃ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ui ํจํค์ง๊ฐ web์ ์์กดํ๊ณ ์์ผ๋ฉด, web์ build ์์ ์ ui๊ฐ ๋จผ์ ๋น๋๋ ํ ์คํ๋ฉ๋๋ค.
"test": { "dependsOn": ["build", "lint"] }
- test ์์ ์ ์คํํ๊ธฐ ์ ์ build์ lint ์์ ์ด ๋จผ์ ์๋ฃ๋๋๋ก ํฉ๋๋ค.
- ๋ฐ๋ผ์, test๋ build์ lint๊ฐ ๋ชจ๋ ๋๋ ํ์ ์คํ๋ฉ๋๋ค.
๐ ์บ์ฑ
turborepo์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋์ธ ์บ์ฑ์ ์ฌ๋ฌ ์์ฑ์ ์ํด ์ํฅ๋ฐ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ๋ฌถ์ด์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
{
"tasks": {
"build": {
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": [".next/**", "!.next/cache/**"]
},
"dev": {
"cache": false,
"persistent": true
}
}
}
cache
- ์บ์ฑ ํ์ฑํ ์ฌ๋ถ
- false๋ฉด ๋งค๋ฒ ์๋ก ์คํ
presistent
- ์ง์ ์คํ ์ฌ๋ถ
- true๋ฉด ์คํ ํ ์ข ๋ฃ๋์ง ์๊ณ ๊ณ์ ์คํ
- watch mode๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ
inputs
- ์บ์ฑ์ ๋ฌดํจํํ ํ์ผ ์ง์
outputs
- ํน์ ํด๋๋ฅผ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ๋ก ์ง์ ํด์ ๋ณํ ์ ๋ฌด์ ๋ฐ๋ผ ์บ์ฑ
๊ทธ๋ผ ํฐ๋ณด๋ ํฌ๋ฅผ ์ด์ฉํด ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌํ๋ฉฐ ์ด์ ๋๋ง ์๊ณ ์์ด๋ ์์ํ๋๋ฐ๋ ํฐ ๋ฌด๋ฆฌ๊ฐ ์์ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ ๋ ๊ณ์ ํ์ตํ๋ฉฐ ๋น๋ ๋ฐฉ๋ฒ๊น์ง ์๊ฐํ๋ ๊ธ์ ์ฌ๋ ค๋ณด๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.
'Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
pnpm Catalog๋ก monorepo workspace ํจํค์ง ๋ฒ์ ํต์ผํ๊ธฐ (0) | 2025.03.23 |
---|---|
์นํ๋ก์ ํธ ๋ฌธ์์ธ์ฆ ๊ตฌํํ๊ธฐ with ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ (0) | 2022.05.30 |
REST API์ ๋ํด (0) | 2022.05.23 |
๊ตญ๋น ์๋ฐ ์ธ๋ฏธ ํ๋ก์ ํธ - ์๋ฐ ํ๋ซํผ GOING (0) | 2022.03.27 |
CSS ํ์ผ ์์ ํ ์ ์ฉ์ด ์๋ ๋ (0) | 2022.02.17 |
๋๊ธ