๐Ÿ”ฌ node_modules ๊ตฌ์กฐ ์™„์ „ ํ•ด๋ถ€ โ€” .pnpm ํด๋”์˜ ๋น„๋ฐ€

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

๐Ÿ“‹ ๊ฐœ์š”

pnpm ์˜ ์‹ฌ๋งํฌ ๊ธฐ๋ฐ˜ node_modules ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ํŒฌํ…€ ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋ง‰๋Š”์ง€, nodeLinker ์˜ต์…˜์œผ๋กœ ์–ด๋–ป๊ฒŒ ์กฐ์ ˆํ•˜๋Š”์ง€ ์™„์ „ ์ •๋ณต

02. node_modules ๊ตฌ์กฐ ํ•ด๋ถ€

๐Ÿ“‹ ๋ชฉ์ฐจ

  1. ์ด์ •๋ฆฌ
  2. ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ
  3. ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ
  4. ๋” ์•Œ์•„๋ณด๊ธฐ

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

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

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

[.pnpm ํด๋” ๊ตฌ์กฐ] โ†’ [ํ”ผ์–ด ์˜์กด์„ฑ ์ฒ˜๋ฆฌ] โ†’ [ํ˜ธ์ด์ŠคํŒ… ์ œ์–ด] โ†’ [nodeLinker ์˜ต์…˜] โ†’ [์—๋Ÿฌ ํ•ด๊ฒฐ]

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

  • .pnpm ํด๋” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ํƒ์ƒ‰ํ•˜๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํ”ผ์–ด ์˜์กด์„ฑ ๋ฒ„์ „์ด ๋‹ค๋ฅผ ๋•Œ pnpm ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • public-hoist-pattern ์œผ๋กœ ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • nodeLinker ์˜ต์…˜์˜ ์ฐจ์ด๋ฅผ ์•Œ๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค

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

์˜์ฒ ์ด์˜ ESLint ์—๋Ÿฌ์™€ ์˜ํ˜ธ์˜ ํ•ด๊ฒฐ์ฑ…
  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์˜ํ˜ธ ๋‹˜, pnpm ์œผ๋กœ ๋ฐ”๊ฟจ๋Š”๋ฐ ESLint๊ฐ€ ๊ฐ‘์ž๊ธฐ ์•ˆ ๋˜์š”. Cannot find module 'eslint' ๋ผ๊ณ  ๋‚˜์˜ค๋Š”๋ฐ ๋ถ„๋ช…ํžˆ devDependencies ์— ์žˆ๊ฑฐ๋“ ์š”. ๊ทธ๋ฆฌ๊ณ  node_modules ํด๋” ๋“ค์–ด๊ฐ€๋ดค๋Š”๋ฐ eslint ํด๋”๊ฐ€ ์—†๊ณ  .pnpm ์ด๋ผ๋Š” ์ˆจ๊น€ ํด๋”๋งŒ ์žˆ์–ด์„œ ๋ญ”๊ฐ€ ์„ค์น˜๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์•„์š”. pnpm install ๋‹ค์‹œ ํ•ด๋ดค๋Š”๋ฐ๋„ ๋˜‘๊ฐ™๊ณ ..."
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, .pnpm ํด๋” ์•ˆ์„ ์—ด์–ด๋ดค์–ด์š”? eslint ๊ฐ€ ๊ฑฐ๊ธฐ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. pnpm ์€ ๋ฃจํŠธ node_modules ์—๋Š” package.json ์— ์ง์ ‘ ์ ํžŒ ํŒจํ‚ค์ง€๋งŒ ์‹ฌ๋งํฌ๋กœ ๋…ธ์ถœํ•˜๊ฑฐ๋“ ์š”. ESLint ๊ฐ€ ์—†๋‹ค๋Š” ์—๋Ÿฌ๋Š” ์‹ญ์ค‘ํŒ”๊ตฌ ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ฃจํŠธ node_modules ์—์„œ eslint ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๋Š”๋ฐ ๋ชป ์ฐพ๋Š” ์ผ€์ด์Šค์˜ˆ์š”. .npmrc ์— public-hoist-pattern[]=*eslint* ํ•œ ์ค„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋ผ์š”."

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

pnpm ์„ ์ฒ˜์Œ ๋„์ž…ํ•˜๋Š” ํŒ€์˜ 90% ๊ฐ€ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ํ•œ๋‹ค.

"์ž˜ ๋˜๋˜ eslint, jest, tailwind ์„ค์ •์ด pnpm ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋‚˜์„œ ๊ฐ‘์ž๊ธฐ ์•ˆ ๋œ๋‹ค."

์ด๊ฒƒ์€ pnpm ์˜ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋‹ค. pnpm ์˜ ์ฒ ํ•™์ด npm ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ ์— ๋ฐœ์ƒํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋งˆ์ฐฐ์ด๋‹ค. .pnpm ํด๋”์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”ฌ .pnpm ํด๋” ํ•ด๋ถ€

์‹ค์ œ ๊ตฌ์กฐ ํƒ์ƒ‰

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ์ ํŠธ์—์„œ ls node_modules/.pnpm ์„ ์‹คํ–‰ํ•˜๋ฉด:

node_modules/
โ”œโ”€โ”€ .modules.yaml           โ† pnpm ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (๋ฒ„์ „, ์„ค์ • ๋“ฑ)
โ”œโ”€โ”€ next โ†’ .pnpm/next@14.2.0/node_modules/next          (์‹ฌ๋งํฌ)
โ”œโ”€โ”€ react โ†’ .pnpm/react@18.2.0/node_modules/react       (์‹ฌ๋งํฌ)
โ”œโ”€โ”€ typescript โ†’ .pnpm/typescript@5.3.3/node_modules/typescript (์‹ฌ๋งํฌ)
โ””โ”€โ”€ .pnpm/
    โ”œโ”€โ”€ next@14.2.0/
    โ”‚   โ””โ”€โ”€ node_modules/
    โ”‚       โ”œโ”€โ”€ next/           โ† ํ•˜๋“œ๋งํฌ โ†’ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด
    โ”‚       โ”œโ”€โ”€ react/          โ† ์‹ฌ๋งํฌ โ†’ .pnpm/react@18.2.0/...  (next์˜ ํ”ผ์–ด)
    โ”‚       โ””โ”€โ”€ postcss/        โ† ํ•˜๋“œ๋งํฌ โ†’ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด (next์˜ deps)
    โ”œโ”€โ”€ react@18.2.0/
    โ”‚   โ””โ”€โ”€ node_modules/
    โ”‚       โ”œโ”€โ”€ react/          โ† ํ•˜๋“œ๋งํฌ โ†’ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด
    โ”‚       โ””โ”€โ”€ loose-envify/   โ† ํ•˜๋“œ๋งํฌ โ†’ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด (react์˜ deps)
    โ””โ”€โ”€ typescript@5.3.3/
        โ””โ”€โ”€ node_modules/
            โ””โ”€โ”€ typescript/     โ† ํ•˜๋“œ๋งํฌ โ†’ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด

๋„ค์ด๋ฐ ๊ทœ์น™: ํŒจํ‚ค์ง€๋ช…@๋ฒ„์ „

.pnpm ๋‚ด๋ถ€์˜ ํด๋”๋ช…์€ ํŒจํ‚ค์ง€๋ช…@๋ฒ„์ „ ํ˜•์‹์ด๋‹ค. ํ”ผ์–ด ์˜์กด์„ฑ์˜ ๋ฒ„์ „์ด ๋‹ฌ๋ผ์ง€๋ฉด ํด๋”๋ช…๋„ ๋‹ฌ๋ผ์ง„๋‹ค(์•„๋ž˜์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃธ).

.modules.yaml โ€” pnpm ์˜ ๋ฉ”ํƒ€ ์ •๋ณด

# node_modules/.modules.yaml
# ๐Ÿ’ก pnpm์ด node_modules ํด๋” ์ „์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ฐธ๊ณ ํ•˜๋Š” "๋‚ด๋ถ€ ์žฅ๋ถ€" ๊ฐ™์€ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
hoistedDependencies:
  /eslint@8.57.0:
    eslint: public # ๋ฃจํŠธ ํด๋”๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„(hoisting) ํŒจํ‚ค์ง€ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
layoutVersion: 5
packageManager: pnpm@9.15.0
pendingBuilds: []
publicHoistPattern:
  # .npmrc์—์„œ ์„ค์ •ํ•œ ํ˜ธ์ด์ŠคํŒ… ๊ทœ์น™์ด ์ด ์žฅ๋ถ€์— ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜๋˜์–ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  - '*types*'
  - '*eslint*'
prunedAt: 2026-03-05 # ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ค์ง€(์“ฐ๋ ˆ๊ธฐ)๋ฅผ ์ฒญ์†Œํ•œ ๋‚ ์งœ
registries:
  default: https://registry.npmjs.org/
storeDir: /home/user/.pnpm-store/v3 # ๋‚ด ์ปดํ“จํ„ฐ ์•ˆ์˜ ์ง„์งœ ์›๋ณธ ํŒŒ์ผ๋“ค์ด ์ˆจ์–ด์žˆ๋Š” ๊ธ€๋กœ๋ฒŒ ์ €์žฅ์†Œ ์œ„์น˜
virtualStoreDir: .pnpm # ์‹ฌ๋งํฌ์™€ ํ•˜๋“œ๋งํฌ์˜ ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚˜๋Š” ๊ฐ€์ƒ ์ €์žฅ์†Œ ์ด๋ฆ„

๐Ÿ”€ ํ”ผ์–ด ์˜์กด์„ฑ๊ณผ ์‹ฌ๋งํฌ์˜ ๊ด€๊ณ„

ํ”ผ์–ด ์˜์กด์„ฑ์ด ๋‹ค๋ฅธ ๋ฒ„์ „์œผ๋กœ ์„ค์น˜๋  ๋•Œ

ํ”ผ์–ด ์˜์กด์„ฑ(peerDependencies)์€ ํŒจํ‚ค์ง€๊ฐ€ "ํ˜ธ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค"๊ณ  ์„ ์–ธํ•˜๋Š” ์˜์กด์„ฑ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด react-query ๋Š” react@>=18 ์„ ํ”ผ์–ด๋กœ ์š”๊ตฌํ•œ๋‹ค.

๋งŒ์•ฝ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ํŒจํ‚ค์ง€ A ๋Š” react@17, ํŒจํ‚ค์ง€ B ๋Š” react@18 ์„ ํ”ผ์–ด๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค๋ฉด, pnpm ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ?

node_modules/.pnpm/
โ”œโ”€โ”€ some-plugin@1.0.0_react@17.0.2/   โ† react@17 ๊ณผ ํ•จ๊ป˜ ํ•ด๊ฒฐ๋œ ๋ฒ„์ „
โ”‚   โ””โ”€โ”€ node_modules/
โ”‚       โ”œโ”€โ”€ some-plugin/
โ”‚       โ””โ”€โ”€ react/  โ†’ .pnpm/react@17.0.2/...
โ””โ”€โ”€ some-plugin@1.0.0_react@18.2.0/   โ† react@18 ๊ณผ ํ•จ๊ป˜ ํ•ด๊ฒฐ๋œ ๋ฒ„์ „
    โ””โ”€โ”€ node_modules/
        โ”œโ”€โ”€ some-plugin/
        โ””โ”€โ”€ react/  โ†’ .pnpm/react@18.2.0/...

ํด๋”๋ช…์ด ํŒจํ‚ค์ง€๋ช…@๋ฒ„์ „_ํ”ผ์–ดํŒจํ‚ค์ง€@ํ”ผ์–ด๋ฒ„์ „ ํ˜•์‹์œผ๋กœ ๋ถ„๊ธฐ๋œ๋‹ค. ํ”ผ์–ด๊ฐ€ ๋‹ค๋ฅด๋ฉด ์‚ฌ์‹ค์ƒ ๋‹ค๋ฅธ ์„ค์น˜ ์ปจํ…์ŠคํŠธ์ด๋ฏ€๋กœ, pnpm ์ด ์ด๋ฅผ ๋ณ„๋„ ํด๋”๋กœ ๊ฒฉ๋ฆฌํ•œ๋‹ค.

npm ์€ ์ด ๋ฌธ์ œ๋ฅผ "๊ทธ๋ƒฅ ๋‘˜ ๋‹ค ํ˜ธ์ด์ŠคํŒ…" ํ•˜๊ฑฐ๋‚˜ ํ•˜๋‚˜๋ฅผ ํƒํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, pnpm ์€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ ํ•œ๋‹ค.

autoInstallPeers ์„ค์ •

# .npmrc ๋˜๋Š” pnpm-workspace.yaml
# ํ”ผ์–ด ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์„ค์น˜ํ• ์ง€ ์—ฌ๋ถ€ (pnpm ๊ธฐ๋ณธ๊ฐ’: true)
auto-install-peers=true

๐Ÿ“Œ ํ˜ธ์ด์ŠคํŒ… ์ œ์–ด โ€” public-hoist-pattern

์™œ ํ˜ธ์ด์ŠคํŒ…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๊ฐ€

pnpm ์˜ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ข‹์ง€๋งŒ, ์ผ๋ถ€ ๋„๊ตฌ๋Š” ๋ฃจํŠธ node_modules ์—์„œ ํŠน์ • ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ์‹ฌ๋งํฌ ๊ตฌ์กฐ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ:

โŒ ์—๋Ÿฌ ์ผ€์ด์Šค๋“ค:
- ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ฃจํŠธ node_modules ์—์„œ eslint ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ฐพ์„ ๋•Œ
- TypeScript ๊ฐ€ @types/* ๋ฅผ ๋ฃจํŠธ์—์„œ ์ฐพ์„ ๋•Œ
- Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ฃจํŠธ prettier ๋ฅผ ์ฐพ์„ ๋•Œ
- ์ผ๋ถ€ Jest ์„ค์ •์ด ๋ฃจํŠธ jest-* ๋ฅผ ์ฐพ์„ ๋•Œ

public-hoist-pattern ์„ค์ •

.npmrc ์—์„œ ํŒจํ„ด ๋งค์นญ์œผ๋กœ ํŠน์ • ํŒจํ‚ค์ง€๋งŒ ์„ ํƒ์ ์œผ๋กœ ๋ฃจํŠธ์— ํ˜ธ์ด์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ๋‹ค.

# .npmrc (์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ถŒ์žฅ ์„ค์ • / ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ)
 
# ๐Ÿฆ pnpm์˜ ๊ธฐ๋ณธ ์›์น™์€ "package.json์— ์—†๋Š” ์• ๋“ค์€ ์ˆจ๊ธด๋‹ค" ์ง€๋งŒ, ์˜ˆ์™ธ๋ฅผ ํ—ˆ์šฉํ•ด ์ค๋‹ˆ๋‹ค.
# TypeScript๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ž๋™์™„์„ฑ(intellisense)์„ ํ•ด์ฃผ๋ ค๋ฉด ํƒ€์ž… ์ •์˜ ํŒŒ์ผ๋“ค์ด ํ•„์š”ํ•œ๋ฐ, ์–˜๋„ค๋Š” ์˜ˆ์™ธ๋กœ ๋ฃจํŠธ์— ๋‘ก๋‹ˆ๋‹ค.
public-hoist-pattern[]=*types*
 
# ESLint ์—ญ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ๋ฃจํŠธ ํด๋”์—์„œ ๋ณธ์ฒด๋ฅผ ์ฐพ์œผ๋ ค๋Š” ๋ฒ„๋ฆ‡์ด ์žˆ์–ด์„œ ์˜ˆ์™ธ๋กœ ๋‘ก๋‹ˆ๋‹ค.
public-hoist-pattern[]=*eslint*
 
# ์ฝ”๋“œ ํฌ๋งคํ„ฐ์ธ prettier ๊ณ„์—ด๋„ ์˜ˆ์™ธ.
public-hoist-pattern[]=prettier
 
# ๋งŒ์•ฝ ์ด๋ฆ„์— ๊ณตํ†ต์ ์ด ์—†๋‹ค๋ฉด? ์ •ํ™•ํ•˜๊ฒŒ ์ฝ• ์ง‘์–ด์„œ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
public-hoist-pattern[]=next
# ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ: npm ์ฒ˜๋Ÿผ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ํ˜ธ์ด์ŠคํŒ… (๋น„์ถ”์ฒœ)
# ํŒฌํ…€ ์˜์กด์„ฑ ์ฐจ๋‹จ ํšจ๊ณผ๊ฐ€ ์‚ฌ๋ผ์ง
shamefully-hoist=true

๐Ÿฆ ์˜ํ˜ธ ๋ฆฌ๋“œ์˜ ์กฐ์–ธ:

shamefully-hoist=true ๋Š” ์ด๋ฆ„๋ถ€ํ„ฐ "์ฐฝํ”ผํ•œ ํ˜ธ์ด์ŠคํŒ…" ์ด์—์š”.
pnpm ์„ ์“ฐ๋ฉด์„œ npm ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์˜ต์…˜์ด๋ผ ์ด๋ฆ„์„ ์ด๋ ‡๊ฒŒ ์ง€์€ ๊ฑฐ์˜ˆ์š”.
ํ˜ธ์ด์ŠคํŒ…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด shamefully-hoist ๋Œ€์‹ 
public-hoist-pattern ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜์„ธ์š”.

Next.js ํ”„๋กœ์ ํŠธ ๊ถŒ์žฅ .npmrc

# .npmrc (Next.js๋ฅผ ์“ธ ๋•Œ ์ด ์ •๋„๋Š” ๋„ฃ์–ด์ค˜์•ผ ์†์ด ํŽธํ•ฉ๋‹ˆ๋‹ค)
 
# ๐Ÿ’ก TypeScript types ํ˜ธ์ด์ŠคํŒ… (VSCode ๋“ฑ ์—๋””ํ„ฐ์—์„œ ๋นจ๊ฐ„์ค„ ์•ˆ ๋œจ๊ฒŒ ํ•˜๋ ค๋ฉด ํ•„์ˆ˜!)
public-hoist-pattern[]=*types*
 
# ๐Ÿ’ก ESLint ๊ณ„์—ด ํ˜ธ์ด์ŠคํŒ… (Next.js์˜ ๊ธฐ๋ณธ eslint-config-next๊ฐ€ ๋ฃจํŠธ์˜ eslint๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ)
public-hoist-pattern[]=*eslint*
 
# ๐Ÿ’ก Tailwind CSS์™€ ๊ด€๋ จ๋œ ์นœ๊ตฌ๋“ค์„ ํ˜ธ์ด์ŠคํŒ… (Tailwind๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ๋ชป ์ฐพ๋Š” ์—๋Ÿฌ ๋ฐฉ์ง€)
public-hoist-pattern[]=tailwindcss
public-hoist-pattern[]=postcss
public-hoist-pattern[]=autoprefixer
 
# ๐Ÿ’ก [์ค‘์š”] ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉด ์—๋Ÿฌ! (ํŒ€์› ๊ฐ„, ํ˜น์€ ์„œ๋ฒ„ ๊ฐ„ ํ™˜๊ฒฝ ์ผ์น˜ ๋ชฉ์ )
engine-strict=true

๐ŸŽ›๏ธ nodeLinker ์„ค์ • โ€” ์—„๊ฒฉํ•จ์˜ ์ŠคํŽ™ํŠธ๋Ÿผ

pnpm ์€ nodeLinker ์„ค์ •์œผ๋กœ node_modules ์ƒ์„ฑ ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

# pnpm-workspace.yaml ๋˜๋Š” .npmrc
# nodeLinker=isolated   (๊ธฐ๋ณธ๊ฐ’ โ€” ์‹ฌ๋งํฌ ๊ฒฉ๋ฆฌ ๊ตฌ์กฐ)
# nodeLinker=hoisted    (npm ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ ํ‰ํƒ„ํ™”)
# nodeLinker=pnp        (Yarn PnP ๋ฐฉ์‹)

nodeLinker=isolated (๊ธฐ๋ณธ๊ฐ’)

node_modules/
โ”œโ”€โ”€ react โ†’ .pnpm/react@18.2.0/...    (์‹ฌ๋งํฌ, ์ง์ ‘ ์˜์กด์„ฑ๋งŒ)
โ””โ”€โ”€ .pnpm/
    โ””โ”€โ”€ react@18.2.0/node_modules/react/  (ํ•˜๋“œ๋งํฌ โ†’ ์Šคํ† ์–ด)

์žฅ์ : ํŒฌํ…€ ์˜์กด์„ฑ ์ฐจ๋‹จ, ๋””์Šคํฌ ์ ˆ์•ฝ
๋‹จ์ : ์‹ฌ๋งํฌ๋ฅผ ๋ชป ๋”ฐ๋ผ๊ฐ€๋Š” ๊ตฌํ˜• ๋„๊ตฌ์™€ ํ˜ธํ™˜ ์ด์Šˆ

nodeLinker=hoisted

node_modules/
โ”œโ”€โ”€ react/        (ํ•˜๋“œ๋งํฌ โ†’ ์Šคํ† ์–ด, npm ์ฒ˜๋Ÿผ ๋ฃจํŠธ์— ๋ฐฐ์น˜)
โ”œโ”€โ”€ loose-envify/ (react ์˜ deps ๋„ ๋ฃจํŠธ๋กœ ํ˜ธ์ด์ŠคํŒ…)
โ””โ”€โ”€ .pnpm-store โ†’ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด (ํ•˜๋“œ๋งํฌ๋Š” ์œ ์ง€)

์žฅ์ : npm/Yarn Classic ๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ๋ผ ํ˜ธํ™˜์„ฑ ์ตœ๊ณ 
๋‹จ์ : ํŒฌํ…€ ์˜์กด์„ฑ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

nodeLinker=pnp (Plug'n'Play)

.pnp.cjs  โ† ์˜์กด์„ฑ ๋งต์„ ํŒŒ์ผ ํ•˜๋‚˜์— ๋‹ด์Œ
.pnp.loader.mjs
(node_modules ํด๋” ์—†์Œ)

์žฅ์ : node_modules ์ž์ฒด๊ฐ€ ์—†์–ด ๊ฐ€์žฅ ๋น ๋ฆ„ (Zero-Install ๊ฐ€๋Šฅ)
๋‹จ์ : ๋„๊ตฌ ํ˜ธํ™˜์„ฑ ๊ฐ€์žฅ ๋‚ฎ์Œ, ์„ค์ • ๋ณต์žก

์–ธ์ œ ์–ด๋–ค ๊ฑธ ์“ฐ๋Š”๊ฐ€

์ƒํ™ฉ๊ถŒ์žฅ ์„ค์ •
์ƒˆ ํ”„๋กœ์ ํŠธ, ํ˜„๋Œ€์  ๋„๊ตฌ ์Šคํƒisolated (๊ธฐ๋ณธ๊ฐ’)
๊ธฐ์กด npm ํ”„๋กœ์ ํŠธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜hoisted โ†’ ์ ์ง„์ ์œผ๋กœ isolated ์ „ํ™˜
๊ตฌํ˜• jest, webpack ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜ผ์žฌhoisted
Yarn PnP ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜pnp

๐Ÿ› ๏ธ ์‹ค์ „ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… โ€” ์‹ฌ๋งํฌ๋กœ ์ธํ•œ ์—๋Ÿฌ ํ•ด๊ฒฐ

์ผ€์ด์Šค 1: Cannot find module 'eslint'

# ์—๋Ÿฌ
Error: Cannot find module 'eslint'
Require stack:
- /home/user/projects/youngsu-community/node_modules/.pnpm/eslint-config-next@14.2.0/node_modules/eslint-config-next/index.js

์›์ธ: eslint-config-next ๊ฐ€ ๋ฃจํŠธ node_modules ์—์„œ eslint ๋ฅผ ์ฐพ์œผ๋ ค ํ•จ
ํ•ด๊ฒฐ:

# .npmrc ์— ์ถ”๊ฐ€
public-hoist-pattern[]=*eslint*
pnpm install  # ์žฌ์„ค์น˜ํ•˜๋ฉด eslint ๊ฐ€ ๋ฃจํŠธ๋กœ ํ˜ธ์ด์ŠคํŒ…๋จ

์ผ€์ด์Šค 2: PostCSS / Tailwind ์„ค์ • ์—๋Ÿฌ

# ์—๋Ÿฌ
Error: Cannot find module 'tailwindcss/resolveConfig'

ํ•ด๊ฒฐ:

# .npmrc ์— ์ถ”๊ฐ€
public-hoist-pattern[]=tailwindcss
public-hoist-pattern[]=postcss

์ผ€์ด์Šค 3: Prisma ์ƒ์„ฑ ํŒŒ์ผ ์ธ์‹ ๋ชปํ•จ

# ์—๋Ÿฌ
Cannot find module '@prisma/client'

์›์ธ: Prisma ๋Š” postinstall ์‹œ node_modules/.prisma/client ์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, pnpm ์˜ ๊ฒฉ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฆ„
ํ•ด๊ฒฐ:

// package.json scripts ์— ์ถ”๊ฐ€
{
  "scripts": {
    "postinstall": "prisma generate"
  }
}

์ผ€์ด์Šค 4: ์‹ฌ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•˜๋Š” ๊ตฌํ˜• ๋„๊ตฌ

# ์ตœํ›„์˜ ์ˆ˜๋‹จ โ€” .npmrc
shamefully-hoist=true
# ๋˜๋Š”
node-linker=hoisted

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

pnpm node_modules ๊ตฌ์กฐ ํ•ต์‹ฌ ์ •๋ฆฌ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
๋ฃจํŠธ node_modules: package.json ์ง์ ‘ ์˜์กด์„ฑ๋งŒ ์‹ฌ๋งํฌ๋กœ ๋…ธ์ถœ
.pnpm/:           ๋ชจ๋“  ํŒจํ‚ค์ง€ + ๊ฐ„์ ‘ ์˜์กด์„ฑ์ด ํ•˜๋“œ๋งํฌ๋กœ ์ €์žฅ
ํ”ผ์–ด ์˜์กด์„ฑ:       ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉด .pnpm/ํŒจํ‚ค์ง€@๋ฒ„์ „_ํ”ผ์–ด@๋ฒ„์ „ ์œผ๋กœ ๋ถ„๋ฆฌ
ํ˜ธ์ด์ŠคํŒ… ์ œ์–ด:     public-hoist-pattern ์œผ๋กœ ์„ ํƒ์  ๋ฃจํŠธ ๋…ธ์ถœ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
์„ค์ •ํšจ๊ณผ๋ถ€์ž‘์šฉ
public-hoist-pattern[]=*eslint*eslint ๊ณ„์—ด ๋ฃจํŠธ ๋…ธ์ถœ์—†์Œ
shamefully-hoist=truenpm ์ฒ˜๋Ÿผ ์ „์ฒด ํ˜ธ์ด์ŠคํŒ…ํŒฌํ…€ ์˜์กด์„ฑ ํ—ˆ์šฉ
nodeLinker=hoistednpm ๋ฐฉ์‹ ๊ตฌ์กฐํŒฌํ…€ ์˜์กด์„ฑ ํ—ˆ์šฉ
auto-install-peers=trueํ”ผ์–ด ์ž๋™ ์„ค์น˜์—†์Œ (๊ธฐ๋ณธ๊ฐ’)

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

Q1. .pnpm ํด๋” ๋‚ด์˜ ์„œ๋ธŒ ํด๋”๋ช…์ด some-plugin@1.0.0_react@17.0.2 ์ฒ˜๋Ÿผ ํ”ผ์–ด ๋ฒ„์ „๊นŒ์ง€ ํฌํ•จ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

โœ… ์ •๋‹ต: ๋™์ผํ•œ ํŒจํ‚ค์ง€๋ผ๋„ ํ”ผ์–ด ์˜์กด์„ฑ ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. some-plugin ์ด react@17 ๊ณผ react@18 ํ™˜๊ฒฝ์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, pnpm ์€ ์ด๋ฅผ ๋ณ„๋„ ํด๋”๋กœ ๊ฒฉ๋ฆฌ ํ•˜์—ฌ ๋‘ ๋ฒ„์ „์ด ๊ณต์กดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

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

  • npm ์€ ํ”ผ์–ด ์˜์กด์„ฑ ์ถฉ๋Œ์„ "๊ทธ๋ƒฅ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ๋งŒ ์ถœ๋ ฅ" ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค
  • pnpm ์€ ํ”ผ์–ด ๋ฒ„์ „๊นŒ์ง€ ํด๋”๋ช…์— ํฌํ•จ์‹œ์ผœ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ โ†’ ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋‘ ์ปจํ…์ŠคํŠธ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์กด
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "ํ”ผ์–ด๊ฐ€ ๋‹ค๋ฅด๋ฉด ์‚ฌ์‹ค ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋‹ค โ€” pnpm ์ด ์ด ์‚ฌ์‹ค์„ ํด๋”๋ช…์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค."

Q2. public-hoist-pattern ๊ณผ shamefully-hoist ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

โœ… ์ •๋‹ต: public-hoist-pattern ์€ ํŒจํ„ด์— ์ผ์น˜ํ•˜๋Š” ํŒจํ‚ค์ง€๋งŒ ์„ ํƒ์ ์œผ๋กœ ๋ฃจํŠธ node_modules ์— ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค. shamefully-hoist=true ๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ npm ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ฃจํŠธ๋กœ ํ˜ธ์ด์ŠคํŒ…ํ•˜์—ฌ ํŒฌํ…€ ์˜์กด์„ฑ์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ „์ž๋Š” pnpm ์˜ ๊ฒฉ๋ฆฌ ์ฒ ํ•™์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํŠน์ • ๋„๊ตฌ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ํ›„์ž๋Š” ๋น ๋ฅธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋‚˜ ๊ตฌํ˜• ๋„๊ตฌ ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜ ์—†์„ ๋•Œ๋งŒ ์“ด๋‹ค.

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

  • public-hoist-pattern[]=*eslint* โ†’ eslint ๊ด€๋ จ ํŒจํ‚ค์ง€๋งŒ ๋ฃจํŠธ ๋…ธ์ถœ, ๋‚˜๋จธ์ง€ ๊ฒฉ๋ฆฌ ์œ ์ง€
  • shamefully-hoist=true โ†’ pnpm ์„ npm ์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด๋ฒ„๋ฆผ (์ด๋ฆ„๋ถ€ํ„ฐ "์ฐฝํ”ผํ•œ" ์ด์œ )
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์™ธ๊ณผ ์ˆ˜์ˆ (public-hoist-pattern) vs ์ „์‹ ๋งˆ์ทจ(shamefully-hoist) โ€” ๊ฐ€๋Šฅํ•˜๋ฉด ์™ธ๊ณผ ์ˆ˜์ˆ ์„ ํƒํ•˜๋ผ."

Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„: ๊ธด๊ธ‰ ๋””๋ฒ„๊น… (์˜์ˆ˜์˜ ํ˜ธํ†ต)

์˜์ˆ˜ ๋‹˜์ด Slack ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒˆ๋‹ค.
"์˜์ฒ  ๋‹˜, QA ์„œ๋ฒ„์—์„œ ๋นŒ๋“œ ์‹คํŒจํ–ˆ์–ด์š”. Cannot find module 'typescript' ์—๋Ÿฌ์ธ๋ฐ ๋กœ์ปฌ์—์„œ๋Š” ์ž˜ ๋˜๊ฑฐ๋“ ์š”? ์˜ค๋Š˜ pnpm ์œผ๋กœ ๋ฐ”๊พผ ๊ฑฐ๋ž‘ ๊ด€๋ จ ์žˆ๋‚˜์š”?"

์˜์ฒ ์ด๊ฐ€ ํ™•์ธํ•ด๋ณด๋‹ˆ ๋กœ์ปฌ .npmrc ์—๋Š” public-hoist-pattern[]=*types* ๊ฐ€ ์žˆ๋Š”๋ฐ QA ์„œ๋ฒ„์˜ .npmrc ์—๋Š” ์—†์—ˆ๋‹ค. ์ด ์ƒํ™ฉ์˜ ๊ทผ๋ณธ ์›์ธ๊ณผ ํ•ด๊ฒฐ์ฑ…์€?

โœ… ์ •๋‹ต: .npmrc ํŒŒ์ผ์ด ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ฌ๋ผ์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋‹ค. .npmrc ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์ปค๋ฐ‹ ๋˜์–ด์•ผ ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ hoisting ์„ค์ •์ด ์ ์šฉ๋œ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ .npmrc ์— ํ•„์š”ํ•œ public-hoist-pattern ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ  git ์— ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

  • .npmrc ๋Š” ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ๋กœ๋“œ๋จ: ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ โ†’ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ(~/.npmrc) โ†’ ์ „์—ญ
  • ๋กœ์ปฌ ๊ฐœ๋ฐœ์ž์˜ ~/.npmrc ์—๋งŒ ์žˆ๋˜ ์„ค์ •์ด CI/QA ์„œ๋ฒ„์—๋Š” ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•œ ํ•จ์ •
  • ์˜ฌ๋ฐ”๋ฅธ ๊ด€๋ฆฌ: ํ”„๋กœ์ ํŠธ๋ณ„ pnpm ์„ค์ •์€ .npmrc(ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ) ์— ๋‘๊ณ  git ์— ์ปค๋ฐ‹
  • ์ฃผ์˜: ํ† ํฐ(_authToken) ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ ˆ๋Œ€ git ์— ์ปค๋ฐ‹ํ•˜์ง€ ๋ง ๊ฒƒ (ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์‚ฌ์šฉ)
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์„ค์ •์€ ์ฝ”๋“œ๋‹ค โ€” .npmrc ๋„ git ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ผ."

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

์˜ค๋Š˜ ์˜ค์ „์— pnpm ์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค๊ฐ€ ESLint ๊ฐ€ ์•ˆ ๋ผ์„œ ํ•œ ์‹œ๊ฐ„ ๋‚ ๋ ธ๋‹ค. .pnpm ํด๋” ์•ˆ์— eslint ๊ฐ€ ์ž˜ ์žˆ๋Š”๋ฐ ์™œ ๋ชป ์ฐพ๋ƒ๊ณ  ๋‹ต๋‹ตํ•ด์„œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ—ค๋งธ๋‹ค.

๊ฒฐ๊ตญ ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜ํ•œํ…Œ ๋ฌผ์–ด๋ดค๋Š”๋ฐ .npmrc ํ•œ ์ค„์ด ๋‹ต์ด์—ˆ๋‹ค. public-hoist-pattern[]=*eslint*. ๋ญ”๊ฐ€ ๋˜๊ฒŒ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ด์—ˆ๋Š”๋ฐ ์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋‹ˆ๊นŒ ํ•œ ์‹œ๊ฐ„์ด๋‚˜ ํ—ˆ๋น„ํ•œ ๊ฑฐ์˜€๋‹ค.

๊ทธ๋‚˜์ €๋‚˜ .pnpm ํด๋” ๊ตฌ์กฐ๊ฐ€ ์ง„์งœ ์‹ ๊ธฐํ•˜๋‹ค. some-package@1.0.0_react@18.2.0 ์ด๋Ÿฐ ์ด๋ฆ„์œผ๋กœ ํ”ผ์–ด ์˜์กด์„ฑ ๋ฒ„์ „๊นŒ์ง€ ํด๋”๋ช…์— ๋ฐ•์•„๋ฒ„๋ฆฌ๋Š” ๋ฐฉ์‹์ด ์ฒ˜์Œ์—” ์ด์ƒํ•ด๋ณด์˜€๋Š”๋ฐ, ์•Œ๊ณ  ๋ณด๋‹ˆ๊นŒ ์—„์ฒญ ์˜๋ฆฌํ•œ ์„ค๊ณ„์˜€๋‹ค. ํ”ผ์–ด๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ๋ผ๋Š” ๊ฑธ ํด๋” ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฑฐ์ž–์•„.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "pnpm ์—์„œ '๋ชจ๋“ˆ ๋ชป ์ฐพ๊ฒ ๋‹ค'๋Š” ์—๋Ÿฌ๋Š” ์‹ญ์ค‘ํŒ”๊ตฌ .npmrc ์— public-hoist-pattern ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค. ๊ตฌ์กฐ๋ฅผ ์•Œ๋ฉด ๋‹นํ™ฉํ•˜์ง€ ์•Š๋Š”๋‹ค."

๋‚ด์ผ์€ pnpm CLI ๋ช…๋ น์–ด๋ž‘ pnpm-lock.yaml ๊ตฌ์กฐ ๊ณต๋ถ€ํ•ด์•ผ์ง€. ์˜ค๋Š˜์€ ์น˜ํ‚จ ๋จน๊ณ  ์ผ์ฐ ์ž์•ผ๊ฒ ๋‹ค. ๋จธ๋ฆฌ๊ฐ€ ๋ฌด๊ฑฐ์›Œ.


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