๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป dev

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ( ft. ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๊ณผ๊ฑฐ, ํ† ์Šค์˜ ์„ ํƒ, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜)

๐Ÿค” 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

์ด์ œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋Š” ๋ฒ„์ €๋‹ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.

yarn์˜ ๋™์ž‘ 3๋‹จ๊ณ„ : 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

 

[์ถœ์ฒ˜] https://pnpm.io/benchmarks : npm, pnpm, yarn, yarn pnp ์„ค์น˜ ์‹œ๊ฐ„์„ ์ดˆ๋‹จ์œ„๋กœ ๋น„๊ต (๊ทธ๋ž˜ํ”„๊ฐ€ ์ž‘์„ ์ˆ˜๋ก ๋น ๋ฆ„)

 

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๋ฅผ ์จ์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‘˜์˜ ์žฅ์ ์„ ๋น„๊ตํ•˜๋ฉด ๊ฐˆํŒก์งˆํŒก..

 

- pnpm: content-addressed storage ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋Š” ์•„ํ‚คํ…์ณ ๋•๋ถ„์— ๊ณ ์„ฑ๋Šฅ, ํฌ๊ธฐ๊ฐ€ ํฐ ๋ชจ๋…ธ๋ ˆํฌ์— ํšจ์œจ์  (๋น ๋ฅธ ์„ค์น˜ + ์บ์‹ฑ), ์˜์กด์„ฑ ๊ด€๋ฆฌ ์œ ์—ฐ์„ฑ์ด ๋†’์Œ (peer/optional ์˜์กด์„ฑ ๋“ฑ๋“ฑ)

- yarn pnp:  ์˜์กด์„ฑ์ด ๋งŽ์€ ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ, ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ๊ณผ ์—„๊ฒฉํ•œ conflict ๋ฐฉ์ง€, ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ํšจ์œจ์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ

 

์ฒ˜์Œ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ์„œ ๋‹น์—ฐํžˆ Yarn PnP์„ ์จ๋ด์•ผ๊ฒ ๋‹ค ์‹ถ์œผ๋ฉด์„œ๋„ pnpm๋„ ์ข‹์€ ์˜ต์…˜์ด๋ผ๊ณ  ํ•˜๋‹ˆ๊นŒ ๊ณ ๋ฏผ์ด ๋œ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ pnpm์„ ๋จผ์ € ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์„ ํ† ๋Œ€๋กœ ๋‚˜์ค‘์— ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด yarn pnp๋„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ์ง์ ‘ ๋น„๊ตํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.


๐Ÿ“š References

https://toss.tech/article/lightning-talks-package-manager

 

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๊ณผ๊ฑฐ, ํ† ์Šค์˜ ์„ ํƒ, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜

ํ† ์Šค๋Š” ์™œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ Yarn์„ ์„ ํƒํ–ˆ์„๊นŒ์š”? ์ด๋ฒˆ ๋ผ์ดํŠธ๋‹ ํ† ํฌ์—์„œ๋Š” JavaScript์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €, ๋™์ž‘ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ํ† ์Šค์˜ ์„ ํƒ๊ณผ ์•ž์œผ๋กœ์˜ ๋ฐฉํ–ฅ์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๋ ค๊ณ  ํ•ด์š”.

toss.tech

https://yarnpkg.com/

 

Home page | Yarn

Yarn, the modern JavaScript package manager

yarnpkg.com

https://pnpm.io/ko/

 

Fast, disk space efficient package manager | pnpm

Fast, disk space efficient package manager

pnpm.io

https://www.npmjs.com/

 

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