ex) package manager์— ๊ด€ํ•˜์—ฌ

๋ณธ ๊ธ€์€ ํ…Œ์ŠคํŠธ ๋ฌธ์„œ ์ž…๋‹ˆ๋‹ค.

Profile Picture
seoungin
2023-02-24

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜ ์ด ๊ธ€์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด์œ ๋ฅผ ๋ชจ๋ฅธ์ฑ„ node_modules๋ฅผ .gitignore์— ์ž‘์„ฑํ•˜๋Š” ๋ถ„
  2. ๋‚จ๋“ค ๋‹ค ์“ด๋‹ค๋Š” yarn ์ด๋‚˜ yarn berry๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋˜ ๋ถ„
  3. ์ด๋ฒˆ์—์•ผ ๋ง๋กœ pm์— ๋Œ€ํ•ด ์–ด๋ ดํ’‹์ด๋‚˜๋งˆ ํ•™์Šตํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„

์ด ๊ธ€์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. node_modules ๋ฅผ ํฌํ•จํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ
  2. npm ์ด ๊ตฌ์„ฑํ•˜๋Š” node_modules์˜ ๊ตฌ์กฐ
  3. yarn (classic)์ด ๊ตฌ์„ฑํ•˜๋Š” node_modules์˜ ๊ตฌ์กฐ
  4. pnpm์ด ๊ตฌ์„ฑํ•˜๋Š” node_modules์˜ ๊ตฌ์กฐ
  5. yarn berry๊ฐ€ ๊ตฌ์„ฑํ•˜๋Š” node_modules์˜ ๊ตฌ์กฐ
  6. ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‹ค์Šต ๋ฐ ๋น„๊ต

0. ์„œ๋ฌธ

์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์Šต๊ด€์ฒ˜๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๊ณค ํ–ˆ๋Š”๋ฐ์š”. ๋ฐ”๋กœ ์ด ํ•œ ์ค„๋กœ ์ธํ•ด์„œ ์ด ๊ธ€์ด ์ถœ๋ฐœํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ต์ˆ™ํ•œ ์šฐ๋ฆฌ์˜ .gitignore

์™œ ์ €ํฌ๋Š” ์Šต๊ด€์ฒ˜๋Ÿผ node_modules๋ฅผ .gitignore์— ์ž‘์„ฑํ–ˆ์„๊นŒ์š”?

์ด๋ฒˆ์—” node_modules๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ ํ•ด์„ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ์—ฌ๋Ÿฌ ํฐ IT๊ธฐ์—…๋“ค์˜ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ์˜ yarn berry ์— ๋Œ€ํ•œ ํ›„๊ธฐ๋“ค์— ๋Œ€ํ•œ ์˜๋ฌธ์ ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ํ† ์Šค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ์—์„œ ๊ธฐ์ˆ ๋œ yarn-berry์˜ ์žฅ์ ๋“ค์„ ๋ณด๊ณ , ์ •๋ง ๋น ๋ฅธ๊ฑฐ ๋งž์•„? ๋‚ด๊ฐ€ ํ™•์ธํ•ด๋ด์•ผ๊ฒ ์–ด!

+) ๋ณธ ๊ธ€์—์„œ PM์€ package manager์˜ ์•ฝ์นญ์œผ๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํ˜น์—ฌ๋‚˜ ํ—ท๊ฐˆ๋ฆฌ์‹ ๋‹ค๋ฉด ์ด์— ์œ ์˜ํ•ด์„œ ์ฝ์–ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. node_modules๋ฅผ ํฌํ•จํ•œ ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์ ํŠธ ์š”์†Œ

์ต์ˆ™ํ•œ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ

node_modules๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์ฆ‰ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€์˜ ์ฝ”๋“œ์™€ ํŽ˜ํ‚ค์ง€๋“ค์„ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ฒจ์˜จ ๊ฒฐ๊ณผ๋ฌผ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋˜ npm i react ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€์˜ ํŒจํ‚ค์ง€๋ฅผ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์ด์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒœ์ฒœํžˆ ๊ทธ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

// npm init ํ›„ ํ”„๋กœ์ ํŠธ์— ์™ธ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ณผ์ •
npm init // ์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ ์…‹ํŒ… ๋ช…๋ น์–ด
npm i react // npm ์ด๋ผ๋Š” pm์„ ํ†ตํ•ด์„œ react๋ฅผ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

1. npm i react ์— ๋Œ€ํ•ด์„œ

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” react๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ณ€ํ˜• ํ˜•ํƒœ์˜ค ์˜ต์…˜(yarn add , -g๋ฅผ ํ†ตํ•œ ์ „์—ญ์„ค์น˜ , --save ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด devdependency์— ์ถ”๊ฐ€) ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์šฐ์„  ์ง€๊ธˆ์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋งŒ์„ ๋‹ค๋ค„๋ด…๋‹ˆ๋‹ค.

npm i react // ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ react package๋ฅผ ๋‚ด ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹ ๊ธฐํ•˜๊ฒŒ๋„ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” npm init์œผ๋กœ ์ƒ์„ฑ๋œ package.json์„ ์ œ์™ธํ•˜๊ณ ๋„ ๋‘๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ๋” ์ž๋™์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ œ๊ฐ€ ์ง€๊ธˆ ์‚ฌ์šฉํ•˜๋Š” npm ๋ฒ„์ „์€ 9.8.1๋กœ ๊ธ€ ์ž‘์„ฑ์ผ ๊ธฐ์ค€ ๊ฐ€์žฅ ์ตœ์‹ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.)

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด๊ฒŸ์Šต๋‹ˆ๋‹ค.

2. package.json (after npm i react) (npm init์œผ๋กœ ์ƒ์„ฑ)

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ npm i react๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด package.json ์˜ dependencies์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ์„œ ์‚ด์ง ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ์ด package.json ์—์„œ๋Š” devdependencies๋ฅผ ๋น„๋กฏํ•˜์—ฌ ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์ด ์กด์žฌํ•˜๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์—ฌ๋Ÿฌ ํŽ˜ํ‚ค์ง€ ์ •๋ณด๋ฅผ ๋น„๋กฏํ•œ ์Šคํฌ๋ฆฝํŠธ, ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์ด ํฌํ•จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ธ€์—์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์ง€๋งŒ ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์ด ์กด์žฌํ•œ๋‹ค๋Š” ์ ์„ ์•Œ๊ณ  ๊ฐ€๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค!

3. package-lock.json (after npm i react) (npm i react ์ดํ›„ ์ž๋™์ƒ์„ฑ)

' ๊ฝค๋‚˜ ์‹ ๊ธฐํ•˜๊ณ  ์œ ์šฉํ•œ ๋…€์„์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์— lock์ด ๋ถ™์–ด ์žˆ๋Š”๊ฒƒ์œผ๋กœ ๋ณด์•„ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ "์ž ๊ทธ๋‹ค" ๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ์š”, ์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ๋‹ค๋ฃฐ npm @2๋‚˜ npm @3์— ์‹œ์ ์—์„œ๋Š” ๊ฐœ๋ฐœ๋˜์ง€ ์•Š๋˜ ์š”์†Œ์˜€์œผ๋ฉฐ, yarn์˜ ๊ฐœ๋ฐœ ์ดํ›„ ์˜๊ฐ์„ ๋ฐ›์•„ npm ์˜ ๋ฌธ์ œ์ ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋’ค์˜ ๊ธ€์—์„œ ๋‹ค๋ฃจ๊ฒ ์ง€๋งŒ ํ‚ค์›Œ๋“œ๋ฅผ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด non-deterministically ๋ฌธ์ œ ํ•ด๊ฒฐ, ๋ฒ„์ „ ๊ณ ์ • ํŠนํšŒ๋‚˜ non-deterministically ๋ฌธ์ œ ํ•ด๊ฒฐ์ด PM์—์„œ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ์ข€ ๋” ์˜๋ฏธ์žˆ๋Š” ํ•™์Šต์ด ์ง„ํ–‰๋ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

4. node_modules (after npm i react)(npm i react ์ดํ›„ ์ž๋™์ƒ์„ฑ)

๋Œ€๋ง์˜ node_modules์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๊ธ€์˜ ๋ชจ๋“  ํ•ต์‹ฌ์ด๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋„ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ PM๋“ค์ด ๊ตฌ์„ฑํ•˜๋Š” node_modules์˜ ์ฐจ์ด๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์ด ๊ธ€์˜ ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

node_modules๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์†Œ ์ด์ƒํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ณด๋ฉด, ์ €ํฌ๊ฐ€ ์„ค์น˜ํ•œ react๋ฅผ ์ œ์™ธํ•˜๊ณ ๋„ ๋ช‡๊ฐ€์ง€ ํด๋”๊ฐ€ ๋” ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š”๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช… ์šฐ๋ฆฌ๋Š” react๋งŒ์„ ์„ค์น˜ํ–ˆ๋Š”๋ฐ ๋ง์ด์ฃ ...

์ด๋Ÿฐ ์˜๋ฌธ์€ ๊ณง ํ•ด๊ฒฐ ๋ ๊ฒ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋„ ํ‚ค์›Œ๋“œ๋ฅผ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด ์ด๋Ÿฐ ํ˜„์ƒ์„ ๋ฐ”๋กœ ์œ ๋ น ์˜์กด์„ฑ(Phantom Dependency)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ท€์—ฌ์šด ์œ ๋ น์„ ๊ฐ€์ ธ์™€ ๋ณด์•˜์Šต๋‹ˆ๋‹ค?

์–ผ์ถ” node_modules๋ฅผ ๋น„๋กฏํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ์š”์†Œ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ถ€ํ„ฐ๋Š” node_modules ์˜ ํฐ ๊ตฌ์กฐ๋ณ€ํ™”๋ฅผ ๋ณด์˜€๋˜ npm @2 -> npm @3 -> yarn (classic) -> pnpm -> yarn berry ์ˆœ์„œ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

2. NPM

npm ํ™˜๊ฒฝ์—์„œ์˜ node_modules ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

npm v2 ์™€ npm v3(์ตœ์‹ ๋ฒ„์ „ 2015๋…„ ์ดํ›„๋กœ stable)์˜ ์ฃผ์š” ๋ณ€๊ฒฝ์ ์— ๊ด€ํ•˜์—ฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

NPM v2

npm @2 ๋Š” npm v3๊ฐ€ stable ๋˜๊ธฐ ์ „๊นŒ์ง€ ์‚ฌ์šฉ๋˜์–ด ์™”๋˜ npm์˜ ๊ณผ๊ฑฐ์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

npm v2์—์„œ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ์˜ˆ๋ฅผ ํ†ตํ•ด ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์ƒํ™ฉ์—์„œ ์„ธ ๊ฐœ์˜ ๋ชจ๋“ˆ A, B, C๊ฐ€ ์žˆ๊ณ , A๋Š” B๋ฅผ v1.0์œผ๋กœ ์š”๊ตฌํ•˜๊ณ , C๋„ B๋ฅผ ์š”๊ตฌํ•˜์ง€๋งŒ v2.0์„ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ npm @2๋Š” ์–ด๋–ป๊ฒŒ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ• ๊นŒ์š”?

์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ, npm @2๋Š” ํด๋” ๋‚ด์— ๊ฐ ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์„ ๊ฐ๊ฐ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ A, B, C๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๊ฐ๊ฐ์˜ ํด๋”์— ๊ฐ ํŒจํ‚ค์ง€์˜ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์˜์กด์„ฑ ์ง€์˜ฅ(Dependency Hell) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Dependency Hell

image

Dependency Hell์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐ ๊ด€๋ฆฌ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์˜์กด์„ฑ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ์˜์กด์„ฑ๋“ค์ด ๋ณต์žกํ•˜๊ฒŒ ๊ผฌ์—ฌ์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

  1. Version Conflict (๋ฒ„์ „ ์ถฉ๋Œ): ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์ด ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์š”๊ตฌํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A ํŒจํ‚ค์ง€๊ฐ€ B ํŒจํ‚ค์ง€์˜ v1.0์„ ์š”๊ตฌํ•˜๊ณ , C ํŒจํ‚ค์ง€๊ฐ€ B ํŒจํ‚ค์ง€์˜ v2.0์„ ์š”๊ตฌํ•  ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  2. Transitive Dependencies (๊ฐ„์ ‘ ์˜์กด์„ฑ): ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์˜์กดํ•˜๋ฉฐ, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ๋˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์˜์กดํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์˜์กด์„ฑ ์ฒด์ธ์ด ๋ณต์žกํ•˜๊ฒŒ ๊ผฌ์ผ ๊ฒฝ์šฐ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. Complex Dependency Graphs (๋ณต์žกํ•œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„): ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋“ค์ด ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ์„ ๋•Œ, ์–ด๋–ค ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dependency Hell์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์—…๋ฐ์ดํŠธ ๊ณผ์ •์—์„œ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ์ง€๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์€ ์‹œ๊ฐ„์„ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ์Ÿ์•„์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด npm @2์—์„œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ์š”? ๋ฐ”๋กœ ์•„๋ž˜์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” npm @2์—์„œ ํ•ด๋‹น package ๋“ค์˜ ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ํ•ด์„ํ•˜์—ฌ ์ƒ์„ฑ๋œ node_modules์ž…๋‹ˆ๋‹ค.

project/
โ”œโ”€ node_modules/
โ”‚   โ”œโ”€ A/
โ”‚   โ”‚   โ”œโ”€ node_modules/
โ”‚   โ”‚   โ”‚   โ””โ”€ B@v1.0/
โ”‚   โ”‚   โ””โ”€ package.json (A's dependencies: B@v1.0)
โ”‚   โ”œโ”€ C/
โ”‚   โ”‚   โ”œโ”€ node_modules/
โ”‚   โ”‚   โ”‚   โ””โ”€ B@v2.0/
โ”‚   โ”‚   โ””โ”€ package.json (C's dependencies: B@v2.0)
โ””โ”€ package.json (Project's dependencies: A, C)

์ง๊ด€์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ, npm @2์—์„œ๋Š” ์–ด๋ ค์šด ๋ฐฉ์‹๋ณด๋‹จ ์ง๊ด€์ ์ด๊ณ  ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜์กด์„ฑ๊ด€๊ณ„๋ฅผ ํ•ด๋‹น packages๋“ค์—๊ฒŒ ๋ชจ๋‘ ๋‚จ๊ฒจ๋‘” ๊ฒƒ์ด์ง€์š”.

์œ„์™€ ๊ฐ™์€ ํด๋” ๊ตฌ์กฐ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•„๋ž˜๋Š” npm.github.io ์—์„œ ์ธ์šฉํ•œ ๋„์‹๋„ ์ž…๋‹ˆ๋‹ค.

image

์œ„์˜ ๋ฐฉ์‹์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, Dependency Hell์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๊ฐ๊ฐ์˜ ๋ชจ๋“  package ๋“ค์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ์˜์กด์„ฑ์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm v2 ํ•œ๊ณ„

npm v2์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์œ„์˜ ๊ทธ๋ฆผ์ด npm @2์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋„ํ‘œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ๋ฌดํ•œํžˆ ์ค‘๋ณต๋˜๋Š” B v1์ด ์„ค์น˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. npm @2์—์„œ๋Š” ์˜์กด์„ฑ์„ ์ค‘์ฒฉํ•˜์—ฌ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ๋™์ผํ•œ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์ค‘๋ณต์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋””์Šคํฌ ๊ณต๊ฐ„ ๋‚ญ๋น„์™€ ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ค‘์ฒฉ๋œ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด ๋ชจ๋“ˆ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ์ค‘๋ณต ์„ค์น˜ํ•˜๋ฉด ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. npm @2์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐฉ์‹์€ ์˜์กด์„ฑ์„ ์ค‘์ฒฉ ์„ค์น˜ํ•˜๋ฏ€๋กœ ์„ค์น˜ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ค‘์ฒฉ์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์ด ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด npm @2์˜ ์ด๋Ÿฌํ•œ ๋‹จ์ ๋“ค์ด npm @3์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ ๋˜์—ˆ๊ณ , ๊ทธ๋Ÿผ์—๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ๊ณ„์ง€์ ์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ์š”?

NPM v3

npm @3๋Š” 2015๋…„ 5์›”์˜ beta ๋ฒ„์ „ ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„ 4๋‹ฌ๋’ค 9์›”์— ์ •์‹ ๋ฒ„์ „์œผ๋กœ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

npm @3๋Š” npm @2์™€๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ํ‚ค์›Œ๋“œ๋Š” ๋ฐ”๋กœ, "Flat" ์ž…๋‹ˆ๋‹ค.

Flat...?

image

Flat์„ ๊ฒ€์ƒ‰ํ•˜๋‹ˆ Flat earth๊ฐ€ ๋‚˜์˜ค๋Š” ๊ตฐ์š”... ๊ทธ๋ž˜๋„ Flat์— ๋Œ€ํ•ด์„œ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ฐ€์ ธ์™€ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. (~~์ง€๊ตฌ๋Š” ํ‰ํ‰ํ•˜์ฃ .~~)

npm @3 ์˜ ํŠน์ง•์€ ๋ฐ”๋กœ "Flat"

image ์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ์ข€ ๋” ์ดํ•ด๊ฐ€ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NPM @3์—์„œ๋Š” package๋“ค์„ ๊ฐ€๋Šฅํ•œ flatํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด v2์—์„œ ๋ง์ฝ์ด์—ˆ๋˜, Dependency Hell ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•œ๊ฑฐ์ง€??

image

npm @3์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์ˆœ์„œ(npm v3์—์„œ๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…) ์— ๋”ฐ๋ผ, ํ˜„์žฌ๋Š” package A ๊ฐ€ package C ๋ณด๋‹ค ๋จผ์ € ์„ค์น˜ ๋˜์—ˆ๋Š”๋ฐ์š”, ์ด๋•Œ ๋จผ์ € Flatํ•˜๊ฒŒ top level์— B v1.0์ด ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋˜ํ•œ tree ๊ตฌ์กฐ๋กœ ํ™•์ธํ•ด๋ณธ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

project/
โ””โ”€ node_modules/
โ”‚  โ”œโ”€ A/
โ”‚  โ”‚   โ””โ”€ package.json (A's dependencies: B@v1.0)
โ”‚  โ”œโ”€ B@v1.0/
โ”‚  โ””โ”€ C/
โ”‚  โ”‚   โ”œโ”€ node_modules/
โ”‚  โ”‚   โ”‚   โ””โ”€ B@v2.0/
โ”‚  โ”‚   โ””โ”€ package.json (C's dependencies: B@v2.0)
โ””โ”€ package.json (Project's dependencies: A, B@v1.0 ,C)

npm @2 ์—์„œ์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ node_modules ์˜ top-level์— B ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ด๋ฅผ ํ†ตํ•ด์„œ ์ฐจํ›„์— B@v1.0๊ฐ€ ๋” ์‚ฌ์šฉ๋ ๋•Œ, ๋”์ด์ƒ ํ•˜์œ„ ์˜์กด์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ข€๋” ๊ทธ๋ฆผ์„ ํ†ตํ•ด์„œ ์„ค๋ช… ๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

npm v3์˜ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

image

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์˜์กด์„ฑ์„ ๊ฐ€์ง„ D ํŒจํ‚ค์ง€๋ฅผ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค์— ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

image ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„์‹๋„๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค! ํ˜น์‹œ ์กฐ๊ธˆ ์ด์ƒํ•˜์‹ ๊ฐ€์š”? npm v2์˜ ๋Š๋‚Œ์ด ๋‚˜๋ฉฐ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋Š๋ผ์‹ค๊ฒ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค! npm v3์—์„œ๋Š” "๊ฐ€๋Šฅํ•œ" flatํ•˜๊ฒŒ ๋งŒ๋“œ๋ ค ํ•˜๋ฉฐ , ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ npm v2์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ B v2.0์„ top - level๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, package C ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜์กด์„ฑ์„ ํ•˜์œ„์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด B v1.0์„ ์˜์กด์„ฑ์œผ๋กœ ๊ฐ€์ง€๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด๋ฉฐ ๊ฐœ์„ ์ ์„ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

image
package E๋Š” B v1.0์„ ์˜์กด์„ฑ์œผ๋กœ ๊ฐ€์ง€๋Š” ํŒจํ‚ค์ง€ ์ž…๋‹ˆ๋‹ค. ์ด ๋˜ํ•œ ์ €ํฌ์˜ ์„œ๋น„์Šค์— ์ถ”๊ฐ€ํ•ด๋ณด๋„๋ก ํ•˜์ฃ 

image

B v2.0์„ ์ถ”๊ฐ€ํ• ๋•Œ์™€๋Š” ๋‹ค๋ฅธ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” B v1.0์ด ์ด๋ฏธ top level์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ค์ง„ ๋„์‹๋„ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋„ package A ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•˜์œ„ dependency ์—†์ด ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ B v1.0์„ B v2.0์œผ๋กœ update ์‹œ์ผœ์ฃผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

image

ํ•ด๋‹น ์„œ๋น„์Šค ๋‚ด์—์„œ๋Š” B v2.0๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋”ฑ๋ด๋„ ๊ฐ„์†Œํ™”๋œ package ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm v3์˜ ํ•œ๊ณ„

์–ด๋–ค๊ฐ€์š”? ๊ทธ๋ž˜๋„ npm v2์—์„œ ๋ณด๋‹ค ๋งŽ์€ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์ง„๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค. memory๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋˜ ๋ถ€๋ถ„์ด ์ƒ๋‹น๋ถ€๋ถ„ ๊ฐœ์„ ์ด ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•œ๊ณ„๊ฐ€ ์กด์žฌ ํ•˜๋Š”๋ฐ์š”, ๊ณผ์—ฐ ์–ด๋–ค๊ฒŒ ์žˆ์„๊นŒ์š”??

1. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•„์ง๋„ ํฌ๊ธฐ๋งŒํ•œ node_modules์˜ ํฌ๊ธฐ

image
ํŠธ์œ„ํ„ฐ์—์„œ ๋– ๋„๋Š” node_modules ์œ ๋จธ

๋‹ค๋ฅธ ๊ธ€์—์„œ ์ข€ ๋” ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์ง€๋งŒ, ์•„์ง๋„ node_modules์„ flat ํ•˜๊ฒŒ ํ–ˆ์Œ์—๋„ ์—ฌ์ „ํžˆ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค. ๋‹ค์ˆ˜์˜ ์ƒํ™ฉ์—์„œ node_modules์˜๋ง‰๋Œ€ํ•œ ํฌ๊ธฐ๋กœ ์ธํ•ด์„œ CI ๋“ฑ ์ž‘์—…์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ฌ์ง€์–ด node_modules๋ฅผ ์—†์• ๊ธฐ๋„...(yarn berry)

2. ๋น„ํšจ์œจ์ ์ธ dependency ๊ฒ€์ƒ‰

node_modules ๋‚ด๋ถ€์—์„œ dependency๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” node_modules ๋กœ๋”ฉ ๋ฐฉ๋ฒ• ์„ ํ†ตํ•ด์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธ€์€ node_modules ๋‚ด๋ถ€์—์„œ dependency๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝ์„ ํ•˜์ž๋ฉด

  1. ํ˜„์žฌ ์œ„์น˜์˜ node_modules์—์„œ dependency๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ๋งŒ์•ฝ ๋ชป์ฐพ์•˜๋‹ค๋ฉด... ์ƒ์œ„ ํด๋”์˜ node_modules๋ฅผ ์กฐ์‚ฌํ•˜๋ฉฐ, ์ด ๊ณผ์ •์„ ์ฐพ์„๋•Œ ๊นŒ์ง€ "๋ฐ˜๋ณต" ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ dependency ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธํ•ด์„œ ๋ณต์žกํ•œ node_modules ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” npm์˜ ๊ฒฝ์šฐ ๊ต‰์žฅํžˆ ๊ธด ์‹œ๊ฐ„์„ ์†Œ์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜คํžˆ๋ ค ์—์„œ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” npm @2์—์„œ๋Š” ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ์„ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋“ค์— ๋Œ€ํ•ด์„œ ํ˜„์žฌ ํŒจํ‚ค์ง€๊ฐ€ "๋ชจ๋‘" ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋น„ํšจ์œจ์ ์ธ ๋””์Šคํฌ ํ™œ์šฉ๋ฐฉ๋ฒ•์ด ์ด ๊ฒฝ์šฐ์—” ์˜คํžˆ๋ ค ์œ ๋ฆฌํ•ด์ง„ ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.

3. phantom dependency ์ถœํ˜„

image

์ด ๋„์‹๋„๋Š” ์œ„์—์„œ npm @3์˜ ํšจ์œจ์„ฑ์„ ์„ค๋ช…๋“œ๋ฆฌ๋ฉฐ ๋ง์”€๋“œ๋ ธ๋˜ ๋„์‹๋„ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์„ค๋ช…๋“œ๋ฆด ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ "์œ ๋ น ์˜์กด์„ฑ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” App์„ ์šด์˜ํ•˜๋ฉด์„œ B v2.0์„ ์„ค์น˜ํ•œ์ ์ด ์—†์ง€๋งŒ ๋งˆ์น˜ ์„ค์น˜ํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ”๋กœ flat ํ•˜๊ฒŒ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ phantom dependency๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ์š”, ์ด๋ฅผ ํ†ตํ•ด์„œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๊ณผ ๋ชจํ˜ธํ•จ์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ƒํ™ฉ๊ณผ ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅธ node_modules์˜ ๊ตฌ์กฐ

image ์šฐ๋ฆฌ๊ฐ€ ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” package A ๋ฅผ ์„ค์น˜ํ•œ ์ดํ›„ package C๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

ํ•ด๋‹น ๋„์‹๋„๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ๋ฐ”๋กœ ์ง์ „์—์„œ๋Š” package A๋ฅผ ๋จผ์ € ์„ค์น˜ ํ›„ package C๋ฅผ ์„ค์น˜ ํ•˜์˜€๋Š”๋ฐ, ๋งŒ์•ฝ ์ด๊ฒŒ ์•„๋‹ˆ๋ผ package C๋ฅผ ๋จผ์ € ์„ค์น˜ํ–ˆ๋‹ค๋ฉด, flatํ•˜๊ฒŒ ๋งŒ๋“œ๋ คํ•˜๋Š” npm v3์— ๋”ฐ๋ผ top-level์—๋Š” B v1.0์ด ์•„๋‹Œ B v2.0์ด ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ ์„ค์น˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ node_modules์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

+) ํ•˜์ง€๋งŒ ์ด ์‹œ์ ์—์„œ์˜ ํ•ด๋‹น ๋ฌธ์ œ๋Š” npm @3์—์„œ๋งŒ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ yarn๊ณผ ์„œ๋กœ ๊ฒฝ์Ÿ๊ณผ ์„ฑ์žฅ์„ ๊ฑฐ๋“ญํ•˜๋ฉฐ, package-lock.json ์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜๋ฉฐ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3. Yarn (classic)

image

yarn ์€ 2016๋…„ ์ดํ›„๋กœ ํŽ˜์ด์Šค๋ถ, ๊ตฌ๊ธ€ , Exponent ์™€ ๊ฐ™์€ ํšŒ์‚ฌ๋“ค์˜ ํ˜‘๋ ฅ์œผ๋กœ ์ธํ•ด์„œ ๊ฐœ๋ฐœ๋œ ์ƒˆ๋กœ์šด package manager ์ž…๋‹ˆ๋‹ค. yarn์„ ์‚ฌ์šฉํ•˜๋ฉด ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์—ฌ์ „ํžˆ npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒจํ‚ค์ง€๋ฅผ ๋” ๋นจ๋ฆฌ ์„ค์น˜ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ธฐ๊ณ„์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ์ด ์œ ์ง€๋˜๋Š” ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

before yarn

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ์—†๋˜ ์‹œ์ ˆ์—๋Š” JavaScript ์—”์ง€๋‹ˆ์–ด๋“ค์ด ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ ์ €์žฅ๋˜๋Š” ์†Œ์ˆ˜์˜ ์ข…์†์„ฑ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ CDN์—์„œ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฃผ์š” JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ธ npm์€ Node.js๊ฐ€ ์†Œ๊ฐœ๋œ ์งํ›„์— ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ๊ธˆ์„ธ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ์ˆ˜์ฒœ ๊ฐœ ์ƒ์„ฑ๋˜์—ˆ๊ณ  ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์ด์ „๋ณด๋‹ค ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ npm์—๋„ ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ธฐ๊ธฐ ๋ฐ ์‚ฌ์šฉ์ž ๊ฐ„์— ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋Š” ์ผ๊ด€์„ฑ ๋ฌธ์ œ, ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„, ์ผ๋ถ€ ์ข…์†์„ฑ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” npm ํด๋ผ์ด์–ธํŠธ์˜ ์‹คํ–‰ ๋ฐฉ์‹๊ณผ ๊ด€๋ จ๋œ ๋ณด์•ˆ ๋ฌธ์ œ ๋“ฑ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ, ์ข…์ข… ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹ค๋ฅธ ๊ธฐ๊ธฐ ๋ฐ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ข…์†์„ฑ, ์ฆ‰ non-deterministically(๋น„๊ฒฐ์ •์  - node_modules๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ) ํ˜„์ƒ
  2. install ํ•˜๋Š” ๊ณผ์ •์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ

๊ทธ๋ ‡๋‹ค๋ฉด Yarn์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„๊นŒ์š”?

Solution by Yarn

yarn ์€ npm v3์˜ node_modules์™€ ๊ฐ™์ด flatํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ์ ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ์š”. yarn ์—์„œ๋Š” non-deterministically(๋น„๊ฒฐ์ •์ ) ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, lock ํŒŒ์ผ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ค์น˜ ์ˆœ์„œ์™€ ํ™˜๊ฒฝ, ์‚ฌ์šฉ์ž ๊ฐ„์— ๋ฐœ์ƒํ•˜๋Š” node_modules ๊ตฌ์กฐ์˜ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์ด lock ํŒŒ์ผ ๋‚ด๋ถ€์—๋Š” ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „๊ณผ ์˜์กด์„ฑ ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๊ธฐ๋ก๋œ lock ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ ๊ณผ์ •์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์˜์กด์„ฑ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ์„ค์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  npm ์ง„์˜์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ npm @5๋ถ€ํ„ฐ๋Š” package-lock.json ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

์ฆ‰, ๋™์ผํ•œ lock ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์™„๋ฒฝํžˆ ๋™์ผํ•œ node_modules๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ yarn์—์„œ๋Š” ๋‹ค์Œ์˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋น ๋ฅธ install์„ ๊ตฌํ˜„ํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณ‘๋ ฌ ์„ค์น˜: ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜์กด์„ฑ์„ ๋™์‹œ์— ์„ค์น˜ํ•˜์—ฌ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•จ์œผ๋กœ์จ ์ „์ฒด ์„ค์น˜ ๊ณผ์ •์„ ๋น ๋ฅด๊ฒŒ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  2. ์บ์‹ฑ: ์ด๋ฏธ ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋Š” ๋กœ์ปฌ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ๋‹ค์Œ์— ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์žฌ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์บ์‹ฑ์€ ์ค‘๋ณต ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ํŒจํ‚ค์ง€๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์„ค์น˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  3. ๋นŒ๋“œ ์บ์‹ฑ: ํŒจํ‚ค์ง€ ์„ค์น˜ ์ค‘์— ํ•„์š”ํ•œ ๋นŒ๋“œ ๊ณผ์ •๋„ ์บ์‹ฑํ•˜์—ฌ ์ด์ „์— ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋นŒ๋“œ ๊ณผ์ •์ด ๋”์šฑ ๋น ๋ฅด๊ฒŒ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ณด์•ˆ : yarn.lock์„ ๋จผ์ € ํ™•์ธํ•œ ํ›„, package.json ๊ณผ ๋น„๊ตํ›„ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ๋ฐ”๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” npm์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

    ๊ฒฐ๊ณผ์ ์œผ๋กœ Yarn์€ ๋‹ค์Œ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

โ”œโ”€โ”€ .yarn/   - 1
โ”‚   โ”œโ”€โ”€ cache/   - 2
โ”‚   โ””โ”€โ”€ releases/   - 3
โ”‚       โ””โ”€โ”€ yarn-3.1.1.cjs   - 4
โ”œโ”€โ”€ node_modules/   - 5
โ”œโ”€โ”€ .yarnrc.yml   - 6
โ”œโ”€โ”€ package.json   - 7
โ””โ”€โ”€ yarn.lock   - 8
  1. .yarn/: Yarn ๊ด€๋ จ ์„ค์ • ๋ฐ ์บ์‹œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ํด๋”์ž…๋‹ˆ๋‹ค.
  2. cache/: Yarn์ด ๋‚ด๋ ค๋ฐ›์€ ํŒจํ‚ค์ง€์™€ ๊ด€๋ จ๋œ ์บ์‹œ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  3. releases/: Yarn์˜ ๋‹ค์–‘ํ•œ ๋ฒ„์ „๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  4. yarn-3.1.1.cjs: Yarn ๋ฒ„์ „ 3.1.1์˜ ์‹คํ–‰ ํŒŒ์ผ(cjs ํ˜•์‹)์ž…๋‹ˆ๋‹ค.
  5. node_modules/: ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  6. .yarnrc.yml: Yarn์˜ ์„ค์ • ํŒŒ์ผ์ธ .yarnrc.yml ํŒŒ์ผ๋กœ, ํ”„๋กœ์ ํŠธ์˜ Yarn ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. package.json: ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”ํƒ€ ์ •๋ณด์™€ ์ข…์†์„ฑ์„ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ๋กœ, ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  8. yarn.lock: ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์˜ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ Yarn ๋ฝ ํŒŒ์ผ๋กœ, ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๋ฐ ์˜์กด์„ฑ ํŠธ๋ฆฌ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

yarn vs npm

image ์‚ฌ์ง„์—์„œํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ, ํ•ด๋‹น ๋ ˆํฌ์— gnomon ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฐ ํŒจํ‚ค์ง€์˜ ์ข…๋ฃŒ์‹œ์ ์„ ํ™•์ธํ•œ ๊ฒฐ๊ณผ npm ๋ณด๋‹ค yarn์ด ๋” ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

npm : 37์ดˆ yarn : 26์ดˆ ์ƒ์„ธํ•œ ์ œํ•œ ์กฐ๊ฑด์€ ํ•ด๋‹น repo์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋‹ด

๋ฌผ๋ก  npm์—์„œ๋„ ์ด๋Ÿฐ yarn์˜ ๋…ธ๋ ฅ์— ๋’ค์ง€์ง€ ์•Š๊ณ  npm @5 ๋ถ€ํ„ฐ๋Š” ๊ฑฐ์˜ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง๋„ yarn๊ณผ์˜ ์œ ์˜๋ฏธํ•œ ์†๋„์™€ ์„ฑ๋Šฅ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ yarn ์ด @2๊ฐ€ ์ถœ์‹œ๋˜๊ณ , classic์œผ๋กœ ๋ถ„๋ฅ˜๋˜์–ด ๊ฐœ๋ฐœ์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

Yarn์˜ ํ•œ๊ณ„

yarn์€ npm v3๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ(์†๋„, ๋ณด์•ˆ) ๋“ฑ๋“ฑ์„ ํš๊ธฐ์ ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์•„์ง node_modules๋ฅผ ๊ตฌํ˜„ํ•จ์— ์žˆ์–ด์„œ ๋ง‰๋Œ€ํ•œ ์‹œ๊ฐ„๊ณผ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ์šด package manager ๋“ค์ด ํ•„์š”์„ฑ์ด ๋Œ€๋‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

4. PNPM

image

pnpm์€ ํŒจํ‚ค์ง€ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ, npm๊ณผ ๋น„์Šทํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋…ํŠนํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. pnpm์€ "ํผํฌ๋จผ์Šค"์™€ "๋””์Šคํฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ"์„ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋กœ ๋‚ด์„ธ์šฐ๋ฉฐ, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋“ค๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ์ž‘๋™ ๋ฐฉ์‹์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. flat ํ•œ๊ฒŒ ์ •๋‹ต์ด์—‡์„๊นŒ?
  2. phantom dependency ํ•ด๊ฒฐ

flat ํ•œ๊ฒŒ ์ •๋‹ต์ด์—‡์„๊นŒ?

npm @3 ์™€ yarn์˜ node_modules ๊ตฌ์กฐ๋Š” Flat ํ•œ ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‹น์‹œ์—๋Š” ํš๊ธฐ์ ์ธ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. npm v2 ๊ฐ€ ๊ฐ€์ง€๋Š” ๊ณ ์งˆ์ ์ธ ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šด node_modules ๊ตฌ์กฐ๊ฐ€ ์–ด๋Š์ •๋„ ๊ฐœ์„ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•˜์ง€๋งŒ ์•„์ง ์‚ฐ์žฌํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. phantom dependency ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•„์ง๋„ ๋ฌด๊ฒ๊ณ  ๋Š๋ฆฐ node_modules ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ pnpm ์€ ํš๊ธฐ์ ์ธ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ npm v2์˜ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œํ•œ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” ์„ ํƒ์„ ํ•œ ๊ฒƒ์ด์ฃ . image ๋‹ค์Œ ์‚ฌ์ง„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ pnpm์€ ์•„์ฃผ ๋‹จ์ˆœํ•œ node_modules๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ top-level์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ค์€ ๋ชจ๋‘ ์‹ฌ๋ณผ๋ฆญ๋งํฌ๋กœ .pnpm์˜ ์Šคํ† ์–ด์— ๋‹จ ํ•œ๋ฒˆ๋งŒ ์„ค์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ์— pnpm์„ ํ†ตํ•œ node_modules๋Š” npm๊ณผ yarn์— ๋น„ํ•ด ์ง๊ด€์ ์ธ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

npm - yarn - pnpm ๊ฐ๊ฐ์˜ node_modules

์•„๋ž˜๋Š” pnpm์˜ ๋ชจ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์ž„์˜๋กœ ์ž‘์„ฑํ•œ ํด๋” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

node_modules
โ””โ”€โ”€ .pnpm
    โ”œโ”€โ”€ bar@1.0.0
    โ”‚   โ””โ”€โ”€ node_modules
    โ”‚       โ””โ”€โ”€ bar -> <store>/bar // ๋ณธ์ธ ์Šค์Šค๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    โ”‚           โ”œโ”€โ”€ index.js
    โ”‚           โ””โ”€โ”€ package.json
    โ””โ”€โ”€ foo@1.0.0
        โ””โ”€โ”€ node_modules
            โ””โ”€โ”€ foo -> <store>/foo
                โ”œโ”€โ”€ index.js
                โ””โ”€โ”€ package.json

node_modules ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ํŒŒ์ผ์€ ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ์ง€์ • ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค. bar@1.0.0์— ์˜์กดํ•˜๋Š” foo@1.0.0 ์„ ์„ค์น˜ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. pnpm์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ node_modules ์— ๋งํฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ node_modules์˜ ์œ ์ผํ•œ "์‹ค์ œ" ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ node_modules์— ๋งํฌ๋˜๋ฉด, ์ค‘์ฒฉ๋œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ˆˆ์น˜์ฑ„์…จ๊ฒ ์ง€๋งŒ ๋‘ ํŒจํ‚ค์ง€ ๋ชจ๋‘ node_modules ํด๋” ์•ˆ์˜ ํ•˜์œ„ ํด๋”์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค foo@1.0.0/node_modules/foo. ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

ํŒจํ‚ค์ง€๊ฐ€ ์ž๊ธฐ ์ž์‹ ์— ๋Œ€ํ•œ import๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. foo ๋Š” require('foo/package.json') ๋˜๋Š” import \* as package from "foo/package.json" ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœํ™˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์˜ ์˜์กด์„ฑ์€ ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€์™€ ๋™์ผํ•œ ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. Node.js์˜ ๊ฒฝ์šฐ, ์˜์กด์„ฑ์ด ํŒจํ‚ค์ง€์˜ node_modules ๋‚ด๋ถ€์— ์žˆ๋Š”์ง€ ๋˜๋Š” ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‹ค๋ฅธ node_modules ์— ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋กœ ์ฐจ์ด๋ฅผ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์˜์กด์„ฑ์„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. bar ๋Š” foo@1.0.0/node_modules ํด๋”์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋  ๊ฒ๋‹ˆ๋‹ค.

node_modules
โ””โ”€โ”€ .pnpm
    โ”œโ”€โ”€ bar@1.0.0
    โ”‚   โ””โ”€โ”€ node_modules
    โ”‚       โ””โ”€โ”€ bar -> <store>/bar
    โ””โ”€โ”€ foo@1.0.0
        โ””โ”€โ”€ node_modules
            โ”œโ”€โ”€ foo -> <store>/foo
            โ””โ”€โ”€ bar -> ../../bar@1.0.0/node_modules/bar

๋‹ค์Œ์œผ๋กœ, ์ง์ ‘ ์˜์กด์„ฑ์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. foo ๋Š” ๋ฃจํŠธ node_modules ํด๋”์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” foo ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

node_modules
โ”œโ”€โ”€ foo -> ./.pnpm/foo@1.0.0/node_modules/foo
โ””โ”€โ”€ .pnpm
    โ”œโ”€โ”€ bar@1.0.0
    โ”‚   โ””โ”€โ”€ node_modules
    โ”‚       โ””โ”€โ”€ bar -> <store>/bar
    โ””โ”€โ”€ foo@1.0.0
        โ””โ”€โ”€ node_modules
            โ”œโ”€โ”€ foo -> <store>/foo
            โ””โ”€โ”€ bar -> ../../bar@1.0.0/node_modules/bar

์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ ˆ์ด์•„์›ƒ์€ ์˜์กด์„ฑ ์ˆ˜์™€ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์˜ ๊นŠ์ด์— ๊ด€๊ณ„์—†์ด ์ด ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

bar ๋ฐ foo์˜ ์˜์กด์„ฑ์œผ๋กœ qar@2.0.0 ์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

node_modules
โ”œโ”€โ”€ foo -> ./.pnpm/foo@1.0.0/node_modules/foo
โ””โ”€โ”€ .pnpm
    โ”œโ”€โ”€ bar@1.0.0
    โ”‚   โ””โ”€โ”€ node_modules
    โ”‚       โ”œโ”€โ”€ bar -> <store>/bar
    โ”‚       โ””โ”€โ”€ qar -> ../../qar@2.0.0/node_modules/qar
    โ”œโ”€โ”€ foo@1.0.0
    โ”‚   โ””โ”€โ”€ node_modules
    โ”‚       โ”œโ”€โ”€ foo -> <store>/foo
    โ”‚       โ”œโ”€โ”€ bar -> ../../bar@1.0.0/node_modules/bar
    โ”‚       โ””โ”€โ”€ qar -> ../../qar@2.0.0/node_modules/qar
    โ””โ”€โ”€ qar@2.0.0
        โ””โ”€โ”€ node_modules
            โ””โ”€โ”€ qar -> <store>/qar

๋ณด์‹œ๋‹ค์‹œํ”ผ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋” ๊นŠ์–ด์ง€๋”๋ผ๋„ (foo > bar > qar), ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊นŠ์ด๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ ˆ์ด์•„์›ƒ์€ ์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ์ด์ƒํ•ด๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, Node์˜ ๋ชจ๋“ˆ resolution ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ํ™•์ธํ•  ๋•Œ, Node๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ฌด์‹œํ•˜๋ฏ€๋กœ, foo@1.0.0/node_modules/foo/index.js ์—์„œ bar ๊ฐ€ ํ•„์š”ํ•  ๋•Œ Node๋Š” foo@1.0.0/node_modules/bar ์—์„œ bar ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , bar ๋Š” ์‹ค์ œ ์œ„์น˜๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค(bar@1.0.0/node_modules/bar). ๊ฒฐ๊ณผ์ ์œผ๋กœ, bar ๋Š” bar@1.0.0/node_modules์— ์žˆ๋Š” ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

phantom dependency ํ•ด๊ฒฐ

image ๋˜ํ•œ pnpm์—์„œ๋Š” npm๊ณผ yarn์—์„œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ถˆํ•„์š”ํ•œ ํŽ˜ํ‚ค์ง€๋“ค์„ top-level์— ์˜ฌ๋ฆฌ์ง€ ์•Š์•„ phantom dependency๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. yarn berry

Yarn Berry๋Š” Yarn์˜ ์ตœ์‹  ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. Yarn์ด ์›๋ž˜๋Š” npm์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ณ ์ž ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด, Berry๋Š” ์ด์ œ ๊ทธ ์ž์ฒด๋กœ ๊ฐ•๋ ฅํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์ด ๋ฒ„์ „์—์„œ๋Š” Plug'n'Play (PnP)๋ผ๊ณ  ํ•˜๋Š” ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€ ๋กœ๋”ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” Yarn Berry์™€ PnP์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด Yarn๊ณผ Yarn Berry์˜ ์ฐจ์ด์ 

  1. ํ™˜๊ฒฝ ์„ค์ •: Yarn Berry์—์„œ๋Š” .yarnrc.yml ํ˜•์‹์˜ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋”์šฑ ์œ ์—ฐํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  2. ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜: Yarn Berry๋Š” ์ƒˆ๋กœ์šด ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•ด ๊ธฐ๋Šฅ ํ™•์žฅ์ด ๋”์šฑ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

    Yarn Berry์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, Yarn Berry์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜์˜ ๋„์ž…์œผ๋กœ ์ธํ•ด, ์ปค๋ฎค๋‹ˆํ‹ฐ๋‚˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ Yarn Berry์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณต์žกํ•œ ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ๋ช…๋ น์–ด๋‚˜, ํŠน์ • ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์™€ ์—ฐ๋™ํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋‚˜ ํŒ€์€ ์ž์‹ ๋“ค์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๋งž์ถคํ˜• ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด, ํ”„๋กœ์ ํŠธ์˜ ํšจ์œจ์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ํ† ์Šค yarn plugin repo ์—์„œ๋Š” workspace๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ๊ฐœ๋ฐœํ•ด ์‚ฌ์šฉ์ค‘์ž…๋‹ˆ๋‹ค.

  3. PnP (Plug'n'Play): Yarn Berry์—์„œ ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๋Š” PnP ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๋„์ž…์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง€๊ณ , ๋””์Šคํฌ ๊ณต๊ฐ„๊ณผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. yarn berry pnp ์„ค๋ช…

  4. Zero-Installs: Yarn Berry๋Š” Zero-Installs ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋ฅผ ์บ์‹ฑ, ์ด๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ ์„ค์น˜ ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Plug'n'Play (PnP): ์ž‘๋™ ์›๋ฆฌ

Yarn Berry์˜ Plug'n'Play (PnP)๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ "ํ”Œ๋Ÿฌ๊ทธ ์•ค ํ”Œ๋ ˆ์ด"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ ์•ค ํ”Œ๋ ˆ์ด ๊ธฐ์ˆ ์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ธ์‹๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, Yarn์˜ PnP์—์„œ๋„ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์„ ์ฐจ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ "ํ”Œ๋Ÿฌ๊ทธ"ํ•ด๋†“์œผ๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณต์žกํ•œ ์„ค์ •์ด๋‚˜ ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด๋„ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

PnP์˜ ์ž‘๋™ ์›๋ฆฌ ์ƒ์„ธ

ํ† ์Šค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ์—์„œ ์ฒ˜๋Ÿผ .pnp.cjs์—์„œ react๋ฅผ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด react์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์ •๋ณด๊ฐ€ ๋ณด์ด๋ฉฐ, .yarn์˜ ์–ด๋Š ์œ„์น˜์— cacheํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด์žˆ๋Š”์ง€ ์•„์ฃผ ์‰ฝ๊ฒŒํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” pnp์˜ ์ƒ์„ธํ•œ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  1. .pnp.js ํŒŒ์ผ: Yarn์€ .pnp.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€์™€ ๊ทธ ํŒจํ‚ค์ง€๋“ค์˜ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ์ข…์˜ "๋งต"์ด๋ฉฐ, Node.js๊ฐ€ ์ด ํŒŒ์ผ์„ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋กœ๋“œํ• ์ง€ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  2. ํ”Œ๋Ÿฌ๊ทธ ์•ค ํ”Œ๋ ˆ์ด ๋กœ๋”: Yarn์€ ์ž์ฒด์ ์ธ ๋กœ๋”๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด node_modules ํด๋”๊ฐ€ ํ•„์š” ์—†์–ด์ง€๋ฉฐ, ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ๋‹จ์ˆœํ™”๋ฉ๋‹ˆ๋‹ค.

  3. Virtual File System (VFS): ์‹ค์ œ ํŒŒ์ผ์ด ๋””์Šคํฌ์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ ๋„, .pnp.js ํŒŒ์ผ์„ ํ†ตํ•ด ๊ฐ€์ƒ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ƒ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์‹ค์ œ ํŒŒ์ผ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ, ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ

์ „ํ†ต์ ์ธ(yarn) node_modules ํด๋” ๊ตฌ์กฐ

my_project/
โ”œโ”€โ”€ node_modules/
โ”‚   โ”œโ”€โ”€ lodash/
โ”‚   โ”œโ”€โ”€ express/
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ package-lock.json

Yarn PnP ํด๋” ๊ตฌ์กฐ


my_project/
โ”œโ”€โ”€ .pnp.js (๋˜๋Š” .pnp.cjs)
โ”œโ”€โ”€ .yarn/
โ”‚   โ”œโ”€โ”€ cache/
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ .yarnrc.yml
โ””โ”€โ”€ yarn.lock

์œ„๋Š” npm์„ ๋น„๋กฏํ•œ ๋‹ค๋ฅธ node ํŽ˜ํ‚ค์ง€์™€์˜ ๋น„๊ตํ•˜๋Š” ํด๋”๊ตฌ์กฐ๋ฅผ ์ ์–ด๋ณด์•—์Šต๋‹ˆ๋‹ค.

yarn-berry์˜ ๊ฐ•์ 

  1. ์„ค์น˜ ์‹œ๊ฐ„: ๊ธฐ์กด์˜ Yarn์ด๋‚˜ npm์—์„œ๋Š” node_modules ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ํŒŒ์ผ์„ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฏ€๋กœ ์„ค์น˜ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PnP๋Š” .pnp.js ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์„ค์น˜ ์‹œ๊ฐ„์ด ๋Œ€ํญ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

  2. ๋””์Šคํฌ ๊ณต๊ฐ„: node_modules ๋ฐฉ์‹์€ ๋™์ผํ•œ ํŒจํ‚ค์ง€๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณ„๋„๋กœ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋งŽ์ด ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. PnP๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ค‘์•™ํ™”๋œ ์บ์‹œ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

zero install

Yarn Berry์˜ "Zero-Installs" ๊ธฐ๋Šฅ์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์˜์กด์„ฑ ์„ค์น˜ ์—†์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. ์‹œ๊ฐ„ ์ ˆ์•ฝ: ์˜์กด์„ฑ ์„ค์น˜ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ผ๊ด€์„ฑ: ์˜์กด์„ฑ์ด ํ”„๋กœ์ ํŠธ์— ๋ฏธ๋ฆฌ "๋ด‰์ธ"๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋‚˜ CI/CD ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผํ•œ ์˜์กด์„ฑ์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ์›๋ฆฌ

  1. ์˜์กด์„ฑ ์บ์‹ฑ: ์ฒซ ์„ค์น˜ ์‹œ์— Yarn์€ .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์— ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. .pnp.js ํŒŒ์ผ: Yarn Berry์˜ PnP (Plug'n'Play) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ .pnp.js ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์˜์กด์„ฑ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์–ด์„œ, Node.js๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋กœ๋“œํ• ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์บ์‹œ ํฌํ•จ: .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์™€ .pnp.js ํŒŒ์ผ์„ Git ๊ฐ™์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋‚˜ CI/CD ํ™˜๊ฒฝ์—์„œ๋Š” yarn install์„ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋–ค ๋ฉ‹์ง„ ๊ฐœ๋ฐœ์ž ๋ถ„๊ป˜์„œ๋Š” ์ผ๋ฐ˜์ ์ธ npmํ™˜๊ฒฝ์—์„œ๋„ node_modules๋ฅผ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ํฌํ•จ ํ•˜์—ฌ zero-install์„ ์ˆ˜ํ–‰ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ํฅ๋ฏธ๋กœ์šด ์ ‘๊ทผ๋ฒ•์ด๋ผ ์ถ”๊ฐ€ํ•ด๋ด…๋‹ˆ๋‹ค. node_modules๋„ git์—์„œ๋„ ๊ด€๋ฆฌํ•˜๋ฉด ์–ด๋–จ๊นŒ?

yarn patch

yarn berry์˜ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” patch๋ฅผ ์ด์šฉํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ง๋ฐฉ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ ์—์„œ yarn patch๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์˜ค๋ฅ˜๋ฅผ ์ž˜ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+) yarn-berry๋Š” yarn-classic ์œ„์—์„œ ๋™์ž‘ํ•œ๋‹ค๊ตฌ?

[Yarn berry] Yarn Berry ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ดํ•ด๋„ ๋†’์ด๊ธฐ yarn-berry์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด์„œ ๊นŠ๊ฒŒ ์‹ค์Šตํ•ด๋ณด์‹  ๋ถ„์˜ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ™•์ธํ•ด๋ณด์ง„ ์•Š์•„, ์ •ํ™•๋„๋ฅผ ํŒ๋‹จํ•˜๊ธด ํž˜๋“œ๋‚˜. ์ด ๊ธ€์„ ์ฐธ๊ณ ๋กœ ํ•™์Šตํ•ด๋ณด์‹œ๋ฉฐ ์ด ๊ธ€์„ ๊ฒ€์ฆํ•ด๋ณด๋Š”๊ฒƒ์€ ์–ด๋–จ๊นŒ ์‹ถ์–ด์„œ ์ถ”๊ฐ€ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

6. ์‹ค์ œ ์‹ค์Šต์„ ํ†ตํ•œ ์‹ค์ œ ํ™•์ธ

์ž ์ด์ œ ๋Œ€๋ง์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋ชจ๋“  ๊ณต๋ถ€๋Š” ์ด ํ•œ๋ฒˆ์˜ ์‹ค์Šต์„ ์œ„ํ•จ์ด์—ˆ์Šต๋‹ˆ๋‹ค

๊ผญ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๊ฑฐ๋“ ์š”! '

pnpm benchmark์—์„œ pnpm์˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ง€ํ‘œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณตํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก  pnpm์˜ ๊ณต์‹ ํŽ˜์ด์ง€์—์„œ ๊ณต๊ฐœํ•œ ๋งŒํผ pnpm์˜ ๋‹ค์†Œ ์น˜์šฐ์ณ์ง„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์„์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ํ•จ๋ฆฌ์ ์ธ ์˜์‹ฌ์ด ๋“ค๊ธด ํ•˜์ง€๋งŒ ๋ณดํŽธ์ ์œผ๋กœ, npm๊ณผ yarn ์ด pnpm๊ณผ yarn berry์— ๋น„ํ•ด ๋‚ฎ์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š”๊ฒƒ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์‹ค์ œ ์‹ค์Šต ๊ฒฐ๊ณผ๋ฌผ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  pm์ด ๋™์ผํ•œ dependency๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ž์„ธํ•œ ์„ค์ •์— ๋Œ€ํ•ด์„œ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด [repo] (https://github.com/adultlee/study-package-manager)์— ๋ฐฉ๋ฌธํ•ด์ฃผ์„ธ์š”! ํ˜น์€ ์ด์Šˆ๋กœ ์ˆ˜์ •์‚ฌํ•ญ์„ ๋ง์”€ํ•ด์ฃผ์‹ ๋‹ค๋ฉด ์ ๊ทน ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

node_modules์™€ lock ํŒŒ์ผ ๋ชจ๋‘ ์ œ๊ฑฐ

๋‹ค์Œ์€ node_modules์™€ lock ํŒŒ์ผ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ดˆ๊ธฐ ์•„๋ฌด๋Ÿฐ ์…‹ํŒ…์ด ์—†๋Š” ๊ฒฝ์šฐ ์†๋„

NPM : 28.0653์ดˆ

yarn : 24.7420์ดˆ

pnpm : 16.1702์ดˆ

yarn-berry - node_modules๋ฅผ ์ œ๊ฑฐ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

node_modules๋งŒ ์ œ๊ฑฐ(์ผ๋ฐ˜์ ์ธ ๋ฒ„์ „๊ด€๋ฆฌ์‹œ์Šคํ…œ์ธ ๊ฒฝ์šฐ)

๋‹ค์Œ์€ node_modules๋งŒ ์ œ๊ฑฐํ•œ, ๋ฒ„์ „๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—๋งŒ ์˜ฌ๋ผ๊ฐ„ ํŒŒ์ผ๋กœ๋งŒ ํŽ˜ํ‚ค์ง€๋ฅผ ์žฌ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.

NPM : 9.2617์ดˆ

yarn : 8.8993์ดˆ

pnpm : 11.1695์ดˆ

yarn-berry : 0.6344์ดˆ

์ œ๊ฐ€ ์œ„์—์„œ ๋ดค๋˜๋ฐ๋กœ... ์—ญ์‹œ๋‚˜ ์••๋„์ ์ธ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ์Šค์—์„œ ๊ธฐ์ˆ ํ•œ๋ฐ๋กœ ๋ง์ด์ฃ ... ๋ฐ˜์ „์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋žฌ์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ ์ด๋ฒˆ์€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค! (์—ฌ๊ธฐ์„œ ์‚ฌ์‹ค ์••๋„์ ์ธ ์„ฑ๋Šฅ์ด ์ผ์–ด๋‚œ ๊นŒ๋‹ญ์€, yarn-berry๋Š” ์‚ฌ์‹ค์ƒ node_modules๋ฅผ ์••์ถ•ํ•ด์„œ ๋ฒ„์ „๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”. ์ผ๋ฐ˜์ ์ธ node ํ”„๋กœ์ ํŠธ์˜ node_modules๋„ ๋ฒ„์ „๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด "์†๋„"๋Š” ๋น„์Šทํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์™€ ๊ทœ๋ชจ์—์„œ ์ข‹์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ฒฐ๋ก 

์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋˜๊ฒƒ ๋งŒํผ pnpm์˜ ๋ฒค์น˜๋งˆํฌ์—์„œ ์ œ์‹œํ•œ ์„ฑ๋Šฅ์ด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค node_modules๋งŒ ์ œ๊ฑฐํ•œ ์ƒํƒœ์—์„œ package-lock.json ์ฆ‰ lock ํŒŒ์ผ๋งŒ ๊ฐ€์ง€๊ณ  ๊ตฌ์„ฑํ•จ์— ์žˆ์–ด์„œ๋Š” ์ผ๋ถ€ ์‹œํ–‰์— ์žˆ์–ด์„œ๋Š” pnpm์ด ๋ถ€๋ถ„์ ์œผ๋กœ ๋” ๋Š๋ฆฌ๊ธฐ๊นŒ์ง€ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ฐ–์—๋Š” ์–ด๋Š์ •๋„ ์˜ˆ์ƒํ•œ ์ง€ํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ตฌํ˜„์ด ๋˜์—ˆ์œผ๋ฉฐ, ์‹ค์ œ๋กœ pm ๋ณ„๋กœ ๊ตฌ์„ฑ๋˜๋Š” node_modules๋ฅผ ๋น„๋กฏํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ๊นŠ๊ฒŒ ํ•™์Šตํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์‰ฝ์ง€๋งŒ, ์šฐ์„  ์—ฌ๊ธฐ์„œ ๊ธ€์„ ๋ฉˆ์ถ”๊ณ  ์ œ๊ฐ€ ๋†“์นœ๊ฒƒ๋“ค์„(ํ™˜๊ฒฝ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ต์ œํ•ด ๋ณ€์ธ์„ ๋ชจ๋‘ ํ™•์ธ) ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๋ถ€๋ฅผ ๋– ๋‚˜๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์†Œ ๋‘์„œ ์—†๋Š” ๊ธ€์ด๊ธด ํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ํ•œ๋ช…์ด๋ผ๋„ ์ฆ๊ฒ๊ฒŒ ์ฝ์–ด์ฃผ์‹ ๋‹ค๋ฉด, ์ด ๋˜ํ•œ ์˜๋ฏธ์žˆ์œผ๋ฆฌ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค! ๋ชจ๋‘๋“ค ์ฆ๊ฑฐ์šด ํ•˜๋ฃจ๋˜์‹œ๊ธธ๐Ÿ˜Š

Reference

ยฉ 2023 Adultlee. All rights reserved.Made with โค by ์ด์„ฑ์ธ