์ฝ๋๋ฒ ์ด์ค๊ฐ ์ปค์ง๊ณ ์๋น์ค๊ฐ ๋ณต์กํด์ง์๋ก, ๊ฐ๋ฐํ์ ํจ์จ์ ์ธ ์ฝ๋ ๊ด๋ฆฌ ๋ฐฉ์์ ๋ํ ๊ณ ๋ฏผ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค. ์ฌ๋ฌ ํ๋ก์ ํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋์ ์ ์ฅ์์์ ๊ด๋ฆฌํ๋ ๋ชจ๋ ธ๋ ํฌ(Monorepo)๊ฐ ๊ทธ ๊ฐ๋ ฅํ ๋์์ผ๋ก ๋ ์ค๋ฅด๊ณ ์์ฃ .
๋ชจ๋ ธ๋ ํฌ๋ ์ฝ๋ ๊ณต์ ์ ์ผ๊ด์ฑ ์ธก๋ฉด์์ ๋ถ๋ช ํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ด๊ธฐ์๋ '๋๋ฆฐ ๋น๋ ์๋'์ '๋นํจ์จ์ ์ธ ์ข ์์ฑ ๊ด๋ฆฌ'๋ผ๋ ๊ณ ์ง์ ์ธ ๋ฌธ์ ์ ์ ์๊ณ ์์์ต๋๋ค.
ํ์ง๋ง ์ด์ ๋ ๋ค๋ฆ ๋๋ค. TurboRepo (๋น๋ ์์คํ )์ PNPM (ํจํค์ง ๋งค๋์ )์ด๋ผ๋ ํ์ ์ ์ธ ํด๋ง(Tooling)์กฐํฉ์ด ๋ชจ๋ ธ๋ ํฌ์ ๋จ์ ์ ์๋ฒฝํ๊ฒ ํด์ํ๋ฉฐ, ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ทน๋ํํ๋ ์๋ก์ด ํ์ค์ ์ ์ํ๊ณ ์์ต๋๋ค.
์ด ๊ธ์์๋ ์ด ๋ ๊ฐ์ง ํต์ฌ ๋๊ตฌ๊ฐ ์ด๋ป๊ฒ ๋ชจ๋ ธ๋ ํฌ์ ์ฑ๋ฅ์ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ๊ณ , ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง ๊ตฌ์ฒด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
TurboRepo ๊ณ ์ฑ๋ฅ ๋น๋ ์์คํ โจ
TurboRepo๋ Vercel์์ ๊ฐ๋ฐํ ๊ณ ์ฑ๋ฅ ๋น๋ ์์คํ ์ผ๋ก, ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ธ ๋๋ฆฐ ๋น๋ ์๊ฐ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ๊ทธ ํต์ฌ์ ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์์ต๋๋ค.
๐ง ์ฆ๋ถ ๋น๋์ ์บ์ฑ์ ๋ง๋ฒ
๊ธฐ์กด CI/CD ํ์ดํ๋ผ์ธ์ ๋ฌธ์ ๋ ์์ ์ฝ๋ ์์ ์๋ ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ๋น๋ํ๋ ๋นํจ์จ์ฑ์ด์์ต๋๋ค. TurboRepo๋ ์ด๋ฅผ ์บ์ฑ(Caching) ๊ธฐ์ ๋ก ํด๊ฒฐํฉ๋๋ค.
- ๋น๋ ๊ฒฐ๊ณผ ์บ์ฑ: TurboRepo๋ ์ด์ ์ ์คํํ๋ ๋น๋/ํ ์คํธ/๋ฆฐํธ ๋ฑ์ ์์ ๊ฒฐ๊ณผ๋ฅผ ํด์(Hash) ๊ธฐ๋ฐ์ผ๋ก ์ ์ฅํฉ๋๋ค.
- ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์คํ: ๋ค์ ์คํ ์, ํ๋ก์ ํธ์ ์ฝ๋๋ ์ข ์์ฑ ํ์ผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ (์ฆ, ํด์๊ฐ ๋์ผํ ๊ฒฝ์ฐ), ์์ ์ ๊ฑด๋๋ฐ๊ณ ์บ์๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ฆ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
์ด ์ฆ๋ถ ๋น๋ (Incremental Builds) ๋๋ถ์, ๊ฐ๋ฐ์๋ ๋ก์ปฌ์์๋ CI ํ๊ฒฝ์์๋ ๋ณ๊ฒฝ๋ ํ๋ก์ ํธ์๋ง ์ง์คํ์ฌ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ ์ฒด ๋น๋ ์๊ฐ์ด ํ๊ธฐ์ ์ผ๋ก ๋จ์ถ๋ฉ๋๋ค.
๐ ์๊ฒฉ ์บ์ฑ์ผ๋ก ํ ์ ์ฒด์ ์๋ ํฅ์
TurboRepo์ ์ง์ ํ ํ์ ์๊ฒฉ ์บ์ฑ (Remote Caching)์์ ๋์ต๋๋ค.
- ์บ์ ๊ณต์ : ํด๋ผ์ฐ๋ ์ ์ฅ์(Vercel Artifacts, AWS S3 ๋ฑ)์ ์บ์๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ก๋ํ๊ณ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
- ํ์ ํจ์จ ์ฆ๋: A ๊ฐ๋ฐ์๊ฐ ํน์ ๋ธ๋์น์์ ๋น๋ํ ๊ฒฐ๊ณผ๋ฅผ B ๊ฐ๋ฐ์๊ฐ ๋ค์ด๋ก๋ํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ CI ํ๊ฒฝ์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ ๊ท ํ์์ด ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ๊ฑฐ๋, ์๋ก์ด CI ์ก์ด ์คํ๋ ๋ ๋ถํ์ํ ์ฌ๋น๋๋ฅผ ์ต์ํํ์ฌ ํ ์ ์ฒด์ ์จ๋ณด๋ฉ ๋ฐ ํ์ดํ๋ผ์ธ ์๋๋ฅผ ๋์์ ๋์ด์ฌ๋ฆฝ๋๋ค.
๊ฐ๊ฒฐํ ์ค์ : turbo.json
TurboRepo์ ์ค์ ์ ๋งค์ฐ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ ๋๋ค. ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ turbo.json ํ์ผ ํ๋๋ก ๋ชจ๋ [Workspace] ํ๋ก์ ํธ์ ์คํ ๋ฐฉ์์ ์ ์ํ ์ ์์ต๋๋ค.
// turbo.json
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"], // ์์ ์ข
์ ํจํค์ง๋ถํฐ ๋น๋
"outputs": [".next/**", "dist/**"] // ์บ์ฑํ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ ์ง์
},
"test": {
"dependsOn": ["build"],
"cache": true
},
// ...
}
}
PNPM: ์ข ์์ฑ ๊ด๋ฆฌ์ ํ์ ๊ณผ ๋์คํฌ ๊ณต๊ฐ ์ ์ฝ โ
๋ชจ๋ ธ๋ ํฌ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํด์๋ ๊ณ ์ฑ๋ฅ ๋น๋ ์์คํ ๋งํผ์ด๋ ํจ์จ์ ์ธ ํจํค์ง ๋งค๋์ ๊ฐ ํ์์ ์ ๋๋ค. PNPM (Performant NPM)์ Node.js ์ํ๊ณ์์ [์ข ์์ฑ ๊ด๋ฆฌ]์ ํจ๋ฌ๋ค์์ ๋ฐ๊พผ ํ์ ์ ์ธ ๋๊ตฌ์ ๋๋ค.
ํ๋ ๋งํฌ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ์๋ฆฌ
๊ธฐ์กด NPM์ด๋ Yarn Classic์ ๋ชจ๋ ธ๋ ํฌ์ ๊ฐ ํ๋ก์ ํธ๋ง๋ค node_modules๋ฅผ ์ค์นํ์ฌ ํจํค์ง ์ค๋ณต ์ค์น์ ๋์คํฌ ์ฉ๋ ๋ญ๋น ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ์ต๋๋ค. PNPM์ ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
- ์ฝํ ์ธ ์ฃผ์ ์ง์ ๊ฐ๋ฅ ์ ์ฅ์: PNPM์ ์ค์น๋ ํจํค์ง๋ฅผ ์์คํ ์ ์ ์ญ ์ ์ฅ์์ ๋จ ํ ๋ฒ๋ง ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅํฉ๋๋ค (ํ๋ ๋งํฌ).
- ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฐ๊ฒฐ: ๊ฐ ํ๋ก์ ํธ์ node_modules ํด๋์๋ ์ค์ ๋ฌผ๋ฆฌ์ ํ์ผ ๋์ , ์ ์ญ ์ ์ฅ์์ ์๋ ์๋ณธ ํจํค์ง๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ (Symlink)๋ง ์์ฑ๋ฉ๋๋ค.
์ด ๋ฐฉ์์ ์์ญ ๊ฐ์ ํ๋ก์ ํธ๊ฐ ์๋ฐฑ MB์ ๋ฌํ๋ ํจํค์ง๋ค์ ๋จ ํ๋์ ๋ฌผ๋ฆฌ์ ๋ณต์ฌ๋ณธ๋ง ๊ณต์ ํ๊ฒ ๋ง๋ญ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค์น ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง๊ณ , ๋์คํฌ ๊ณต๊ฐ์ ํ๊ธฐ์ ์ผ๋ก ์ ์ฝํ์ฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ์พ์ ํ๊ฒ ์ ์งํฉ๋๋ค.
2.2. PNPM Workspace๋ฅผ ํตํ [์ฝ๋ ๊ณต์ ]
PNPM์ [Workspace] ๊ธฐ๋ฅ์ ํตํด ๋ชจ๋ ธ๋ ํฌ ๋ด๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ ๊ณต์ ํ ์ ์๊ฒ ํฉ๋๋ค.
- pnpm-workspace.yaml: ๋ฃจํธ ํด๋์์ ๋ชจ๋ ์ฑ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋๋ฅผ ์ ์ํ์ฌ PNPM์ด ์ด๋ฅผ ํ๋์ [Workspace]๋ก ์ธ์ํ๊ฒ ํฉ๋๋ค.
# pnpm-workspace.yaml packages: - 'apps/*' # ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ - 'libs/*' # ๋ชจ๋ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ - ๋ก์ปฌ ํจํค์ง ์ฐธ์กฐ: ์ฑ ํ๋ก์ ํธ์ package.json์์ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: @my-org/ui)๋ฅผ workspace:* ๋ฒ์ ์ผ๋ก ์ ์ํ๋ฉด, PNPM์ด ์ด๋ฅผ ๋ก์ปฌ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ก ์ฐ๊ฒฐํ์ฌ ์ฆ์ ๊ฐ๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ ๋ณ๋์ ๋ฐฐํฌ ๊ณผ์ ์์ด, ์ฑ์์ ์์ ์ฌํญ์ ์ฆ์ ๋ฐ์ํ๊ณ ํ ์คํธํ ์ ์์ด ์ฝ๋ ๊ณต์ ์ ํธ๋ฆฌ์ฑ๊ณผ ํจ์จ์ฑ์ ๊ทน๋ํํฉ๋๋ค.
TurboRepo + PNPM ์๋์ง: ๋ชจ๋ ธ๋ ํฌ์ ์์ฑ ๐ ๏ธ
TurboRepo์ PNPM์ ์กฐํฉ์ ๋จ์ํ ํฉ์ด ์๋, ์๋ก์ ์ฝ์ ์ ๋ณด์ํ๋ฉฐ ๋ชจ๋ ธ๋ ํฌ ์ํคํ ์ฒ๋ฅผ ์์ฑํ๋ ๊ฐ๋ ฅํ ์๋์ง๋ฅผ ๋ง๋ญ๋๋ค.
| ํด | ์ญํ | ๋ชจ๋ ธ๋ ํฌ ๊ฐ์ ํจ๊ณผ |
| PNPM | ํจ์จ์ ์ธ ํจํค์ง ์ค์น ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ | ๋น ๋ฅธ ์ค์น ์๋, ๋์คํฌ ๊ณต๊ฐ ์ ์ฝ |
| TurboRepo | ๊ณ ์ฑ๋ฅ ๋น๋ ์์คํ ๋ฐ ์บ์ฑ | ํ๊ธฐ์ ์ธ ๋น๋/ํ ์คํธ ์๊ฐ ๋จ์ถ |
์ด ์กฐํฉ์ ํตํด ์ป๋ ์ค์ง์ ์ธ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ์ ๊ฐ์ํ: PNPM์ด ๋ชจ๋ ์ข ์์ฑ์ ํตํฉ ๊ด๋ฆฌํ๋ฉฐ ๊น๋ํ node_modules ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ ์ํ ํผ๋๋ฐฑ ๋ฃจํ: ๋ก์ปฌ ํ๊ฒฝ์์ TurboRepo ์บ์๋ฅผ ํตํด ์์ ๋ ๋ถ๋ถ์ ๋ํ ๋น๋/ํ ์คํธ๋ง ๋น ๋ฅด๊ฒ ์คํํ์ฌ ๊ฐ๋ฐ ํจ์จ์ ๋์ ๋๋ค.
- ํจ์จ์ ์ธ CI/CD ํ์ดํ๋ผ์ธ: CI/CD์์ ์บ์๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํตํด, ๋ณต์กํ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๋น๋ ์๊ฐ์ ๋ช ๋ถ ๋จ์๋ก ๋จ์ถ์ํฌ ์ ์์ต๋๋ค.
๋ ํด์ ๊ฒฐํฉ์ ๋ชจ๋ ธ๋ ํฌ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ , ์ฝ๋์ ์ผ๊ด์ฑ, ์ฌ์ฌ์ฉ์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ธ ๊ฐ๋ฐ ์๋๋ฅผ ๋ชจ๋ ๋ง์กฑ์ํค๋ ์ด์์ ์ธ ์ํคํ ์ฒ์ ๋๋ค.
์ฌ๋ฌ๋ถ์ ํ์ ์ด ๋ ํด ์ค ์ด๋ค ๊ฒ์ ๋จผ์ ๋์ ํด ๋ณด์ จ๋์? PNPM์ ์ค์น ์๋์ TurboRepo์ ์บ์ฑ ๊ธฐ๋ฅ ์ค, ์ค๋ฌด์์ ๊ฐ์ฅ ํฐ ํจ์ฉ์ ๋๊ผ๋ ๋ถ๋ถ์ ๋ฌด์์ด์๋์ง ๋๊ธ๋ก ๊ฒฝํ์ ๊ณต์ ํด ์ฃผ์ธ์!