๐Ÿ“ฆ npm ๋ฉ˜ํƒˆ ๋ชจ๋ธ โ€” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ํŒจํ‚ค์ง€, ๋ชจ๋“ˆ์„ ๊ฟฐ๋šซ์–ด๋ผ

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

๐Ÿ“‹ ๊ฐœ์š”

npm ์ด ๋ฌด์—‡์ธ์ง€, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ํŒจํ‚ค์ง€์™€ ๋ชจ๋“ˆ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ์ง€ โ€” ์‹œ๋‹ˆ์–ด๊ฐ€ ๊ฐ–๋Š” ๊ทผ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ์‹ฌ๋Š”๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


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

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

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
npm ์˜ ์ •์ฒด ํŒŒ์•… โ†’ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋™์ž‘ ์›๋ฆฌ โ†’ ํŒจํ‚ค์ง€ vs ๋ชจ๋“ˆ ๊ตฌ๋ถ„ โ†’ install ๋‚ด๋ถ€ ๊ณผ์ • โ†’ ์บ์‹œ ์›๋ฆฌ โ†’ ์—๋Ÿฌ ํ•ด๊ฒฐ

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

  • npm ์ด CLI / ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ / ์›น์‚ฌ์ดํŠธ ์„ธ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํŒจํ‚ค์ง€์™€ ๋ชจ๋“ˆ์˜ ์ฐจ์ด๋ฅผ ์ •ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • @org/package ํ˜•ํƒœ์˜ ์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€๊ฐ€ ์™œ ์“ฐ์ด๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค
  • npm install ์ด ๋‚ด๋ถ€์ ์œผ๋กœ HTTP ์š”์ฒญ โ†’ tarball ๋‹ค์šด โ†’ ์บ์‹œ โ†’ ์••์ถ• ํ•ด์ œ ์ˆœ์œผ๋กœ ๋™์ž‘ํ•จ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • EACCES, ENOENT, ERESOLVE ์—๋Ÿฌ๋ฅผ ๋ณด๊ณ  ์›์ธ์„ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค

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

ERESOLVE ์—๋Ÿฌ๋กœ ํŒจ๋‹‰์— ๋น ์ง„ ์˜์ฒ ๊ณผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์˜ํ˜ธ
  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "๋ฆฌ๋“œ ๋‹˜, ์ € ์˜ค๋Š˜ npm install ํ–ˆ๋Š”๋ฐ ERESOLVE unable to resolve dependency tree ๋ผ๊ณ  ์—„์ฒญ๋‚œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์–ด์š”. ๊ตฌ๊ธ€๋งํ•ด๋„ ๋ฌด์Šจ ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๊ณ ... ๊ทธ๋ƒฅ --legacy-peer-deps ๋ถ™์ด๋ฉด ๋œ๋‹ค๊ณ  ํ•ด์„œ ๋ถ™์˜€๋Š”๋ฐ ๊ทธ๊ฒŒ ๋งž๋Š” ๊ฑด๊ฐ€์š”? ์•„ ๊ทธ๋ฆฌ๊ณ  @youngsoo/ui ๊ฐ™์ด ๊ณจ๋ฑ…์ด ๋ถ™์€ ํŒจํ‚ค์ง€๋Š” ๋ญ”๊ฐ€์š”? ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๋ž‘ ๋‹ค๋ฅธ ๊ฑด๊ฐ€์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, --legacy-peer-deps ๋Š” ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฎ์–ด์”Œ์šด ๊ฑฐ์˜ˆ์š”. ์˜์กด์„ฑ ์ถฉ๋Œ์ด ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ฒ ๋‹ค๋Š” ์„ ์–ธ์ด์—์š”. ๊ทผ๋ณธ์ ์œผ๋กœ npm ์ด ๋ญ˜ ํ•˜๋Š”์ง€๋ถ€ํ„ฐ ์ดํ•ดํ•ด์•ผ ์ด๋Ÿฐ ์—๋Ÿฌ๋ฅผ ์ง„์งœ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”. @youngsoo/ui ๋Š” ์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€์ธ๋ฐ, ์ด๊ฒƒ๋„ ์›๋ฆฌ๋ฅผ ์•Œ๋ฉด ์™œ ์ด ํ˜•ํƒœ๋ฅผ ์“ฐ๋Š”์ง€ ๋ฐ”๋กœ ๋‚ฉ๋“์ด ๊ฐ€์š”."

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

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒ€์— ์˜์ฒ ์ด๊ฐ€ ํ•ฉ๋ฅ˜ํ•œ ์ฒซ ๋‚ . ์„ค๋ ˆ๋Š” ๋งˆ์Œ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ํ•˜๊ณ  npm install ์„ ์‹คํ–‰ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ„ฐ๋ฏธ๋„์ด ๋นจ๊ฐ„ ์—๋Ÿฌ๋กœ ๊ฐ€๋“ ์ฐผ๋‹ค.

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! peer dep missing: react@"^17.0.0", required by some-legacy-ui@3.0.0

์˜์ฒ ์ด๋Š” ๊ตฌ๊ธ€๋ง ๋์— --legacy-peer-deps ๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๊ธ€์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ–ˆ๋‹ค. ์„ค์น˜๋Š” ๋์ง€๋งŒ, ๋‹ค์Œ ๋‚  QA ์—์„œ ์ด์ƒํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋๋‹ค. ๋ฆฌ์•กํŠธ ์ปจํ…์ŠคํŠธ ๊ฐ’์ด UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์—์„œ ์ „๋‹ฌ์ด ์•ˆ ๋˜๋Š” ํ˜„์ƒ์ด์—ˆ๋‹ค.

๋ฒ”์ธ์€ --legacy-peer-deps ์˜€๋‹ค. ์ด ์˜ต์…˜์€ peer dependency ์ถฉ๋Œ์„ "๋ฌด์‹œ"ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์˜ React ๊ฐ€ ๊ณต์กดํ•˜๊ฒŒ ๋˜์–ด Context ๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.

npm ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด, ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ง„์งœ๋กœ ํ•ด๊ฒฐํ•˜๋Š”์ง€๊ฐ€ ๋ณด์ธ๋‹ค.


๐ŸŒ npm ์˜ ์„ธ ๊ฐ€์ง€ ์–ผ๊ตด

๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ "npm = npm install ์น˜๋Š” ๋„๊ตฌ" ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ npm ์€ ์ •ํ™•ํžˆ ์„ธ ๊ฐ€์ง€ ์—ญํ• ์„ ๋™์‹œ์— ํ•œ๋‹ค.

1. ์›น์‚ฌ์ดํŠธ (npmjs.com)

ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ , ๋‹ค์šด๋กœ๋“œ ํ†ต๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š” ํฌํ„ธ.

https://www.npmjs.com/package/react  โ† ์—ฌ๊ธฐ์„œ ํŒจํ‚ค์ง€ ์ •๋ณด ํ™•์ธ

2. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Registry)

์ „ ์„ธ๊ณ„ npm ํŒจํ‚ค์ง€๋“ค์ด ์ €์žฅ๋œ ๊ฑฐ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด์ž HTTP ์„œ๋ฒ„. ์˜ค๋Š˜ ๊ธฐ์ค€ ์•ฝ 200๋งŒ ๊ฐœ ์ด์ƒ์˜ ํŒจํ‚ค์ง€๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค.

https://registry.npmjs.org/react        โ† ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (JSON)
https://registry.npmjs.org/react/-/react-18.2.0.tgz  โ† ์‹ค์ œ ์ฝ”๋“œ ํŒŒ์ผ (tarball)

3. CLI (๋ช…๋ น์ค„ ๋„๊ตฌ)

์šฐ๋ฆฌ๊ฐ€ ํ„ฐ๋ฏธ๋„์—์„œ ์ž…๋ ฅํ•˜๋Š” npm install, npm run build, npm publish ๋“ฑ์˜ ๋ช…๋ น์–ด ๋„๊ตฌ.

npm install react      # ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ react ๋ฅผ ๋ฐ›์•„ node_modules ์— ์„ค์น˜
npm run build          # package.json ์˜ scripts.build ์‹คํ–‰
npm publish            # ๋‚ด ํŒจํ‚ค์ง€๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์—…๋กœ๋“œ

๐Ÿฆ ์˜ํ˜ธ์˜ ์ธ์‚ฌ์ดํŠธ: "npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ๊ฒฐ๊ตญ HTTP API ์„œ๋ฒ„์˜ˆ์š”. curl https://registry.npmjs.org/react ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด react ์˜ ๋ชจ๋“  ๋ฒ„์ „ ์ •๋ณด๊ฐ€ JSON ์œผ๋กœ ์ญ‰ ๋‚˜์™€์š”. CLI ๋Š” ์ด API ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•„์š”ํ•œ ์ •๋ณด์™€ ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ˆ์š”."


๐Ÿ“ฆ ํŒจํ‚ค์ง€ vs ๋ชจ๋“ˆ โ€” ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ๋‘ ๊ฐœ๋…

ํŒจํ‚ค์ง€ (Package) = package.json ์ด ์žˆ๋Š” ํด๋” (๋˜๋Š” ๊ทธ๊ฑธ ์••์ถ•ํ•œ tarball)
๋ชจ๋“ˆ  (Module)  = Node.js ์—์„œ require() / import ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

ํŒจํ‚ค์ง€์ด๋ฉด์„œ ๋ชจ๋“ˆ์ธ ๊ฒฝ์šฐ (๊ฐ€์žฅ ํ”ํ•œ ์ผ€์ด์Šค)

node_modules/
  react/               โ† package.json ์žˆ์Œ (ํŒจํ‚ค์ง€) + import ๊ฐ€๋Šฅ (๋ชจ๋“ˆ)
    package.json
    index.js
    jsx-runtime.js

๋ชจ๋“ˆ์ด์ง€๋งŒ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

// src/utils/formatDate.ts
// package.json ์—†์Œ โ†’ ํŒจํ‚ค์ง€ ์•„๋‹˜, ๊ทธ๋Ÿฌ๋‚˜ import ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ชจ๋“ˆ
export const formatDate = (date: Date): string => { ... }

ํŒจํ‚ค์ง€์ด์ง€๋งŒ ๋ชจ๋“ˆ์ด ์•„๋‹Œ ๊ฒฝ์šฐ

node_modules/
  some-cli-tool/       โ† package.json ์žˆ์Œ (ํŒจํ‚ค์ง€)
    package.json
    bin/
      cli.js           โ† ํ•˜์ง€๋งŒ require() ๋กœ ๋ถˆ๋Ÿฌ ์“ฐ๋Š” ์šฉ๋„๊ฐ€ ์•„๋‹˜

๐Ÿ’ก ํ•ต์‹ฌ: ๋ชจ๋“  npm ํŒจํ‚ค์ง€๊ฐ€ ๋ชจ๋“ˆ์€ ์•„๋‹ˆ๋‹ค. CLI ๋„๊ตฌ์ฒ˜๋Ÿผ ์„ค์น˜๋Š” ๋˜์ง€๋งŒ ์ฝ”๋“œ์—์„œ ์ง์ ‘ import ํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€๋“ค์ด ์žˆ๋‹ค. ์ด ๊ตฌ๋ถ„์€ peerDependencies ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค.


๐Ÿ” ์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€ โ€” @org/package ์˜ ์˜๋ฏธ

npm install @types/react       # @types ์Šค์ฝ”ํ”„
npm install @tanstack/react-query  # @tanstack ์Šค์ฝ”ํ”„
npm install @youngsoo/ui       # ์˜์ˆ˜๋„ค ํŒ€ ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„

์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€์˜ ํ˜•ํƒœ: @์Šค์ฝ”ํ”„๋ช…/ํŒจํ‚ค์ง€๋ช…

์™œ ์Šค์ฝ”ํ”„๋ฅผ ์“ฐ๋Š”๊ฐ€?

1. ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€

react-query        โ† ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ์ ์œ  ์ค‘์ผ ์ˆ˜ ์žˆ์Œ
@tanstack/react-query  โ† @tanstack ์Šค์ฝ”ํ”„ ์•„๋ž˜์—์„œ ๊ณ ์œ ํ•˜๊ฒŒ ์กด์žฌ

2. ์ ‘๊ทผ ์ œ์–ด (๊ณต๊ฐœ vs ๋น„๊ณต๊ฐœ)

# ๊ณต๊ฐœ ์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€ โ€” ๋ˆ„๊ตฌ๋‚˜ ์„ค์น˜ ๊ฐ€๋Šฅ
npm install @types/react
 
# ๋น„๊ณต๊ฐœ ์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€ โ€” ์ธ์ฆ๋œ ํŒ€์›๋งŒ ์„ค์น˜ ๊ฐ€๋Šฅ
npm install @youngsoo/ui   # ๋‚ด๋ถ€ private ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ด

3. ์˜์ˆ˜๋„ค ํŒ€ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€ ์šด์šฉ

# .npmrc ์— ๋‚ด๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •
@youngsoo:registry=https://npm.youngsoo.internal.com/
// package.json
// ๐Ÿ’ก @ ๊ธฐํ˜ธ(์Šค์ฝ”ํ”„)๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉด npm์€ "์•„, ์ด๊ฑด ํŠน์ • ์กฐ์ง(org) ์†Œ์† ํŒจํ‚ค์ง€๊ตฌ๋‚˜" ํ•˜๊ณ  ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค.
// .npmrc ์— ์„ค์ •ํ•ด ๋‘” ๋Œ€๋กœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
{
  "dependencies": {
    // ๐Ÿฆ ์šฐ๋ฆฌ ํŒ€ ๋‚ด๋ถ€ ์ €์žฅ์†Œ(npm.youngsoo.internal.com)์—์„œ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‹œํฌ๋ฆฟ ํŒจํ‚ค์ง€๋“ค!
    "@youngsoo/ui": "^1.0.0",       
    "@youngsoo/utils": "^2.0.0",    
    // ๐ŸŒ ์ด๊ฑด ๊ณจ๋ฑ…์ด๊ฐ€ ์—†์œผ๋‹ˆ ๊ณต์‹ npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(๊ธฐ๋ณธ๊ฐ’)์—์„œ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    "react": "^18.2.0"              
  }
}

๐Ÿฃ ์˜์ฒ : "์•„, ๊ทธ๋Ÿฌ๋ฉด @types/react ๋Š” TypeScript ํŒ€์ด ์˜ฌ๋ฆฐ ๊ณต์‹ ํƒ€์ž… ํŒจํ‚ค์ง€๊ณ , @youngsoo/ui ๋Š” ์šฐ๋ฆฌ ํŒ€์ด ์˜ฌ๋ฆฐ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋„ค์š”?"

๐Ÿฆ ์˜ํ˜ธ: "์ •ํ™•ํ•ด์š”. @types ๋Š” DefinitelyTyped ๋ผ๋Š” ์˜คํ”ˆ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐœ ์Šค์ฝ”ํ”„์˜ˆ์š”. ๋ˆ„๊ฐ€ ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“œ๋А๋ƒ์— ๋”ฐ๋ผ ๊ณต๊ฐœ/๋น„๊ณต๊ฐœ, ๋‚ด๋ถ€/์™ธ๋ถ€๊ฐ€ ๊ฒฐ์ •๋ผ์š”."


โš™๏ธ npm install ์ด ์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ

npm install react ํ•œ ์ค„์ด ์‹คํ–‰๋  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •:

โ‘  package.json ํŒŒ์‹ฑ
   โ””โ”€ "react": "^18.2.0" ํ™•์ธ

โ‘ก ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ (HTTP GET)
   โ””โ”€ GET https://registry.npmjs.org/react
   โ””โ”€ ์‘๋‹ต: ๋ชจ๋“  ๋ฒ„์ „ ๋ชฉ๋ก, ์˜์กด์„ฑ ํŠธ๋ฆฌ, dist ์ •๋ณด

โ‘ข ๋ฒ„์ „ Resolution (^18.2.0 ๋ฒ”์œ„์—์„œ ์ตœ์‹  ๋ฒ„์ „ ์„ ํƒ)
   โ””โ”€ ๊ฒฐ์ •: react@18.2.0

โ‘ฃ ์˜์กด์„ฑ ํŠธ๋ฆฌ ๊ณ„์‚ฐ
   โ””โ”€ react@18.2.0 ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ: loose-envify, scheduler...
   โ””โ”€ ์žฌ๊ท€์ ์œผ๋กœ ์˜์กด์„ฑ์˜ ์˜์กด์„ฑ๊นŒ์ง€ ๊ณ„์‚ฐ

โ‘ค tarball ๋‹ค์šด๋กœ๋“œ (์บ์‹œ ํ™•์ธ ๋จผ์ €)
   โ””โ”€ GET https://registry.npmjs.org/react/-/react-18.2.0.tgz
   โ””โ”€ ~/.npm ์บ์‹œ์— ์ €์žฅ

โ‘ฅ node_modules/ ์— ์••์ถ• ํ•ด์ œ

โ‘ฆ package-lock.json ๊ฐฑ์‹ 

์˜์กด์„ฑ ํŠธ๋ฆฌ๊ฐ€ ๋ณต์žกํ•œ ์ด์œ 

react ์„ค์น˜ ์š”์ฒญ
  โ””โ”€ react@18.2.0
       โ”œโ”€ loose-envify@1.4.0
       โ”‚    โ””โ”€ js-tokens@4.0.0
       โ””โ”€ scheduler@0.23.0

react ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•ด๋„ ์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค. npm ์€ ์ด ๋ชจ๋“  ์˜์กด์„ฑ์˜ ์˜์กด์„ฑ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ํ•ด์„œ ์„ค์น˜ํ•œ๋‹ค.

๐Ÿ”ฅ ERESOLVE ์—๋Ÿฌ์˜ ์ง„์งœ ์›์ธ: ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋‹ค๊ฐ€ ์„œ๋กœ ์–‘๋ฆฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถฉ๋Œํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ A ๋Š” react@^17 ์„ ์š”๊ตฌํ•˜๊ณ , ๋‚ด ์•ฑ์€ react@18 ์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๋‹ค. --legacy-peer-deps ๋Š” ์ด ์ถฉ๋Œ์„ ๋ฌด์‹œํ•˜๊ณ  ๊ฐ•ํ–‰ํ•˜๋Š” ์˜ต์…˜์œผ๋กœ, ์ถฉ๋Œ์ด ๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ’พ npm ์บ์‹œ โ€” ๋‘ ๋ฒˆ์งธ install ์ด ๋น ๋ฅธ ์ด์œ 

npm ์€ ํ•œ ๋ฒˆ ๋‹ค์šด๋กœ๋“œํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋กœ์ปฌ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.

~/.npm/                          # ์บ์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ (๊ธฐ๋ณธ๊ฐ’)
  _cacache/
    content-v2/
      sha512/                    # tarball ์„ SHA512 ํ•ด์‹œ๋กœ ์ €์žฅ
        a1/b2/c3.../
npm cache verify      # ์บ์‹œ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ
npm cache clean --force  # ์บ์‹œ ์ „์ฒด ์‚ญ์ œ (์ด์ƒํ•  ๋•Œ๋งŒ ์”€)

CI ํ™˜๊ฒฝ์—์„œ ์บ์‹œ ํ™œ์šฉ:

# ๐Ÿ’ก GitHub Actions ์—์„œ Node.js ํŒจํ‚ค์ง€ ์„ค์น˜ ์‹œ๊ฐ„์„ ํ˜์‹ ์ ์œผ๋กœ ๋‹จ์ถ•ํ•˜๋Š” ๋งˆ๋ฒ•์˜ ์ฃผ๋ฌธ์ž…๋‹ˆ๋‹ค.
 
- name: Cache npm
  uses: actions/cache@v3
  with:
    # ๐Ÿฆ npm์ด ํŒจํ‚ค์ง€(tarball)๋ฅผ ์บ์‹ฑํ•ด๋‘๋Š” ๋ฐ”๋กœ ๊ทธ ํด๋”๋ฅผ ํ†ต์งธ๋กœ ๊นƒํ—ˆ๋ธŒ ์„œ๋ฒ„ ์•ˆ์— ์ €์žฅํ•ด๋ผ!
    path: ~/.npm
    
    # ์บ์‹œ๋ฅผ ์ฐพ์„ ๋•Œ ์“ธ ๊ณ ์œ  ์—ด์‡  (lock ํŒŒ์ผ ๋‚ด์šฉ์ด ๋ณ€ํ•˜๋ฉด ์ด ์—ด์‡  ๋ชจ์–‘๋„ ๋ฐ”๋€œ -> ์ƒˆ๋กœ ๋ฐ›์•„์•ผ ํ•จ)
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-
 
- name: Install dependencies
  # ๐Ÿ’ก npm install ๋Œ€์‹  npm ci ๋ฅผ ์“ฐ๋ฉด ์บ์‹œ๋ฅผ ์—„์ฒญ ๋น ๋ฅด๊ฒŒ ์ฝ์–ด์™€์„œ node_modules ์— ํ’€์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  run: npm ci

package-lock.json ์˜ ํ•ด์‹œ๋ฅผ ์บ์‹œ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋ฉด, lock ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™”๋˜์–ด CI ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿšจ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” npm ์—๋Ÿฌ ํ•ด๊ฒฐ

EACCES โ€” ๊ถŒํ•œ ์—๋Ÿฌ

npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /usr/local/lib/node_modules

์›์ธ: ์ „์—ญ ์„ค์น˜(-g) ์‹œ ๋ฃจํŠธ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ๊ฒฝ๋กœ์— ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ.

ํ•ด๊ฒฐ:

# โŒ ์ ˆ๋Œ€ ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ๋งˆ๋ผ โ€” ๋ณด์•ˆ ์œ„ํ—˜
sudo npm install -g some-package
 
# โœ… nvm ์œผ๋กœ Node.js ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๊ถŒํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์Œ
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
nvm install 18
nvm use 18
npm install -g some-package   # ๊ถŒํ•œ ๋ฌธ์ œ ์—†์Œ

ERESOLVE โ€” ์˜์กด์„ฑ ์ถฉ๋Œ

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree

์›์ธ: ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „ ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ๋Œ.

ํ•ด๊ฒฐ ์ˆœ์„œ:

# 1๋‹จ๊ณ„: ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ์ถฉ๋Œํ•˜๋Š”์ง€ ํŒŒ์•…
npm install --verbose 2>&1 | grep "ERESOLVE"
 
# 2๋‹จ๊ณ„: overrides ๋กœ ๋ฒ„์ „ ๊ฐ•์ œ ํ†ต์ผ (package.json)
# (4์žฅ ์˜์กด์„ฑ ํŽธ์—์„œ ์ƒ์„ธ ์„ค๋ช…)
 
# 3๋‹จ๊ณ„: ์ •๋ง ๋ถ€๋“์ดํ•  ๋•Œ๋งŒ legacy-peer-deps ์‚ฌ์šฉ
npm install --legacy-peer-deps

ENOENT โ€” ํŒŒ์ผ์„ ๋ชป ์ฐพ์„ ๋•Œ

npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /path/to/package.json

์›์ธ: ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— package.json ์ด ์—†๋Š” ๊ฒฝ์šฐ.

# ์˜ฌ๋ฐ”๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ์ง€ ํ™•์ธ
ls package.json
 
# ์—†๋‹ค๋ฉด ์ดˆ๊ธฐํ™”
npm init -y

ENOTFOUND โ€” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์—ฐ๊ฒฐ ์‹คํŒจ

npm ERR! code ENOTFOUND
npm ERR! errno ENOTFOUND
npm ERR! network request to https://registry.npmjs.org/... failed

์›์ธ: ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋˜๋Š” ์ž˜๋ชป๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •.

# ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ • ํ™•์ธ
npm config get registry
 
# ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
npm config set registry https://registry.npmjs.org/

๐Ÿ ์ด๋ฒˆ์— ๋ฐฐ์šด ๋‚ด์šฉ ์ด์ •๋ฆฌ

๊ฐœ๋…ํ•ต์‹ฌ ์š”์•ฝ
npm 3 ์—ญํ• ์›น์‚ฌ์ดํŠธ(๊ฒ€์ƒ‰) + ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(์ €์žฅ์†Œ HTTP ์„œ๋ฒ„) + CLI(๋ช…๋ น์–ด ๋„๊ตฌ)
ํŒจํ‚ค์ง€ vs ๋ชจ๋“ˆํŒจํ‚ค์ง€ = package.json ์žˆ๋Š” ๊ฒƒ, ๋ชจ๋“ˆ = import ๊ฐ€๋Šฅํ•œ ๊ฒƒ. ๊ฒน์น˜์ง€๋งŒ ๊ฐ™์€ ๊ฐœ๋…์€ ์•„๋‹˜
์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€@org/name ํ˜•ํƒœ๋กœ ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€ + ์ ‘๊ทผ ์ œ์–ด ๊ฐ€๋Šฅ
install ๊ณผ์ •๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ โ†’ ๋ฒ„์ „ ๊ฒฐ์ • โ†’ ์˜์กด์„ฑ ํŠธ๋ฆฌ ๊ณ„์‚ฐ โ†’ tarball ๋‹ค์šด โ†’ ์บ์‹œ ์ €์žฅ โ†’ ์••์ถ• ํ•ด์ œ
npm ์บ์‹œ~/.npm ์— tarball ์ €์žฅ. CI ์—์„œ ์บ์‹œํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•
ERESOLVE์˜์กด์„ฑ ๋ฒ„์ „ ์ถฉ๋Œ. --legacy-peer-deps ๋Š” ๋ฏธ๋ด‰์ฑ…, overrides ๋กœ ์ง„์งœ ํ•ด๊ฒฐ

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

Q1. npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์€?

a) npm CLI ์™€ ๋™์ผํ•œ ๊ฐœ๋…์œผ๋กœ, ์„ค์น˜ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„๊ตฌ๋‹ค
b) ํŒจํ‚ค์ง€์˜ ์†Œ์Šค์ฝ”๋“œ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” HTTP ์„œ๋ฒ„๋‹ค
c) node_modules ํด๋”์™€ ๋™์ผํ•œ ๊ฐœ๋…์ด๋‹ค
d) ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ์„ค์น˜๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹ค

โœ… ์ •๋‹ต: b โ€” ํŒจํ‚ค์ง€์˜ ์†Œ์Šค์ฝ”๋“œ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” HTTP ์„œ๋ฒ„๋‹ค

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

  • ์›๋ฆฌ ์„ค๋ช…: npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” https://registry.npmjs.org ์—์„œ ๋™์ž‘ํ•˜๋Š” HTTP API ์„œ๋ฒ„๋‹ค. curl https://registry.npmjs.org/react ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด react ์˜ ๋ชจ๋“  ๋ฒ„์ „ ์ •๋ณด๊ฐ€ JSON ์œผ๋กœ ์‘๋‹ต๋œ๋‹ค. CLI ๋Š” ์ด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ํŒจํ‚ค์ง€๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: a โ€” CLI ์™€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค. CLI ๋Š” ํด๋ผ์ด์–ธํŠธ, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ์„œ๋ฒ„๋‹ค. c โ€” node_modules ๋Š” ๋‚ด ์ปดํ“จํ„ฐ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋“ค์˜ ๋ฌผ๋ฆฌ์  ํด๋”๋‹ค. d โ€” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ์›๊ฒฉ ์„œ๋ฒ„๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "npm CLI ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ผ๋Š” ์›๊ฒฉ ์„œ๋ฒ„์˜ ํด๋ผ์ด์–ธํŠธ๋‹ค."

Q2. ์•„๋ž˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ทผ๋ณธ ์›์ธ์€ ๋ฌด์—‡์ธ๊ฐ€?

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! peer dep missing: react@"^17.0.0", required by some-legacy-ui@2.0.0

a) npm ์ด ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์—†๋‹ค
b) some-legacy-ui@2.0.0 ์ด ์š”๊ตฌํ•˜๋Š” React 17 ๊ณผ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ React 18 ์ด ์ถฉ๋Œํ•œ๋‹ค
c) package.json ํŒŒ์ผ์ด ์†์ƒ๋˜์—ˆ๋‹ค
d) npm ๋ฒ„์ „์ด ๋‚ฎ์•„์„œ ์ตœ์‹  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋‹ค

โœ… ์ •๋‹ต: b โ€” ๋ฒ„์ „ ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ๋Œ

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

  • ์›๋ฆฌ ์„ค๋ช…: some-legacy-ui@2.0.0 ์˜ peerDependencies ์— "react": "^17.0.0" ์ด ์„ ์–ธ๋˜์–ด ์žˆ๋Š”๋ฐ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๊ฐ€ react@18.x ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด npm ์ด ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค. npm v7+ ๋Š” ์ด๋Ÿฐ ์ถฉ๋Œ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: some-legacy-ui ์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ React 18 ์„ ์ง€์›ํ•˜๋Š” ๋Œ€์•ˆ์œผ๋กœ ๊ต์ฒดํ•œ๋‹ค. --legacy-peer-deps ๋Š” ์ถฉ๋Œ์„ ์ˆจ๊ธธ ๋ฟ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "ERESOLVE = ์˜์กด์„ฑ ๋ฒ„์ „ ๊ณ„์•ฝ์ด ์„œ๋กœ ๋งž์ง€ ์•Š๋Š” ์ถฉ๋Œ."

Q3. ๐Ÿฃ ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„ โ€” ์‹œ๋‹ˆ์–ด ๋ฉด์ ‘ ๋„์ „

์˜์ฒ ์ด๊ฐ€ ์‹œ๋‹ˆ์–ด ํฌ์ง€์…˜ ๋ฉด์ ‘์„ ๋ณด๋Ÿฌ ๊ฐ”๋‹ค. ๋ฉด์ ‘๊ด€์ด ๋ฌผ์—ˆ๋‹ค. "๊ฐœ๋ฐœ์ž๊ฐ€ npm install some-package ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๊ทธ ํŒจํ‚ค์ง€์˜ ์ฝ”๋“œ๊ฐ€ node_modules ์— ๋“ค์–ด๊ฐ€๊ธฐ๊นŒ์ง€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์น˜๋‚˜์š”? ์ตœ๋Œ€ํ•œ ์ƒ์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."

์˜์ฒ ์ด์˜ ๋‹ต๋ณ€:

"๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ํŒŒ์ผ์„ ๋ฐ›์•„์„œ node_modules ์— ๋„ฃ์–ด์š”."

๋ฉด์ ‘๊ด€ (์˜ํ˜ธ ์Šคํƒ€์ผ)์ด ์ถ”๊ฐ€ ์งˆ๋ฌธํ–ˆ๋‹ค. "๊ทธ ์‚ฌ์ด์— ์บ์‹œ, ๋ฒ„์ „ ๊ฒฐ์ •, ์˜์กด์„ฑ ํŠธ๋ฆฌ ๊ณ„์‚ฐ ๊ฐ™์€ ๊ณผ์ •์ด ์žˆ์ง€ ์•Š๋‚˜์š”?"

์˜ฌ๋ฐ”๋ฅธ ์™„์ „ํ•œ ๋‹ต๋ณ€์€ ๋ฌด์—‡์ธ๊ฐ€?

โœ… ์ •๋‹ต: 6๋‹จ๊ณ„ ๊ณผ์ • โ€” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ โ†’ ๋ฒ„์ „ ๊ฒฐ์ • โ†’ ์˜์กด์„ฑ ํŠธ๋ฆฌ โ†’ tarball ๋‹ค์šด(์บ์‹œ ํ™•์ธ) โ†’ ์••์ถ• ํ•ด์ œ โ†’ lock ํŒŒ์ผ ๊ฐฑ์‹ 

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

  • 1๋‹จ๊ณ„ (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ): CLI ๊ฐ€ https://registry.npmjs.org/<ํŒจํ‚ค์ง€๋ช…> ์— GET ์š”์ฒญ์„ ๋ณด๋‚ด ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ๋ฒ„์ „ ๋ชฉ๋ก๊ณผ ๊ฐ ๋ฒ„์ „์˜ ์˜์กด์„ฑ ์ •๋ณด๋ฅผ ๋ฐ›๋Š”๋‹ค.
  • 2๋‹จ๊ณ„ (๋ฒ„์ „ ๊ฒฐ์ •): package.json ์— ๋ช…์‹œ๋œ ๋ฒ„์ „ ๋ฒ”์œ„(์˜ˆ: ^4.7.0) ์— ๋งž๋Š” ๊ฐ€์žฅ ๋†’์€ ๋ฒ„์ „์„ ์„ ํƒํ•œ๋‹ค.
  • 3๋‹จ๊ณ„ (์˜์กด์„ฑ ํŠธ๋ฆฌ ๊ณ„์‚ฐ): ์„ค์น˜ํ•  ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ํŒจํ‚ค์ง€๋“ค์„ ์žฌ๊ท€์ ์œผ๋กœ ํŒŒ์•…ํ•˜์—ฌ ์ „์ฒด ์„ค์น˜ ๋ชฉ๋ก์„ ๊ณ„์‚ฐํ•œ๋‹ค.
  • 4๋‹จ๊ณ„ (tarball ๋‹ค์šด๋กœ๋“œ): ~/.npm ์บ์‹œ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ณ , ์—†์œผ๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ .tgz ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.
  • 5๋‹จ๊ณ„ (์••์ถ• ํ•ด์ œ): tarball ์„ node_modules/ ์— ์••์ถ• ํ•ด์ œํ•œ๋‹ค.
  • 6๋‹จ๊ณ„ (lock ํŒŒ์ผ ๊ฐฑ์‹ ): package-lock.json ์— ์„ค์น˜๋œ ์ •ํ™•ํ•œ ๋ฒ„์ „๊ณผ tarball ์˜ ๋ฌด๊ฒฐ์„ฑ ํ•ด์‹œ(sha512)๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” ์„œ๋ฒ„๊ณ , CLI ๋Š” ๊ทธ ์„œ๋ฒ„์—์„œ ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๋Š” ์ •๊ตํ•œ ํด๋ผ์ด์–ธํŠธ๋‹ค. ๋‹จ์ˆœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒ„์ „ ๊ณ„์‚ฐ + ์บ์‹œ + ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ์ด ๋ชจ๋‘ ํฌํ•จ๋œ๋‹ค."

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

ํ‡ด๊ทผํ•˜๋ฉด์„œ ์—์–ดํŒŸ ๊ฝ‚๊ณ  ๊ฑท๋Š” ์ค‘์ธ๋ฐ, ์˜ค๋Š˜ ํ•˜๋ฃจ๊ฐ€ ๊ฝค ๊ฝ‰ ์ฐฌ ๋А๋‚Œ์ด๋‹ค.

์†”์งํžˆ ๋งํ•˜๋ฉด ์˜ค๋Š˜ ์•„์นจ๊นŒ์ง€๋งŒ ํ•ด๋„ npm ์€ ๊ทธ๋ƒฅ "์„ค์น˜ ๋ฒ„ํŠผ" ์ด์—ˆ๋‹ค. --legacy-peer-deps ๋ถ™์˜€์„ ๋•Œ ์™œ ๋ฒ„๊ทธ๊ฐ€ ๋‚ฌ๋Š”์ง€๋„ ๋ชฐ๋ž๊ณ . ๊ทผ๋ฐ ์ง€๊ธˆ์€ ์•ˆ๋‹ค. ๋‘ ๊ฐœ์˜ React ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ๊ฒจ์„œ Context ๊ฐ€ ๋Š๊ฒผ๋˜ ๊ฑฐ์˜€๋‹ค. npm ์ด ๋‚ด๋ถ€์—์„œ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ฒ„์ „์„ ์กฐ์œจํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ๋ชฐ๋ž์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์›์ธ์„ ๋ชป ์ฐพ์„ ์ˆ˜๋ฐ–์—.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "--legacy-peer-deps ๋Š” ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ˆˆ์„ ๊ฐ€๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ์ง„์งœ ํ•ด๊ฒฐ์€ ์ถฉ๋Œ์˜ ์›์ธ์„ ์•„๋Š” ๊ฒƒ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค."

๊ทธ๋ฆฌ๊ณ  @youngsoo/ui ๊ฐ€ ์Šค์ฝ”ํ”„ ํŒจํ‚ค์ง€๋ผ๋Š” ๊ฒƒ๋„ ์ด์ œ ์ œ๋Œ€๋กœ ์•Œ์•˜๋‹ค. ํŒ€ ๋‚ด๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฑฐ์˜€๊ตฌ๋‚˜. ์ƒ๊ฐ๋ณด๋‹ค npm ์ƒํƒœ๊ณ„๊ฐ€ ํ›จ์”ฌ ๋„“์—ˆ๋‹ค.

์ง‘์— ๊ฐ€์„œ ๋ญ ๋จน์„๊นŒ. ์˜ค๋Š˜์€ ํŽธ์˜์  ๋„์‹œ๋ฝ ์ •๋„๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด์ผ์€ package.json ํ•„๋“œ๋“ค์„ ์ œ๋Œ€๋กœ ํŒŒ๋ด์•ผ์ง€. ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด ๋‹ค์Œ์—๋Š” package.json ์„ ํ•ด๋ถ€ํ•œ๋‹ค๊ณ  ํ•˜์…จ์œผ๋‹ˆ๊นŒ.


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