๐Ÿ“ฆ pnpm ๋ฉ˜ํƒˆ ๋ชจ๋ธ โ€” npm์ด ๋ชป ํ‘ผ ๋ฌธ์ œ๋ฅผ pnpm์€ ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋Š”๊ฐ€

2026๋…„ 3์›” 20์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

content-addressable store, ํ•˜๋“œ๋งํฌ, ์„ค์น˜ ์†๋„์˜ ๋น„๋ฐ€๊นŒ์ง€ โ€” pnpm์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ๊ณผ ์ฒ ํ•™์„ ์ดํ•ดํ•œ๋‹ค

01. pnpm ๋ฉ˜ํƒˆ ๋ชจ๋ธ

๐Ÿ“‹ ๋ชฉ์ฐจ

  1. pnpm ์„ค์น˜ & ํ”„๋กœ์ ํŠธ ์ฒซ ์„ธํŒ…
  2. ์ด์ •๋ฆฌ
  3. ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ
  4. ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ
  5. ๋” ์•Œ์•„๋ณด๊ธฐ

๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: ์•ฝ 25๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 12๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„

[npm์˜ ๋ฌธ์ œ ์ธ์‹] โ†’ [content-addressable store ์›๋ฆฌ] โ†’ [ํ•˜๋“œ๋งํฌ/์‹ฌ๋งํฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜] โ†’ [์„ค์น˜ ํŒŒ์ดํ”„๋ผ์ธ] โ†’ [์ฒซ ์„ธํŒ…]

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • npm๊ณผ pnpm์˜ ๊ทผ๋ณธ์ ์ธ ์ €์žฅ ๋ฐฉ์‹ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • content-addressable store ๊ฐ€ ์™œ ๋””์Šคํฌ๋ฅผ ์ ˆ์•ฝํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํ•˜๋“œ๋งํฌ์™€ ์‹ฌ๋งํฌ์˜ ์—ญํ•  ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • pnpm ์„ ์„ค์น˜ํ•˜๊ณ  Next.js ํ”„๋กœ์ ํŠธ์— ์ฒซ ์„ธํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

์˜์ฒ ์ด์™€ ์˜ํ˜ธ์˜ pnpm ์ด์•ผ๊ธฐ
  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์˜ํ˜ธ ๋‹˜, ์ € ์š”์ฆ˜ ํ”„๋กœ์ ํŠธ 3๊ฐœ๋ฅผ ๋™์‹œ์— ์ž‘์—… ์ค‘์ธ๋ฐ์š”... SSD ์šฉ๋Ÿ‰์ด ์ž๊พธ ์ค„์–ด๋“ค์–ด์š”. node_modules ๊ฐ€ ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์ˆ˜๋ฐฑ MB ์”ฉ ๋จน๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๋ฆฌ๊ณ  npm install ํ•  ๋•Œ๋งˆ๋‹ค ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ์ ์‹ฌ ๋จน๊ณ  ์™€๋„ ์•„์ง๋„ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์„ ๋•Œ๊ฐ€ ์žˆ๊ฑฐ๋“ ์š”. pnpm ์ด ๋น ๋ฅด๋‹ค๋Š” ๋ง์€ ๋“ค์–ด๋ดค๋Š”๋ฐ ๊ทธ๋ƒฅ npm ์ด๋ž‘ ๋ช…๋ น์–ด๋งŒ ๋น„์Šทํ•œ ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, npm ์€ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค node_modules ์— ํŒจํ‚ค์ง€ ํŒŒ์ผ์„ ๋ณต์‚ฌ ํ•ด์š”. ํ”„๋กœ์ ํŠธ๊ฐ€ 10๊ฐœ๋ฉด react ๋„ 10๋ฒˆ ๋ณต์‚ฌ๋˜๋Š” ๊ฑฐ์ฃ . pnpm ์€ ๋‹ฌ๋ผ์š” โ€” ํŒŒ์ผ์„ ๋”ฑ ํ•œ ๋ฒˆ ์ €์žฅํ•˜๊ณ  ํ•˜๋“œ๋งํฌ๋กœ ์—ฐ๊ฒฐํ•ด์š”. ํŒŒ์ผ์ด ๋ณต์‚ฌ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ '๋™์ผ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ' ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑฐ๋ผ์„œ ๋””์Šคํฌ ๊ณต๊ฐ„์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š์•„์š”. ์„ค์น˜ ์†๋„๋„ ์ €์žฅ๋œ ์บ์‹œ์—์„œ ํ•˜๋“œ๋งํฌ๋งŒ ์ƒ์„ฑํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ ํ›จ์”ฌ ๋น ๋ฅด๊ณ ์š”."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒ€์˜ ์–ด๋А ์›”์š”์ผ ์•„์นจ

์˜์ฒ ์ด๊ฐ€ ์ถœ๊ทผํ•ด์„œ ๋…ธํŠธ๋ถ์„ ์—ด์—ˆ๋”๋‹ˆ ์•Œ๋ฆผ์ด ๋–ด๋‹ค.

"๋””์Šคํฌ ๊ณต๊ฐ„ ๋ถ€์กฑ: ๋‚จ์€ ๊ณต๊ฐ„ 2.3GB"

๋‹นํ™ฉํ•ด์„œ ์šฉ๋Ÿ‰์„ ํ™•์ธํ•ด ๋ณด๋‹ˆ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— projects/ ํด๋”๋งŒ 22GB ๋ฅผ ๋จน๊ณ  ์žˆ์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ํด๋” ์•ˆ์„ ๋“ค์—ฌ๋‹ค๋ดค๋‹ค.

projects/
โ”œโ”€โ”€ youngsu-community/node_modules/   (487MB)
โ”œโ”€โ”€ youngsu-admin/node_modules/       (312MB)
โ”œโ”€โ”€ youngsu-landing/node_modules/     (298MB)
โ”œโ”€โ”€ personal-blog/node_modules/       (445MB)
โ””โ”€โ”€ side-project/node_modules/        (391MB)

ํ•ฉ์น˜๋ฉด ๊ฑฐ์˜ 2GB ๊ฐ€ node_modules ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ”„๋กœ์ ํŠธ ์•ˆ์„ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด react@18, typescript, eslint ๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฒ„์ „ ์œผ๋กœ ๋‹ค์„ฏ ๋ฒˆ์”ฉ ๋ณต์‚ฌ๋˜์–ด ์žˆ๋‹ค.

์ด๊ฒƒ์ด npm ์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ด๊ณ , pnpm ์ด ํƒ„์ƒํ•œ ์ด์œ ๋‹ค.


๐Ÿ’พ npm์˜ ๊ณ ์งˆ์ ์ธ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ

๋ฌธ์ œ 1: ๋””์Šคํฌ ๊ณต๊ฐ„ ๋‚ญ๋น„ (์ค‘๋ณต ๋ณต์‚ฌ)

npm ์€ node_modules ๋ฅผ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณต์‚ฌ ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ A/node_modules/react/  โ†’ react ํŒŒ์ผ ์ „์ฒด ๋ณต์‚ฌ (1.2MB)
ํ”„๋กœ์ ํŠธ B/node_modules/react/  โ†’ react ํŒŒ์ผ ์ „์ฒด ๋ณต์‚ฌ (1.2MB) โ† ์™„์ „ํžˆ ๋™์ผ!
ํ”„๋กœ์ ํŠธ C/node_modules/react/  โ†’ react ํŒŒ์ผ ์ „์ฒด ๋ณต์‚ฌ (1.2MB) โ† ๋˜ ๋™์ผ!

๋ฒ„์ „์ด ๊ฐ™์€ ํŒจํ‚ค์ง€๋„ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋ณต์‚ฌํ•œ๋‹ค. 100๊ฐœ ํ”„๋กœ์ ํŠธ์—์„œ lodash@4.17.21 ์„ ์“ด๋‹ค๋ฉด, ๋””์Šคํฌ ์–ด๋”˜๊ฐ€์— lodash ๊ฐ€ 100๊ฐœ ์กด์žฌํ•œ๋‹ค.

๋ฌธ์ œ 2: ํŒฌํ…€ ์˜์กด์„ฑ (Phantom Dependency)

npm v3 ์ดํ›„ node_modules ๋ฅผ ํ‰ํƒ„ํ™”(hoisting) ํ•˜๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ๋ชจ๋“  ํŒจํ‚ค์ง€์™€ ๊ทธ ํ•˜์œ„ ์˜์กด์„ฑ์„ node_modules ๋ฃจํŠธ๋กœ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค.

node_modules/
โ”œโ”€โ”€ react/           โ† package.json ์— ์ง์ ‘ ๋ช…์‹œ โœ…
โ”œโ”€โ”€ loose-envify/    โ† react์˜ ์˜์กด์„ฑ์ธ๋ฐ ๋ฃจํŠธ๋กœ ํ˜ธ์ด์ŠคํŒ…๋จ โš ๏ธ
โ””โ”€โ”€ js-tokens/       โ† loose-envify์˜ ์˜์กด์„ฑ์ธ๋ฐ ๋ฃจํŠธ๋กœ ํ˜ธ์ด์ŠคํŒ…๋จ โš ๏ธ

์ด๋ ‡๊ฒŒ ๋˜๋ฉด package.json ์— ๋ช…์‹œํ•˜์ง€ ์•Š์€ loose-envify ๋ฅผ ์ฝ”๋“œ์—์„œ import ํ•ด๋„ ๋™์ž‘ํ•œ๋‹ค. ์ด๊ฒƒ์ด ํŒฌํ…€ ์˜์กด์„ฑ ์ด๋‹ค.

์™œ ์œ„ํ—˜ํ•œ๊ฐ€:

// ๐Ÿฃ ์˜์ฒ ์ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ โ€” ๋‹น์žฅ์€ ๋™์ž‘ํ•œ๋‹ค
import looseEnvify from 'loose-envify';
 
// ๊ทธ๋Ÿฌ๋‚˜ react ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€์„œ loose-envify๋ฅผ ๋” ์ด์ƒ ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉด?
// โ†’ ์ด import ๋Š” "ํŒจํ‚ค์ง€ ์—†์Œ" ์—๋Ÿฌ๋กœ ๋นŒ๋“œ ์‹คํŒจ
// โ†’ ์˜์ˆ˜ ๋‹˜ ํ˜ธํ†ต: "๋ฐฐํฌ ์ง์ „์— ์™œ ๋นŒ๋“œ๊ฐ€ ์•ˆ ๋˜๋ƒ๊ณ ์š”!"

๐Ÿช content-addressable store โ€” pnpm์˜ ํ˜์‹ 

๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด๋ž€

pnpm ์€ ํŒจํ‚ค์ง€ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด(Content-Addressable Store) ์— ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ €์žฅํ•œ๋‹ค.

~/.pnpm-store/
โ””โ”€โ”€ v3/
    โ””โ”€โ”€ files/
        โ”œโ”€โ”€ 00/
        โ”‚   โ””โ”€โ”€ a4f3e2...  โ† SHA-512 ํ•ด์‹œ๊ฐ€ ํŒŒ์ผ๋ช… (react์˜ index.js)
        โ”œโ”€โ”€ 01/
        โ”‚   โ””โ”€โ”€ b7c8d9...  โ† react์˜ package.json
        โ””โ”€โ”€ ff/
            โ””โ”€โ”€ 1a2b3c...  โ† lodash์˜ fp.js

ํ•ต์‹ฌ ์›๋ฆฌ: ํŒŒ์ผ์˜ ๋‚ด์šฉ(Content)์ด ์ฃผ์†Œ(Address)๊ฐ€ ๋œ๋‹ค.

ํŒŒ์ผ ๋‚ด์šฉ์˜ SHA-512 ํ•ด์‹œ๊ฐ’์ด ์Šคํ† ์–ด ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด ํ•ด์‹œ๊ฐ’์ด ๊ฐ™์œผ๋ฏ€๋กœ, ์™„์ „ํžˆ ๋™์ผํ•œ ํŒŒ์ผ์€ ์Šคํ† ์–ด์— ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌ ํ•œ๋‹ค.

react@18.2.0 ์˜ index.js ๋‚ด์šฉ โ†’ SHA-512 ํ•ด์‹œ โ†’ 00/a4f3e2...
react@18.2.1 ์˜ index.js ๊ฐ€ ๋‹ฌ๋ผ์ง„ ์ค„์ด ์žˆ์œผ๋ฉด โ†’ ๋‹ค๋ฅธ ํ•ด์‹œ โ†’ 01/x9y8z7...

๊ฒฐ๋ก : react@18.2.0 ๊ณผ 18.2.1 ์ด 1๊ฐœ์˜ ํŒŒ์ผ๋งŒ ๋‹ค๋ฅด๋‹ค๋ฉด,
      ์Šคํ† ์–ด์—๋Š” ๋‹ค๋ฅธ 1๊ฐœ ํŒŒ์ผ๋งŒ ์ถ”๊ฐ€๋œ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๊ณต์œ .

์Šคํ† ์–ด ์œ„์น˜ ํ™•์ธ

pnpm store path
# /home/user/.pnpm-store/v3

๐Ÿ”— ํ•˜๋“œ๋งํฌ vs ์‹ฌ๋งํฌ โ€” ๋‘ ๊ฐœ์˜ ๋ฌด๊ธฐ

pnpm ์€ ์Šคํ† ์–ด์—์„œ node_modules ๋กœ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ๋‘ ์ข…๋ฅ˜์˜ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด์˜ ํŒŒ์ผ
~/.pnpm-store/v3/files/00/a4f3e2...
         โ†• ํ•˜๋“œ๋งํฌ (๋™์ผ inode, ๋™์ผ ํŒŒ์ผ ๋ฐ์ดํ„ฐ)
ํ”„๋กœ์ ํŠธ/node_modules/.pnpm/react@18.2.0/node_modules/react/index.js

ํ•˜๋“œ๋งํฌ์˜ ํŠน์„ฑ:

  • ๊ฐ™์€ ํŒŒ์ผ ๋ฐ์ดํ„ฐ(inode)๋ฅผ ๋‘ ๊ฒฝ๋กœ๊ฐ€ ๋™์‹œ์— ๊ฐ€๋ฆฌํ‚จ๋‹ค
  • ์–ด๋А ์ชฝ์„ ๋ด๋„ ๋™์ผํ•œ ๋‚ด์šฉ
  • ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ํฌ์ธํ„ฐ๋งŒ ์ถ”๊ฐ€๋จ
  • ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•ด๋„ ๋‚˜๋จธ์ง€ ๊ฒฝ๋กœ์—์„œ ํŒŒ์ผ์ด ์œ ์ง€๋จ
# ์‹ค์ œ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด
ls -li node_modules/.pnpm/react@18.2.0/node_modules/react/index.js
# 78453201 ... index.js
 
ls -li ~/.pnpm-store/v3/files/00/a4f3e2...
# 78453201 ... a4f3e2...  โ† inode ๋ฒˆํ˜ธ๊ฐ€ ๋™์ผ!
ํ”„๋กœ์ ํŠธ/node_modules/react
         โ†• ์‹ฌ๋งํฌ (๋ฐ”๋กœ๊ฐ€๊ธฐ)
ํ”„๋กœ์ ํŠธ/node_modules/.pnpm/react@18.2.0/node_modules/react/

์‹ฌ๋งํฌ์˜ ํŠน์„ฑ:

  • Windows ๋ฐ”๋กœ๊ฐ€๊ธฐ ์•„์ด์ฝ˜๊ณผ ๊ฐ™์€ ๊ฐœ๋…
  • ์›๋ณธ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
  • node_modules ๋ฃจํŠธ์—๋Š” ์ง์ ‘ ์˜์กด์„ฑ๋งŒ ์‹ฌ๋งํฌ๋กœ ๋“ฑ์žฅ

์ „์ฒด ๊ตฌ์กฐ ๋‹ค์ด์–ด๊ทธ๋žจ

ํ”„๋กœ์ ํŠธ/node_modules/
โ”œโ”€โ”€ react โ†’ .pnpm/react@18.2.0/node_modules/react  (์‹ฌ๋งํฌ โœ… ์ง์ ‘ ์˜์กด์„ฑ)
โ”œโ”€โ”€ next  โ†’ .pnpm/next@14.2.0/node_modules/next    (์‹ฌ๋งํฌ โœ… ์ง์ ‘ ์˜์กด์„ฑ)
โ””โ”€โ”€ .pnpm/
    โ”œโ”€โ”€ react@18.2.0/node_modules/
    โ”‚   โ”œโ”€โ”€ react/          โ†’ ํ•˜๋“œ๋งํฌ โ†’ ~/.pnpm-store/...
    โ”‚   โ””โ”€โ”€ loose-envify/   โ†’ ํ•˜๋“œ๋งํฌ โ†’ ~/.pnpm-store/...
    โ””โ”€โ”€ next@14.2.0/node_modules/
        โ”œโ”€โ”€ next/           โ†’ ํ•˜๋“œ๋งํฌ โ†’ ~/.pnpm-store/...
        โ””โ”€โ”€ ...

๊ฒฐ๋ก :
- node_modules ๋ฃจํŠธ์—๋Š” package.json ์— ์ ์€ ํŒจํ‚ค์ง€๋งŒ ๋ณด์ž„
- loose-envify ๊ฐ™์€ ๊ฐ„์ ‘ ์˜์กด์„ฑ์€ ๋ฃจํŠธ์—์„œ ๋ณด์ด์ง€ ์•Š์Œ โ†’ ํŒฌํ…€ ์˜์กด์„ฑ ์›์ฒœ ์ฐจ๋‹จ

๐Ÿš€ pnpm ์„ค์น˜ 3๋‹จ๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ

npm ์€ "์˜์กด์„ฑ ํ•ด๊ฒฐ โ†’ ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ โ†’ ์„ค์น˜" ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, pnpm ์€ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐฉ์‹ ์œผ๋กœ ์„ธ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌํ™”ํ•œ๋‹ค.

npm ๋ฐฉ์‹ (์ˆœ์ฐจ):
[Resolve ์ „์ฒด ์™„๋ฃŒ] โ†’ [Fetch ์ „์ฒด ์™„๋ฃŒ] โ†’ [Write ์ „์ฒด ์™„๋ฃŒ]
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
ํŒจํ‚ค์ง€ A: Resolve โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Fetch โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Write
ํŒจํ‚ค์ง€ B:                         Resolve โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Fetch โ”€โ”€โ”€ Write
ํŒจํ‚ค์ง€ C:                                         Resolve โ”€โ”€ Fetch โ”€โ”€ Write
...๋А๋ฆผ

pnpm ๋ฐฉ์‹ (ํŒŒ์ดํ”„๋ผ์ธ):
ํŒจํ‚ค์ง€ A: [Resolve] โ†’ [Fetch] โ†’ [Link]
ํŒจํ‚ค์ง€ B:   [Resolve] โ†’ [Fetch] โ†’ [Link]
ํŒจํ‚ค์ง€ C:     [Resolve] โ†’ [Fetch] โ†’ [Link]
โ†’ ํŒจํ‚ค์ง€ A ๊ฐ€ resolve ๋˜๋Š” ์ˆœ๊ฐ„ fetch ์‹œ์ž‘, fetch ๋˜๋Š” ์ˆœ๊ฐ„ link ์‹œ์ž‘
โ†’ ํ›จ์”ฌ ๋น ๋ฆ„

์ถ”๊ฐ€๋กœ, ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด์— ์ด๋ฏธ ์žˆ๋Š” ํŒŒ์ผ์€ ๋‹ค์šด๋กœ๋“œ์กฐ์ฐจ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜๋“œ๋งํฌ ์ƒ์„ฑ๋งŒ์œผ๋กœ ๋๋‚œ๋‹ค.


โš–๏ธ npm vs pnpm ํ•œ๋ˆˆ์— ๋น„๊ต

ํ•ญ๋ชฉnpmpnpm
ํŒŒ์ผ ์ €์žฅ ๋ฐฉ์‹ํ”„๋กœ์ ํŠธ๋ณ„ ๋ณต์‚ฌ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด + ํ•˜๋“œ๋งํฌ
๋””์Šคํฌ ์‚ฌ์šฉํ”„๋กœ์ ํŠธ ์ˆ˜ ร— ํŒจํ‚ค์ง€ ํฌ๊ธฐ๊ณ ์œ  ํŒŒ์ผ ์ˆ˜ ร— ํŒŒ์ผ ํฌ๊ธฐ
node_modules ๊ตฌ์กฐํ‰ํƒ„ํ™”(hoisting)์‹ฌ๋งํฌ ๊ธฐ๋ฐ˜ ๊ฒฉ๋ฆฌ
ํŒฌํ…€ ์˜์กด์„ฑ๋ฐœ์ƒ ๊ฐ€๋Šฅ โš ๏ธ์›์ฒœ ์ฐจ๋‹จ โœ…
์„ค์น˜ ์†๋„๋А๋ฆผ๋น ๋ฆ„ (์บ์‹œ ์‹œ ํ•˜๋“œ๋งํฌ๋งŒ)
lockfilepackage-lock.jsonpnpm-lock.yaml
workspace ์ง€์›๊ธฐ๋ณธ ์ง€์›๊ธฐ๋ณธ ์ง€์› + Catalogs
Node.js ๋ฒ„์ „ ๊ด€๋ฆฌโŒpnpm env ๋กœ ์ง€์›
ํŒจ์น˜ ๊ธฐ๋ŠฅโŒpnpm patch ๋กœ ์ง€์›

โš™๏ธ pnpm ์„ค์น˜ & ํ”„๋กœ์ ํŠธ ์ฒซ ์„ธํŒ…

pnpm ์„ค์น˜ (๊ถŒ์žฅ: Corepack)

# Node.js 18.19+ / 20.6+ ์— ๋‚ด์žฅ๋œ Corepack ํ™œ์šฉ
corepack enable
corepack prepare pnpm@latest --activate
 
# ๋ฒ„์ „ ํ™•์ธ
pnpm --version
# 9.x.x
# ๋˜๋Š” npm ์œผ๋กœ ์ „์—ญ ์„ค์น˜ (๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•)
npm install -g pnpm

package.json ์— ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๊ณ ์ •

// package.json
{
  "name": "youngsu-community",
  // ๐Ÿฆ [์ดˆํ•ต์‹ฌ] ์ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” ๋ฌด์กฐ๊ฑด ์ด ๋ฒ„์ „์˜ pnpm๋งŒ ์“ฐ๊ฒ ๋‹ค๊ณ  ๋ชป ๋ฐ•๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.
  // ํŒ€์›์ด ์‹ค์ˆ˜๋กœ npm install ์ด๋‚˜ yarn install ์„ ์น˜๋ฉด "์—๋Ÿฌ! pnpm ์“ฐ์„ธ์š”!" ํ•˜๊ณ  ๋ง‰์•„์ค๋‹ˆ๋‹ค.
  "packageManager": "pnpm@9.15.0"
}

.npmrc ์„ค์ • (pnpm ์ „์šฉ)

# .npmrc (ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ ์˜์—ญ์— ์ƒ์„ฑ)
 
# ๐Ÿฆ ์—„๊ฒฉ ๋ชจ๋“œ โ€” pnpm์€ ๊ธฐ๋ณธ์ ์œผ๋กœ package.json์— ๋ช…์‹œ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€(phantom dependency)๋ฅผ importํ•˜๋ฉด ์—๋Ÿฌ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
# ํ•˜์ง€๋งŒ ์•„๋ž˜ ์ ํžŒ ๋…€์„๋“ค์€ ์˜ˆ์™ธ์ ์œผ๋กœ ๋ฃจํŠธ ํด๋”์— ๋…ธ์ถœ์‹œ์ผœ์„œ(ํ˜ธ์ด์ŠคํŒ…), ๊ธฐ์กด ๋„๊ตฌ๋“ค์ด ์˜ค๋ฅ˜ ์—†์ด ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
public-hoist-pattern[]=*types*
public-hoist-pattern[]=*eslint*
 
# npm์ฒ˜๋Ÿผ ๋ชจ๋“  ์˜์กด์„ฑ์„ ๋‹ค ๋ฃจํŠธ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” "์ฐฝํ”ผํ•œ(shameful)" ํ–‰๋™์€ ์ ˆ๋Œ€ ์•ˆ ํ•˜๊ฒ ๋‹ค๋Š” ๊ตณ์€ ์˜์ง€!
shamefully-hoist=false
 
# Node.js ๋ฒ„์ „์„ package.json์˜ engines ํ•„๋“œ์— ์ ํžŒ ๋ฒ„์ „์œผ๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ์ œํ•œ
engine-strict=true

Next.js ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

# create-next-app ์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉด์„œ pnpm ์‚ฌ์šฉ
pnpm create next-app@latest youngsu-community
 
# ๊ธฐ์กด npm ํ”„๋กœ์ ํŠธ๋ฅผ pnpm ์œผ๋กœ ์ „ํ™˜
# (07ํŽธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ์—์„œ ์ƒ์„ธ ๋‹ค๋ฃธ)
pnpm import          # package-lock.json โ†’ pnpm-lock.yaml ๋ณ€ํ™˜ (๊ฐ€์žฅ ๋จผ์ €!)
rm package-lock.json
pnpm install

๊ธฐ๋ณธ ๋ช…๋ น์–ด ๋Œ€์‘ํ‘œ

npmpnpm์„ค๋ช…
npm installpnpm install์ „์ฒด ์˜์กด์„ฑ ์„ค์น˜
npm install reactpnpm add reactํŒจํ‚ค์ง€ ์ถ”๊ฐ€
npm install -D jestpnpm add -D jestdevDependency ์ถ”๊ฐ€
npm uninstall reactpnpm remove reactํŒจํ‚ค์ง€ ์ œ๊ฑฐ
npm updatepnpm updateํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ
npm run devpnpm dev์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
npx create-next-apppnpm dlx create-next-app์ž„์‹œ ํŒจํ‚ค์ง€ ์‹คํ–‰
npm cipnpm install --frozen-lockfileCI ํ™˜๊ฒฝ ์„ค์น˜

๐Ÿ ์ด์ •๋ฆฌ

pnpm ํ•ต์‹ฌ ๋ฉ˜ํƒˆ ๋ชจ๋ธ 3์ค„ ์š”์•ฝ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด: ๊ฐ™์€ ํŒŒ์ผ์€ ์ „ ์ง€๊ตฌ์—์„œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ €์žฅ
2. ํ•˜๋“œ๋งํฌ:     ์Šคํ† ์–ด โ†’ .pnpm (๋ณต์‚ฌ ์—†์ด ํฌ์ธํ„ฐ๋งŒ)
3. ์‹ฌ๋งํฌ:       .pnpm โ†’ node_modules ๋ฃจํŠธ (์ง์ ‘ ์˜์กด์„ฑ๋งŒ ๋…ธ์ถœ โ†’ ํŒฌํ…€ ์˜์กด์„ฑ ์ฐจ๋‹จ)
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐Ÿ’ก ํ•œ ์ค„ ๊ธฐ์–ต๋ฒ•: npm ์€ ํŒจํ‚ค์ง€๋ฅผ ๋ณต์‚ฌ ํ•˜๊ณ , pnpm ์€ ํฌ์ธํ„ฐ ๋ฅผ ๋งŒ๋“ ๋‹ค.


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. pnpm ์˜ content-addressable store ๋Š” ํŒŒ์ผ์„ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ €์žฅํ•˜๋ฉฐ, ์ด๊ฒƒ์ด ๋””์Šคํฌ ์ ˆ์•ฝ์— ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€?

โœ… ์ •๋‹ต: ํŒŒ์ผ ๋‚ด์šฉ์˜ SHA-512 ํ•ด์‹œ๊ฐ’ ์„ ํŒŒ์ผ๋ช…(์ฃผ์†Œ)์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์ด ๋™์ผํ•˜๋ฉด ํ•ด์‹œ๊ฐ€ ๊ฐ™์œผ๋ฏ€๋กœ ์Šคํ† ์–ด์— ๋‹จ ํ•˜๋‚˜์˜ ํŒŒ์ผ ๋งŒ ์กด์žฌํ•œ๋‹ค. 100๊ฐœ ํ”„๋กœ์ ํŠธ์—์„œ ๋™์ผํ•œ react@18.2.0 ์„ ์“ด๋‹ค๋ฉด ์Šคํ† ์–ด์—๋Š” react ํŒŒ์ผ์ด 1๋ฒŒ๋งŒ ์žˆ๊ณ , ๊ฐ ํ”„๋กœ์ ํŠธ์˜ node_modules ๋Š” ํ•˜๋“œ๋งํฌ๋กœ๋งŒ ์—ฐ๊ฒฐ๋œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • npm ๋ฐฉ์‹: ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค node_modules/react/ ์— ํŒŒ์ผ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ณต์‚ฌ โ†’ 10๊ฐœ ํ”„๋กœ์ ํŠธ = 10๋ฐฐ ์šฉ๋Ÿ‰
  • pnpm ๋ฐฉ์‹: ~/.pnpm-store/v3/files/ํ•ด์‹œ/ ์— ํ•œ ๋ฒˆ๋งŒ ์ €์žฅ + ํ•˜๋“œ๋งํฌ๋กœ ์—ฐ๊ฒฐ โ†’ ์ถ”๊ฐ€ ๋””์Šคํฌ ์‚ฌ์šฉ ์—†์Œ
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "Content๊ฐ€ Address๋‹ค" โ€” ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด ์ฃผ์†Œ๊ฐ€ ๊ฐ™์•„์„œ ์ค‘๋ณต์ด ์—†๋‹ค.

Q2. pnpm ์ด node_modules ๋ฃจํŠธ์— ์ง์ ‘ ์˜์กด์„ฑ๋งŒ ์‹ฌ๋งํฌ๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์™œ ํŒฌํ…€ ์˜์กด์„ฑ์„ ์ฐจ๋‹จํ•˜๋Š”๊ฐ€?

โœ… ์ •๋‹ต: npm ์˜ ํ˜ธ์ด์ŠคํŒ… ์€ ๊ฐ„์ ‘ ์˜์กด์„ฑ๋„ ๋ฃจํŠธ๋กœ ๋Œ์–ด์˜ฌ๋ ค์„œ ์ฝ”๋“œ์—์„œ ์ง์ ‘ import ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค. pnpm ์€ ๋ฃจํŠธ์— package.json ์— ๋ช…์‹œํ•œ ์ง์ ‘ ์˜์กด์„ฑ๋งŒ ์‹ฌ๋งํฌ๋กœ ๋…ธ์ถœํ•˜๊ณ , ๊ฐ„์ ‘ ์˜์กด์„ฑ์€ .pnpm/ํŒจํ‚ค์ง€๋ช…@๋ฒ„์ „/node_modules/ ์•ˆ์—๋งŒ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋ฅผ import ํ•˜๋ฉด Module Not Found ์—๋Ÿฌ ๊ฐ€ ์ฆ‰์‹œ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ํŒฌํ…€ ์˜์กด์„ฑ์˜ ์œ„ํ—˜: package.json ์— ์—†๋Š” ํŒจํ‚ค์ง€๋ฅผ ์“ฐ๋‹ค๊ฐ€, ์ƒ์œ„ ํŒจํ‚ค์ง€๊ฐ€ ํ•ด๋‹น ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ
  • pnpm ์˜ ๋ฐฉ์–ด: ๋ฃจํŠธ์— ์—†๋Š” ํŒจํ‚ค์ง€๋Š” Node.js resolve ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฐพ์ง€ ๋ชปํ•จ โ†’ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ฆ‰์‹œ ์—๋Ÿฌ
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "๋‚˜ํ•œํ…Œ ์†Œ๊ฐœ๋ฐ›์ง€ ์•Š์€ ์‚ฌ๋žŒ์€ ํŒŒํ‹ฐ์— ๋ชป ๋“ค์–ด์˜จ๋‹ค" โ€” package.json ์— ์—†์œผ๋ฉด node_modules ๋ฃจํŠธ์— ์—†๋‹ค.

Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ (ํŒ€ ์ „์ฒด ํšŒ์˜)

์˜์ˆ˜ ๋‹˜์ด ํŒ€ ํšŒ์˜์—์„œ ๋งํ–ˆ๋‹ค.
"์ €ํฌ ํ”„๋กœ์ ํŠธ 5๊ฐœ ๋‹ค npm ์“ฐ๋Š”๋ฐ, ์˜ํ˜ธ ๋‹˜์ด pnpm ์œผ๋กœ ๋ฐ”๊พธ์ž๊ณ  ํ•˜์‹œ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด์š”? ๊ทผ๋ฐ pnpm ์ด ์‹ฌ๋งํฌ ์“ฐ๋‹ค ๋ณด๋ฉด ์ผ๋ถ€ ๋„๊ตฌ๋ž‘ ํ˜ธํ™˜ ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค๊ณ  ๋“ค์—ˆ๋Š”๋ฐ..."

๊ฐ ์บ๋ฆญํ„ฐ ๊ด€์ ์—์„œ pnpm ์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

โœ… ์ •๋‹ต: pnpm ์˜ ์žฅ์  ์€ ๋””์Šคํฌ ์ ˆ์•ฝ, ์„ค์น˜ ์†๋„, ํŒฌํ…€ ์˜์กด์„ฑ ์ฐจ๋‹จ์ด๋ฉฐ, ๋‹จ์  ์€ ์ผ๋ถ€ ๋„๊ตฌ๊ฐ€ ์‹ฌ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•˜๋Š” ํ˜ธํ™˜์„ฑ ์ด์Šˆ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋Š” .npmrc ์˜ shamefully-hoist=true ๋˜๋Š” nodeLinker=hoisted ์„ค์ •์œผ๋กœ npm ๋ฐฉ์‹์œผ๋กœ ํด๋ฐฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ๐Ÿฆ ์˜ํ˜ธ(์›๋ฆฌ): "content-addressable store ์™€ ํ•˜๋“œ๋งํฌ ๋•๋ถ„์— ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์—์„œ ํŠนํžˆ ํšจ๊ณผ์ ์ด์—์š”. ์˜์กด์„ฑ ๊ฒฉ๋ฆฌ๋„ ๋ณด์žฅ๋˜๊ณ ์š”."
  • ๐Ÿ‘” ์˜์ˆ˜(์•ˆ์ •์„ฑ): "์ผ๋ถ€ Electron ์•ฑ, ๊ตฌํ˜• Jest config, ํŠน์ • webpack ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‹ฌ๋งํฌ๋ฅผ resolve ๋ชปํ•  ์ˆ˜ ์žˆ์–ด์š”. ํŒ€์—์„œ ๋จผ์ € ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ „ํ™˜ํ•ด์•ผ ํ•ด์š”."
  • ๐ŸŽจ ์˜์ˆ™(UX): "์„ค์น˜ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘๋„ ๋นจ๋ผ์ง€๋‹ˆ๊นŒ ๊ฐœ๋ฐœ ๊ฒฝํ—˜(DX)์ด ์ข‹์•„์ง€์ฃ ."
  • ์ ˆ์ถฉ์•ˆ: ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ .npmrc ์— public-hoist-pattern[]=*eslint* ์ฒ˜๋Ÿผ ํŠน์ • ํŒจํ‚ค์ง€๋งŒ ์„ ํƒ์ ์œผ๋กœ ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "pnpm ์˜ ์—„๊ฒฉํ•จ์ด ๊ฐ€๋” ๊ตฌํ˜• ๋„๊ตฌ์—๊ฒ ๋ฒฝ์ด ๋œ๋‹ค. ๊ทธ ๋ฒฝ์„ ํ—ˆ๋ฌผ๋ ค๋ฉด shamefully-hoist ๋ผ๋Š” ์ด๋ฆ„๋ถ€ํ„ฐ ์‘ฅ์Šค๋Ÿฝ๊ฒŒ ์จ์•ผ ํ•œ๋‹ค."

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

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

ํ•˜๋“œ๋งํฌ๊ฐ€ ํฌ์ธํ„ฐ๋ผ๋Š” ๊ฐœ๋…์ด ์ฒ˜์Œ์—” ์ข€ ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ, ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด "๋ฐ”ํƒ•ํ™”๋ฉด ๋ฐ”๋กœ๊ฐ€๊ธฐ ์•„์ด์ฝ˜์„ ๋ฐฑ ๊ฐœ ๋งŒ๋“ค์–ด๋„ ์›๋ณธ ํŒŒ์ผ์ด ๋ฐฑ ๊ฐœ๊ฐ€ ๋˜์ง€๋Š” ์•Š์ž–์•„์š”?" ๋ผ๊ณ  ํ•˜์‹œ๋‹ˆ๊นŒ ๋”ฑ ์ดํ•ด๋๋‹ค. ํ•˜๋“œ๋งํฌ๋Š” ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ•ํ•œ ๋ฒ„์ „์ด๊ณ .

ํŒฌํ…€ ์˜์กด์„ฑ์ด๋ผ๋Š” ๊ฐœ๋…๋„ ์˜ค๋Š˜ ์ฒ˜์Œ ์ œ๋Œ€๋กœ ์•Œ์•˜๋‹ค. package.json ์— ์—†๋Š” ํŒจํ‚ค์ง€๋ฅผ ์“ฐ๋‹ค๊ฐ€ ์–ด๋А ๋‚  ๊ฐ‘์ž๊ธฐ ๋นŒ๋“œ ์‹คํŒจํ•˜๋ฉด ์ง„์งœ ํŒจ๋‹‰์ด๊ฒ ๋‹ค. pnpm ์ด ์ด๊ฑธ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ง‰์•„์ค€๋‹ค๋Š” ๊ฒŒ ๊ฝค ์ธ์ƒ์ ์ด์—ˆ๋‹ค.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "npm ์€ ํŒจํ‚ค์ง€๋ฅผ '๋ณต์‚ฌ' ํ•˜๊ณ , pnpm ์€ 'ํฌ์ธํ„ฐ' ๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฌผ์ด์ง€๋งŒ ๋””์Šคํฌ ๋น„์šฉ์ด ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค."

์ง‘ ๊ฐ€๋Š” ๊ธธ์— SSD ์šฉ๋Ÿ‰ ํ™•์ธํ•ด๋ดค๋”๋‹ˆ ์•„์ง๋„ node_modules ๊ฐ€ 18GB ๋ฅผ ๋จน๊ณ  ์žˆ๋‹ค. ๋‚ด์ผ ์ถœ๊ทผํ•˜๋ฉด ๋ฐ”๋กœ pnpm ์„ค์น˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋“ค ์ „ํ™˜ํ•ด๋ด์•ผ์ง€. ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฑธ ์จ๋จน์–ด๋ณด์ž!


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ