๐ค turborepo๋ก ๋ชจ๋ ธ๋ ํฌ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ค๊ณ ์ค์น๋ฅผ ํ๊ธฐ ์ํ ํจํค์ง ๋งค๋์ ๋ค ์ค ์ด๋ค ๊ฑธ ์ฌ์ฉํด์ผ ํ๋?
์ด๋ค์ ์ฐจ์ด์ ์ ํ ๊ธฐ์ค์ ๋ญ๊น?๐ ๋๋ง์นจ ํจํค์ง ๋งค๋์ ์ ๋ํด ํ๋ฒ ์ง๊ณ ๋์ด๊ฐ ๋ณด๋ ค๋ค๊ฐ ํ ์ค์ ํจํค์ง ๋งค๋์ ์ ๊ณผ๊ฑฐ, ํ ์ค์ ์ ํ, ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋๋ ์ข์ ๊ธ์ด ์ฌ๋ผ์์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. Turborepo ์ค์น
๐ฉ๐ปโ๐ป ์ดํด๋ณผ ๋ด์ฉ
- ํจํค์ง ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง
- ํจํค์ง ๋งค๋์ ๊ฐ ๋์ํ๋ 3๊ฐ์ง ๋จ๊ณ
- npm vs pnpm vs Yarn PnP
- ํ ์ค์ Pick
๐ฉ๐ปโ๐ป ํจํค์ง ๋งค๋์ ๋?
๋ชจ๋์์คํ (ESM & CJS)์ ๋ํด์ ๋ค๋ค๋ฏ์ด JS/TS์์๋ require ํน์ import๋ก ์ธ๋ถ์ ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ธ๋ถ์ ๋ชจ๋์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐธ์กฐํ๋๋ก ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์ด ๋ฐ๋ก๋ฐ๋ก ํจํค์ง ๋งค๋์ ๋ค.
ํ๋ก์ ํธ๋ฅผ ์์(ex. yarn install)ํ๋ฉด package.json์ด ์ต์์ ๋๋ ํฐ๋ฆฌ์ ์๊ธฐ๋ ๊ฑธ ํํ ๋ ์ฌ๋ฆด ์ ์๋ค.
ํน์ cra๋ฅผ ํ๋ฉด ์๋์ ์ผ๋ก package.json์ด ์๊ธฐ๊ณ ,
์ด package.json์์ ํ์ฌ ๋ฆฌ์กํธ ๋ฒ์ ์ด ๋ฌด์์ธ์ง์ ์ด๋ค ๋ฒ์ ๋ค์ ์ฌ์ฉํ ์ ์๋์ง ๋ช ์ํ ์ ์๋ค.
{
"dependencies": {
"react": "^18.2.0" // react๋ โฅ 18.2.0, <19 ์ฌ์ด์ ์ด๋ค ๋ฒ์ ์ด๋ ์ง ์ธ ์ ์๋ค๊ณ ๋ช
์
}
}
๋ชจ๋ ์์ค ์ฝ๋ ํ์ผ์ด ์ด๋ค ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ง๋ฅผ package.json ํ์ผ์ ๋ํ๋์๋ฅผ ๋ช ์ํ๊ณ ,
ํฐ๋ฏธ๋์์ yarn install ์ ์ ๋ ฅํ๋ฉด package.json์์ ๋ช ์๋ ๋ฒ์ ์ด ์ค์น๋๋ค.
์ฆ, ํจํค์ง ๋งค๋์ ๋ ๋ช ์ํ ๋ฒ์ ๋๋ก ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ค์นํ์ฌ ๋ชจํธํจ์ ์์ ์ฃผ๋ ์ญํ ์ ํด์ค๋ค.
๐ ํจํค์ง ๋งค๋์ ๊ฐ ๋์ํ๋ ์ธ ๋จ๊ณ : Resolution โก๏ธ Fetch โก๏ธ Link
์ด์ ํจํค์ง ๋งค๋์ ๋ ๋ฒ์ ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ ๊ฑธ ์๊ฒ ๋์์ผ๋, ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์ดํด๋ณด์.

1. Resolution : ๋ฒ์ ๊ณ ์ โก๏ธ ๋ค๋ฅธ ์์กด์ฑ ํ์ธ โก๏ธ ๋ค๋ฅธ ์์กด์ฑ ๋ฒ์ ๊ณ ์
๐ Resolution์ ์ฌ์ ์ ๋ป์ '๊ฒฐ๋จ/๊ฒฐ์ฌ'์ด๋ค. ๋ฌด์์ ๊ฒฐ๋จํ๋ค๋ ๊ฑธ๊น?
์ฐ๋ฆฌ๋ ์ข ์ข ์ํด๊ฐ ๋๋ฉด '๊ฒฐ์ฌ'์ ํ๋ค. ๋ฌ๊ธ์์ด ์ ์ํด ๊ฒฐ์ฌ์ ๋ํด ์ด์ผ๊ธฐํ๋ ์ถ๊ฒ ์ง๋ง,
์ด Resolution๋จ๊ณ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ํด ๊ฒฐ์ฌ์ ํ๋ ๊ฒ๊ณผ ์ ์ฌํ๋ค(๋ค๋ง ํจํค์ง ๋งค๋์ ๋ ์ํด ๊ฒฐ์ฌ์ ๋ฐ๋์ ์์ํ๋ค๋ ์ ์์๋ ๋ค๋ฅผ ์๋..).
์๋ฅผ ๋ค๋ฉด, ์ํด๊ฐ ๋๋ฉด ์ฌํด๋ "๋ค์ด์ดํธ ํด์ผ์ง! ๐๏ธ"๋ผ๋ ๊ฒฐ์ฌ์ ํ ์ ์๋ค.
"๋ค์ด์ดํธ๋ ์๋จ์ด์ง" ๋ญ๊ฐ์ด์ด์ ์ฃผ๋ฌธํ๊ธฐ๋ก ํ๋ค.
๐ ๋ญ๊ฐ์ด์ด์ ์ฃผ๋ฌธํ๋ ๊ณผ์ ์ Resolution ๋จ๊ณ์ ๋น๊ตํ์๋ฉด,
package.json ํ์ผ์ ๋ช ์๋ ๋ฒ์ ์ ๋ฐ๋ผ ์ ํํ ๋ฒ์ ๊ณ ์ (๋ญ๊ฐ์ด์ด ์ ํต๊ธฐํ์ ๋ฐ๋ผ ๊ฐ์๋ฅผ ๊ฒฐ์ )ํ๊ณ ,
์์กด์ฑ ๋ฒ์ ์ ๊ณ ์ (๋์ฅ๊ณ ์์ ๋ค๋ฅธ ์์๋ค ์ ํต๊ธฐํ ์ดํด ๊ฒฐ์ )์ํค๊ณ , ์์กด์ฑ์ ์์กด์ฑ์ ์ฐพ์ ๊ทธ ๋ฒ์ ์ ๊ณ ์ (์๋น์ ์นผ๋ก๋ฆฌ ์ญ์ทจ์ ๋ํ ๊ฒฐ์ )ํ๋ค.
Resolution ๋จ๊ณ์์ ํ๋ ์ผ์ ๋ํ ๊ฐ์ ๊ฐ์ง๊ณ ๋ ์์ธํ ์ดํด๋ณด์.
1. Resolution์ ์ฒซ ๋จ๊ณ๋ package.json ํ์ผ์ ๋ช ์๋ ๋ฒ์ ๋ฒ์์ ๋ฐ๋ผ ์ ํํ ๋ฒ์ ๊ณ ์ ํ๋ค.
์๋ฅผ ๋ค๋ฉด, "^" ๊ท์น์ 18.2.0์ด์ , 19 ๋ฏธ๋ง ์ฌ์ด์ ์ด๋ค ๋ฒ์ ์ด๋ ์ง ์ธ ์ ์๋ค๋ ๊ฒ์ ๋ช ์ํ package.json์์๋
ํด๋น ๋ฒ์์ ๊ฐ์ฅ ๊ฐ๋ฅํ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ 18.3.1 ๋ฒ์ ์ ์ ํํ๋ค.
{
"dependencies": {
"react": "^18.2.0" // react๋ โฅ 18.2.0, <19 ์ฌ์ด์ ์ด๋ค ๋ฒ์ ์ด๋ ์ง ์ธ ์ ์๋ค๊ณ ๋ช
์
}
}
2. Resolution์ ๋๋ฒ์งธ ๋จ๊ณ๋ ์ค์นํ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์กด์ฑ์ ํ์ธํ๋ค.
์๋ฅผ ๋ค๋ฉด, @toss/use-overlay๋ react๋ฅผ ์ฌ์ฉํ๋๋ฐ, react๋ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
๋ฐ๋ผ์ ์์กด์ฑ์ ์์กด์ฑ์๋ ์ด๋ค ๊ฒ์ด ์๋์ง ํ์ ํด์ผ ํ๋ค.
3. Resolution์ ๋ง์ง๋ง ๋จ๊ณ๋ ์์กด์ฑ ์์ฒด์ ๋ฒ์ ๊ณ ์ ํ๋ค.
์์กด์ฑ์ ๋ฒ์ ์ ๋ฒ์๋ก ๋ช ์ํ๊ณ , ํจํค์ง ๋ณ๋ก ์์กด์ฑ์ ์ง๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ package.json์ ๋ํด์๋ ์์กด์ฑ ๋ฒ์ ์ด
๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์์กด์ฑ ์์ฒด์๋ ๋ฒ์ ๋์ ํด์ผ ํ๋ค.
์๋ฅผ ๋ค๋ฉด, Next 14์์ app ๋ผ์ฐํฐ๊ฐ ๋ฑ์ฅํ๋ฉด์, app ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด useRouterํ ์ next/router๊ฐ ์๋ next/navigation์์ import ๋์ด์ผ ํ๋๋ฐ, Next 13.1 + React18.1.0์์๋ ๋์ํ๋ ์ฝ๋๊ฐ Next 14.2 + React18.2.0์ ์ฌ์ฉํ๋ ๊ธฐ๊ธฐ์์๋ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
Resolution์ ์ญํ ์ ์์กด์ฑ ๊ณ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๊ณ ์ ํ ๋ชจ๋ ์์กด์ฑ๋ค๊ณผ ์์กด์ฑ๋ค ๊ฐ์ ๋ฒ์ ์ ๊ณ ์ ํ ๋ฒ์ ์ yarn.lock์ด๋ package-lock.json์ ์ ์ฅ๋๋ค.
2. Fetch : ๊ฒฐ์ ๋ ๋ฒ์ ์ ํ์ผ์ ๋ค์ด๋ก๋
Resolution์ ํตํด yarn.lock์ ๋ช ์๋ ํจํค์ง๋ค์ ์ค์ ๋ก ๋ค์ด๋ก๋ํ๋ ๊ณผ์ ์ด๋ค.
๋คํธ์ํฌ๋ฅผ ํตํด npm ๋ ์ง์คํธ๋ฆฌ(99%)์์ ๋ค ๋ฐ์์จ๋ค.
(๋ญ๊ฐ์ด์ด ์ฃผ๋ฌธ์๋ฅผ ํ ๋๋ก ์ง์ ๋ฐฐ์ก๋๋ ๊ณผ์ )
3. Link : Resoltion๊ณผ Fetch ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ค ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณต
npm, pnpm, PnP(Plug'n'Play) ์ฌ๋ก๋ฅผ ์ดํด๋ณด๋ฉด์ Link ๋จ๊ณ์์๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์์๋ณด์.
(1) npm Linker
- node_modules ๊ธฐ๋ฐ์ Linker
- package.json์์ ๋ช ์ํ๋ ๋ชจ๋ ์์กด์ฑ์ ๊ทธ๋ฅ node_modules ๋๋ ํฐ๋ฆฌ ์๋์ ํ๋์ฉ ์ฐ๋ ์ญํ ์ ํ๋ค.
- ๋์ ์์ : React์ TDS ๋ชจ๋ฐ์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ react-dialog์ ์ฌ์ฉํ๋ค๊ณ ํ ๋
- my-service์ node_modules ํ์์๋ react์ TDS ๋ชจ๋ฐ์ผ ํจํค์ง๊ฐ ์ถ๊ฐ๋๊ณ ,
- TDS ๋ชจ๋ฐ์ผ ํจํค์ง์๋ node_modules๊ฐ ์๋ค๋ฉด @radix-ui/dialog๋ฅผ ๋ ์ถ๊ฐํด ์ค๋ค.
my-service/
โโ node_modules/
| โโ react/
| |
| โโ @tossteam/tds-mobile/
| โโ node_modules/
| โโ @radix-ui/react-dialog
|
โโ src
โโ index.ts
- ๋จ์ : ์ค์ ํ์ผ ์์คํ ์ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ์ผ์ผ์ด ์ถ๊ฐํ๊ณ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํจํค์ง๋ฅผ ์ฐพ๊ธฐ ์ํด node_modules๋ฅผ ๊ณ์ ํ๊ณ ์ฌ๋ผ๊ฐ์ผ ํ๋ค. ๋ฐ๋ผ์ import/require ์๋๊ฐ ๋๋ ค์ง๊ณ , ๋๋ ํฐ๋ฆฌ๋ ๋น๋ํด์ง๋ค. Hoisting์ด๋ผ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ์ ์๋ํ๋ค๊ณ ๋ ํ์ง๋ง, ์์ง ๋ถ์์ ํ๊ณ ์ต์ ํ๊ฐ ๋ถ์์ ํ๋ค๋ ์ ์์ ๋ ์ข์ Linker ์ต์ ์ ์ดํด๋ณด์.
(2) pnpm Linker
pnpm์ ๊ณต์ ์ฌ์ดํธ๋ pnpm์ ๋น ๋ฅด๊ณ ๋์คํฌ ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ํจํค์ง ๋งค๋์ ๋ผ๊ณ ์๊ฐํ๋ค.

- Pnpm์ ์ฅ์
- npm ๋ณด๋ค ๋ ๋ฐฐ๊น์ง ๋น ๋ฅด๋ค.
- node_modules ์์ ํ์ผ๋ค์ ํ๋์ content-addressable storage(์ด๋ฆ์ด๋ ์์น๊ฐ ์๋ ๋ด์ฉ์ ๊ธฐ์ค์ผ๋ก ์ ๋ณด๊ฐ ์ ์ฅ๋ ์ ์ฅ์)์ ๋ณต์ ๋๋ hard link ๋๊ธฐ ๋๋ฌธ์ ํจ์จ์ . Hard link ๋ฐฉ์์ alias๋ฅผ ๊ฑธ์ด์ alias์ ๋ฐ๋ก ์ ๊ทผํ์ฌ ์์กด์ฑ์ด ๋์คํฌ์ ํ๋๋ง ์ค์น๋๋๋ก ํ๋ค.
- ๋ชจ๋ ธ๋ ํฌ ์ง์: ํ๋์ ๋ฆฌํฌ์งํฐ๋ฆฌ ๋ด์ ์ฌ๋ฌ ํจํค์ง๋ค์ ๋นํธ์ธ ์ง์.
- pnpm์ ๋ํดํธ๋ก non-flat node_modules์ ๋ง๋๋ฏ๋ก ์์์ ํจํค์ง์ ์ ๊ทผํ ์ํ์ด ์๋ค.
npm์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ณ์ ๋๋ฉด์ ํ์ผ๋ค์ ์ผ์ผํ ์ฐพ์ ๋ง๋ค๊ณ , ์ฐพ์ ๋๋ ํ๋์ฉ ์ฐพ์ ์ฐ๋ ๋ฒ๊ฑฐ๋ก์์ ๊ฐ์ ๋์์ง๋ง,
pnpm์์๋ alias๋ฅผ ๊ฑธ๊ธฐ ์ํด ๋๋ ํ ๋ฆฌ๋ฅผ ๋๋ ์์ ์ ์ฌ์ ํ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ node_modules ๋๋ ํฐ๋ฆฌ ์์ฒด๋ ๊ทธ๋๋ก ์ ์งํ๋ฏ๋ก ํ์ผ ์ฝ๊ธฐ ๊ณผ์ ์ด ๋ง์ผ๋ฉด ์ค๊ฐ์ค๊ฐ ๋ฉ์ถ๋ ๋ฌธ์ ๋ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
(3) PnP Linker
๐ค ๊ทธ๋ผ node_modules ๋๋ ํ ๋ฆฌ ์์ฒด๊ฐ ์๋ค๋ฉด ๋ ๋น ๋ฅด์ง ์์๊น?
PnP Linker๋ node_modules๋ก ์์กด์ฑ์ ์ฒ๋ฆฌํ๋ ๋์ , JS ๊ฐ์ฒด๋ก ์ฒ๋ฆฌํ๋ค.
JS ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ํจํค์ง import ํ ๋์๋ ๊ฒฐ๊ตญ "์ด๋ ํ์ผ"์์ "๋ฌด์"์ import ํ๋๊ฐ์ ์ด์ ์ ๋ง์ท๊ธฐ ๋๋ฌธ์ด๋ค.
PnP ๋์์ ๋ค์๊ณผ ๊ฐ๋ค.
๋จผ์ yarn install์ ํ๋ฉด ์๋์ ๊ฐ์. pnp.cjs๋ผ๋ ํ์ผ์ด ์๊ธด๋ค.
["my-service", /* ... */ [{
// ./my-service์์...
"packageLocation": "./my-service/",
"packageDependencies": [
// React๋ฅผ import ํ๋ฉด 18.2.0 ๋ฒ์ ์ ์ ๊ณตํ๋ผ.
["react", "npm:18.2.0"]
]
]
// ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฆฌ์กํธ ์ฌ์ฉ์ npm 18.2.0์ด ์์นํ ๊ณณ๊ณผ,
// ๊ทธ ์๋์ ํจํค์ง๋ฅผ importํ๋ฉด ๋ช
์๋ ๋ฒ์ ์ ํจํค์ง๋ฅผ ๋ฐํํ๋ผ.
/* react ํจํค์ง ์ค์์ */
["react", [
/* npm:18.2.0 ๋ฒ์ ์ */
["npm:18.2.0", {
/* ์ด ์์น์ ์๊ณ */
"packageLocation": "./.yarn/cache/react-npm-18.2.0-98658812fc-a76d86ec97.zip/node_modules/react/",
/* ์ด ์์กด์ฑ๋ค์ ์ฐธ์กฐํ๋ค. */
"packageDependencies": [
["loose-envify", "npm:1.4.0"]
],
}]
]],
yarn์ ์คํํ๋ ์๊ฐ, Node.js ํ๋ก์ธ์ค๊ฐ --require์ --loader์ต์ ์ ์ฌ์ฉํด์ ์ด Map์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ถ ๋ก๋ํ๊ณ , import๊ณผ require๋ฌธ์์ ์ด Map์ ์ฐธ์กฐํ๋ค.
yarn.lock ๊ธฐ๋ฐ์ผ๋ก. pnp.cjs ํ์ผ ํ๋๋ง ์จ์ ์ค์น๋ฅผ ํ๋ฉด ๋๋ฏ๋ก ์๋๊ฐ ๋น ๋ฅด๋ค.
๋ฉ๋ชจ๋ฆฌ์ ํ์ผ์ด ๋ก๋๋ ํ Map ์ฐ์ฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ node_modules์ ์ํํ๋๋ฐ ์๊ฐ์ ํ ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ฉด, Node.js ํ๋ก์ธ์ค๊ฐ ๋จ๋ ์๋๊ฐ ๋๋ฆฌ๊ณ node_modules ๋๋ ํฐ๋ฆฌ์ ํธํ์ฑ์ด ๋ฎ๋ค๋ ์ ์์ ์์ฌ์ด ์ ๋ ์๋ค.
๐ PnP vs. Zero-install
ํ๋ฌ๊ทธ ์ค ํ๋ ์ด (PnP)์ zero-install์ ์ด๊ฐ ๋๋ฌธ์ธ์ง ํผ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๋ค.
ํ์ง๋ง ์ด ๋์ ๋ช ๋ฐฑํ ๋ค๋ฅด๋ค.
PnP Linker์์ ์ดํด๋ดค๋ฏ์ด, PnP๋ node_modules ์์ด JS Map ๊ฐ์ฒด๋ก ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
ํํธ, Zero-install์ PnP์ JS Map ๊ฐ์ฒด์ Fetch ๋ ์์กด์ฑ๋ค๊น์ง ๋ชจ๋ Git์ ๋ฃ์ด ๋ฒ์ ์ ๊ด๋ฆฌํ์๋ ๋ฐฉ์์ด๋ค.
์ฆ, npm์ ์ฌ์ฉํ๋ฉด์ Zero-install์ ํ ์๋ ์๊ณ (โ ๏ธ ์์กด์ฑ ์ค๋ณต์ผ๋ก ์ธํด ์ฉ๋ ๊ฑฐ๋ํด์ง๋ฏ๋ก yarn ์ฌ์ฉ ์งํฅ),
PnP๋ฅผ ์ฌ์ฉํ๋ฉด์๋ Zero-install์ ์ฌ์ฉํ ์ ์๋ค.
ํ ์ค์์๋ ํ๋ฐํธ์๋ ํ์ด ์์์ ๋น์์๋,
๋ธ๋์น ๋ณ๊ฒฝ ์ yarn install์ ํ์ ๋ ์๋๋ฉด node_modules์ ์ ๊ฑฐํ๊ณ ,
๋ค์ ์ค์นํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ Zero-install์ ํด๊ฒฐํ๋ค๊ณ ํ๋ค.
๋ชจ๋ ์์กด์ฑ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ git์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ Zero-install์ ํธ๋ฆฌํ์ง๋ง,
์ ์ฐจ ๋ ํฌ์งํฐ๋ฆฌ๊ฐ ์ปค์ง๋ฉด์ ์คํ๋ ค git ๊ด๋ฆฌ๊ฐ ๊น๋ค๋ก์์ ธ์ Zero-install์ ๊ธฐ๋ณธ์ผ๋ก ๋๋ ๋ฐฉํฅ์ผ๋ก ์งํํ๊ณ ์๋ค๊ณ ํ๋ค.
๊ฒฐ๊ตญ, ํ๋ก์ ํธ์ ํฌ๊ธฐ์ ํ์์ฑ์ ๋ฐ๋ผ ์ฌ์ฉ ์ฌ๋ถ์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ํ ์ค์ ์ ํ (์คํฌ: Yarn๐คญ)์ ์ด์ ์ ํ ์ค๊ฐ ์งํฅํ๋ ๋ฐฉํฅ์ฑ,
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ ํ๋ก์ ํธ์์ ๊ฒฐ์ ์ฌํญ์ ๋ํด ๋ค๋ฃจ๊ณ ๋ง๋ฌด๋ฆฌ ์ง์ผ๋ ค๊ณ ํ๋ค.
๐งถ ํ ์ค์ Pick
ํ ์ค๋ ์ง๊ธ๊น์ง Yarn์ฌ์ฉํ๊ณ ์๋ค. ๊ทธ ์ด์ ๋ ํฌ๊ฒ 4๊ฐ์ง๊ฐ ์๋ค๊ณ ํ๋ค.
1. Yarn์ ์ํคํ ์ฒ ์ค๊ณ ๋ฐฉ์
- ํจํค์ง ๋งค๋์ ์ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ํ ๋์ด ์์ผ๋ฉฐ, ์ธํฐํ์ด์ค๊ฐ ์ ๋ถ๋ฆฌ๋์ด ์๋ค.
- Resolution, Fetch์ Link ๊ฐ ๋จ๊ณ์ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋์ด ๊ณ ๋ชจ๋ํ ๋์ด ์๋ ๊ฑด PnP ๋ฐ์ ์๊ณ , ์ฝ๋์์ฑ ๋ฐฉ์๊ณผ ์ปจ๋ฒค์ ๋ ์ผ๊ด์ ์ด๋ค.
2. ์ ํ์ฑ
- PnP๋ ๊ฐ์ฅ ์๊ฒฉํ๊ณ ์ ํํ ์ค์น ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์๋ฌ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค.
- dependencies/peerDependencies์ ๋ช ์ํ์ง ์์ ์์กด์ฑ์ ์ฐธ์กฐํ ์ผ์ด ์๋ค. ๋ฐ๋ผ์ npm/pnpm์์๋ ์ ๋์ํ๋ค.
3. ์ฑ๋ฅ
- PnP๋ ํ์ผ I/O์ ์๊ฐ ์ ๊ณ , ์ค์น ๊ณผ์ ๋ํ ๊ฐ๋จํด์ ์๋๊ฐ ๋น ๋ฅด๋ค. ๋ํ CLI ํ์ง์ด ์ ์ผ ์ข๊ณ ์ฝ๊ธฐ ํธํ๋ค๊ณ ํ๋ค.
- ์ค์น ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ ๋น๊ต : npm (30์ด) >> pnpm (8์ด) > yarn
4. ํ์ฅ ๊ฐ๋ฅ์ฑ
- Yarn์ ์ฝ์ด ๋ถ๋ถ์ ์ ์ธํ๋ฉด ์ ๋ถ ํ๋ฌ๊ทธ์ธํ ๋์ด ์์ด์ (Pluggable) ๋ค์ํ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ API ํ์ฅ์ฑ์ด ์ข๋ค.
์ฆ, yarn pnp๊ฐ ์ง๋ ๊น๋ํ ์ํคํ ์ฒ, ํ์ฅ ๊ฐ๋ฅ์ฑ, ์ ํ์ฑ, ์ฑ๋ฅ์ ํ ๋๋ก ํ ์ค๊ฐ ํจํค์ง ๋งค๋์ ๋ก Pick ํ ๊ฒ์ด๋ค.
ํ ์ค๋ Zero-install์ ๋๊ณ , ๋ ํฌ์งํฐ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๊ณ ์๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์ ๋ธ๋์น ๋ณ๊ฒฝ ์ yarn install์ ํด์ค์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ฒ ์ง๋ง
Git์ ์ฃผ๋ ๋ถํ๊ฐ ๋ ํฌ๊ณ ,. pnp.cjs ํ์ผ ์ถฉ๋์ด ๋ ํฐ ์ด์๋ผ๊ณ ํ๋จํ ๊ฑฐ ๊ฐ๋ค.
๐ฆ JS ํ์ค์ผ๋ก ํจํค์ง ๊ด๋ฆฌ ๋ฐฉ๋ฒ
๐ค package.json์ด ์๋ ๋ธ๋ผ์ฐ์ ๋ Deno ๊ฐ์ ํ๊ฒฝ์์๋ ํจํค์ง ๋งค๋์ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊น?
๋ธ๋ผ์ฐ์ ์์๋ ํจํค์ง ๋งค๋์ ์ ๋น์ทํ JS ํ์ค ๋ฐฉ์์ธ Import Map์ด ์๋ค.
Import Map์ด react๋ก ์ง์ ๋ URL๋ก ๋งคํํ์ฌ, ํด๋น URL๋ก React๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ์์๋ฅผ ์ดํด๋ณด์.
// React๋ฅผ ๋ช
์
<script type="importmap">
{
"imports": {
"react": "https://cdn.jsdelivr.net/npm/react@17/umd/react.development.js"
}
}
</script>
// ์คํฌ๋ฆฝํธ ํ์
์ ๋ชจ๋๋ก ์ง์ ํ ํ,
// ๋ฆฌ์กํธ์์ ๊ฐ์ ธ์ค๊ธฐ
<script type="module">
import React from 'react';
</script>
Deno์ ๋ธ๋ผ์ฐ์ ๋ ์์ ๋ฐฉ์์ผ๋ก ํจํค์ง ๋งค๋์ ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ผ๋ฉฐ, JS ํ์ค์ด ํฅํ๊ณ ์๋ ๋ฐฉํฅ, Node.js๋ Import Map์ ์ง์ํ๊ณ ์๋ค๋ ์ ์์ ๋ฏธ๋ฃจ์ด๋ณด๋ฉด, ์ด๋ค ํจํค์ง ๋งค๋์ ๋ฅผ ์ ํํ ๊ฒ์ธ์ง์ ๋ํ ๋ ผ์ ์์ฒด๊ฐ ๋ถํ์ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
์ฆ, ํ์ฌ๋ Node.js์์๋ ํจํค์ง ๋งค๋์ ๊ฐ ํ์์ง๋ง,
๋จผ ๋ฏธ๋์๋ ํจํค์ง ๋งค๋์ ์์ด ๋ชจ๋ ์์กด์ฑ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ผ๋ก ์ ํํ ์ ์๋ ํ๋ณตํ ๋ฏธ๋๊ฐ ์ฌ ์๋ ์๋ค.
๐ค ๋ง์น๋ฉด์ : pnpm๋, Yarn PnP๋
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ๋น์ฐํ Yarn PnP๋ฅผ ์จ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ ์ ์๋ค.
ํ์ง๋ง ๋์ ์ฅ์ ์ ๋น๊ตํ๋ฉด ๊ฐํก์งํก..
์ฒ์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ตฌ์ฑํ๋ ํ๋ก์ ํธ๋ผ์ ๋น์ฐํ Yarn PnP์ ์จ๋ด์ผ๊ฒ ๋ค ์ถ์ผ๋ฉด์๋ pnpm๋ ์ข์ ์ต์ ์ด๋ผ๊ณ ํ๋๊น ๊ณ ๋ฏผ์ด ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก pnpm์ ๋จผ์ ์ฌ์ฉํด ๋ณด๊ณ ์ฌ์ฉํ๋ ๊ฒฝํ์ ํ ๋๋ก ๋์ค์ ๊ธฐํ๊ฐ ๋๋ค๋ฉด yarn pnp๋ ์ฌ์ฉํด ์ฌ์ฉ ๊ฒฝํ์ ์ง์ ๋น๊ตํด๋ณด๊ณ ์ถ๋ค.
๐ References
https://toss.tech/article/lightning-talks-package-manager
ํจํค์ง ๋งค๋์ ์ ๊ณผ๊ฑฐ, ํ ์ค์ ์ ํ, ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋
ํ ์ค๋ ์ ํจํค์ง ๋งค๋์ ๋ก Yarn์ ์ ํํ์๊น์? ์ด๋ฒ ๋ผ์ดํธ๋ ํ ํฌ์์๋ JavaScript์ ํจํค์ง ๋งค๋์ , ๋์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ํ ์ค์ ์ ํ๊ณผ ์์ผ๋ก์ ๋ฐฉํฅ์ฑ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๋ ค๊ณ ํด์.
toss.tech
Home page | Yarn
Yarn, the modern JavaScript package manager
yarnpkg.com
Fast, disk space efficient package manager | pnpm
Fast, disk space efficient package manager
pnpm.io
npm | Home
Bring the best of open source to you, your team, and your company Relied upon by more than 17 million developers worldwide, npm is committed to making JavaScript development elegant, productive, and safe. The free npm Registry has become the center of Java
www.npmjs.com
https://nextjs.org/docs/app/api-reference/functions/use-router#migrating-from-nextrouter
Functions: useRouter | Next.js
API reference for the useRouter hook.
nextjs.org
https://en.wikipedia.org/wiki/Content-addressable_storage
Content-addressable storage - Wikipedia
From Wikipedia, the free encyclopedia Type of data storage mechanism Content-addressable storage (CAS), also referred to as content-addressed storage or fixed-content storage, is a way to store information so it can be retrieved based on its content, not i
en.wikipedia.org
https://yarnpkg.com/features/pnp
Plug'n'Play | Yarn
An overview of Plug'n'Play, a powerful and innovative installation strategy for Node.
yarnpkg.com
https://www.syncfusion.com/blogs/post/pnpm-vs-npm-vs-yarn
PNPM vs. NPM vs. Yarn: What Should I Choose in 2024?
Explore the features of PNPM, NPM, and Yarn to make an informed decision for your JavaScript projects.
www.syncfusion.com