๐ŸŒฟ ์˜์กด์„ฑ 4์ข… ์„ธํŠธ โ€” dependencies, devDependencies, peerDependencies, overrides

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

๐Ÿ“‹ ๊ฐœ์š”

์˜์กด์„ฑ 4์ข…๋ฅ˜๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•œ๋‹ค. Next.js ๋งฅ๋ฝ์—์„œ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ์–ด๋”” ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”์ง€, peerDependencies ๊ฐ€ ์™œ ์กด์žฌํ•˜๋Š”์ง€, overrides ๋กœ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฒ•๊นŒ์ง€ ๋‹ค๋ฃฌ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


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

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 20๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 10๋ถ„ (peerDependencies + Next.js ๋ถ„๋ฅ˜)

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
๋Ÿฐํƒ€์ž„ ํ•„์ˆ˜(dependencies) โ†’ ๊ฐœ๋ฐœ ๋„๊ตฌ(devDependencies) โ†’ peerDependencies ์›๋ฆฌ โ†’ overrides ์ถฉ๋Œ ํ•ด๊ฒฐ โ†’ Next.js ์‹ค์ „ ๋ถ„๋ฅ˜

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

  • dependencies ์™€ devDependencies ๋ฅผ ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • peerDependencies ๊ฐ€ ์™œ ์กด์žฌํ•˜๋Š”์ง€, React ์ธ์Šคํ„ด์Šค ์ค‘๋ณต ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • overrides ๋กœ ๊ฐ„์ ‘ ์˜์กด์„ฑ์˜ ๋ฒ„์ „์„ ๊ฐ•์ œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Next.js ํ”„๋กœ์ ํŠธ์—์„œ tailwindcss, prisma, @prisma/client ์˜ ์œ„์น˜๋ฅผ ์ฆ‰์‹œ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค

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

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "๋ฆฌ๋“œ ๋‹˜, ์ œ๊ฐ€ @youngsoo/ui ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๋ฉด์„œ react ๋ฅผ dependencies ์— ๋„ฃ์—ˆ๋Š”๋ฐ, ๋ฉ”์ธ ์•ฑ์—์„œ ํ›… ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์–ด์š”. Invalid hook call ์ด์š”. ๊ทธ๋ฆฌ๊ณ  prisma ๋ž‘ @prisma/client ์ค‘์— ๋ญ๊ฐ€ devDependencies ์ธ์ง€๋„ ํ—ท๊ฐˆ๋ ค์š”. ๋นŒ๋“œํ•  ๋•Œ ์“ฐ์ด๋Š” ๊ฑด ์ „๋ถ€ devDependencies ์•„๋‹Œ๊ฐ€์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, Invalid hook call ์€ React ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‘ ๊ฐœ ์ƒ๊ฒผ์„ ๋•Œ ๋‚˜๋Š” ์—๋Ÿฌ์˜ˆ์š”. @youngsoo/ui ๊ฐ€ ์ž๊ธฐ node_modules ์— React ๋ฅผ ๋”ฐ๋กœ ๋“ค๊ณ ์™”๊ฑฐ๋“ ์š”. peerDependencies ๋ฅผ ์ดํ•ดํ•˜๋ฉด ์™œ ๊ทธ๊ฒŒ ๋ฌธ์ œ์ธ์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  devDependencies ํŒ๋‹จ ๊ธฐ์ค€์€ '๋นŒ๋“œํ•  ๋•Œ ์“ฐ์ด๋А๋ƒ' ๊ฐ€ ์•„๋‹ˆ๋ผ 'ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์— ์ด ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜๋ƒ' ์˜ˆ์š”."

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

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒ€์€ Next.js ์•ฑ๊ณผ ๋‚ด๋ถ€ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ @youngsoo/ui ๋ฅผ ํ•จ๊ป˜ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค. ์–ด๋А ๋‚  ์˜์ฒ ์ด๊ฐ€ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ useState ๋ฅผ ์“ฐ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๋ฉ”์ธ ์•ฑ์—์„œ ๊ฐ€์ ธ๋‹ค ์“ฐ์ž๋งˆ์ž ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค:

Uncaught Error: Invalid hook call.
Hooks can only be called inside of the body of a function component.

์ง„๋‹จํ•ด๋ณด๋‹ˆ @youngsoo/ui/node_modules/react ์™€ ๋ฉ”์ธ ์•ฑ์˜ node_modules/react ๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋‘ ๊ฐœ์˜ React ์ธ์Šคํ„ด์Šค ๊ฐ€ ์ƒ๊ธด ๊ฒƒ์ด๋‹ค.

์›์ธ์€ ์˜์ฒ ์ด๊ฐ€ @youngsoo/ui/package.json ์— react ๋ฅผ dependencies ์— ๋„ฃ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด peerDependencies ์˜ ํ•ต์‹ฌ์ด๋‹ค.


๐Ÿ“ฆ dependencies โ€” ๋Ÿฐํƒ€์ž„ ํ•„์ˆ˜ ์ฝ”๋“œ

{
  "dependencies": {
    // ๐Ÿ’ก ์งˆ๋ฌธ 1๊ฐœ๋งŒ ๋˜์ ธ๋ณด์„ธ์š”: "๋‚ด ์„œ๋น„์Šค๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๋™์•ˆ ์ด ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?"
    // ์„œ๋ฒ„๊ฐ€ ๋Œ ๋•Œ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด next, react ๊ฐ€ ๊ผญ ํ•„์š”ํ•˜์ฃ !
    "next": "^14.1.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "jotai": "^2.6.4",
    // DB๋ฅผ ์ฐŒ๋ฅด๋ ค๋ฉด @prisma/client ๋„ ๋Ÿฐํƒ€์ž„์— ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    "@prisma/client": "^5.9.1"
  }
}

ํŒ๋‹จ ๊ธฐ์ค€ โ€” ๋”ฑ ํ•˜๋‚˜๋งŒ ๊ธฐ์–ตํ•ด๋ผ:

"ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์— ์ด ํŒจํ‚ค์ง€์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”๊ฐ€?"

YES โ†’ dependencies / NO โ†’ devDependencies

์„ค์น˜ ๋™์ž‘:

npm install                     # dependencies + devDependencies ๋ชจ๋‘ ์„ค์น˜
npm install --production        # dependencies ๋งŒ ์„ค์น˜
NODE_ENV=production npm install # dependencies ๋งŒ ์„ค์น˜

๐Ÿ”ง devDependencies โ€” ๊ฐœ๋ฐœ ๋„๊ตฌ, ๋นŒ๋“œ ํƒ€์ž„์—๋งŒ ํ•„์š”ํ•œ ๊ฒƒ

{
  "devDependencies": {
    // ๐Ÿฆ "์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌ๋  ๋•Œ๋Š” ์•ˆ ๋ณผ ๋…€์„๋“ค" ์ž…๋‹ˆ๋‹ค.
    // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ์ฝ”๋“œ ์งค ๋•Œ๋งŒ ์“ฐ๋Š” ๋„๊ตฌ (๋‚˜์ค‘์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€์‹ ํ•˜๋‹ˆ๊นŒ์š”!)
    "typescript": "^5.3.3",
    "@types/react": "^18.2.48",
    // ๋ฆฐํŠธ, ํฌ๋งคํ„ฐ๋„ ๋ฐฐํฌ์„œ๋ฒ„์—๋Š” ์˜ฌ๋ผ๊ฐˆ ์ด์œ ๊ฐ€ ์—†์ฃ .
    "eslint": "^8.56.0",
    "prettier": "^3.2.4",
    // tailwind ๋„ ๋นŒ๋“œํ•  ๋•Œ CSS ํŒŒ์ผ์„ ์ซ™ ๋ฝ‘์•„๋‚ด๊ณ  ๋‚˜๋ฉด ์—ญํ•  ๋!
    "tailwindcss": "^3.4.1",
    "prisma": "^5.9.1"
  }
}

ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ์ผ€์ด์Šค โ€” ์™œ ์ด๊ฒƒ๋“ค์ด devDependencies ์ธ๊ฐ€?

ํŒจํ‚ค์ง€ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ด์œ devDependencies ์ธ ์ด์œ 
tailwindcss๋นŒ๋“œ์— ํ•„์ˆ˜!๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ CSS ํŒŒ์ผ. ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ์—” ์ด๋ฏธ ์™„์„ฑ๋œ CSS ๋งŒ ์žˆ์œผ๋ฉด ๋จ
typescript์ฝ”๋“œ ์ž‘์„ฑ์— ํ•„์ˆ˜!๋นŒ๋“œ ํ›„ JS ๋กœ ๋ณ€ํ™˜๋จ. ์„œ๋ฒ„๋Š” JS ์‹คํ–‰, TS ํ•„์š” ์—†์Œ
@types/*์ฝ”๋“œ ์ž‘์„ฑ์— ํ•„์ˆ˜!ํƒ€์ž… ์ •๋ณด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋งŒ ์‚ฌ์šฉ. ๋Ÿฐํƒ€์ž„์— ์—†์Œ
prisma (CLI)DB ์—†์ด ๋ชป ๋งŒ๋“ค์ž–์•„!๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/์Šคํ‚ค๋งˆ CLI ๋„๊ตฌ. ๋Ÿฐํƒ€์ž„์—” @prisma/client ๋งŒ ํ•„์š”
jestํ…Œ์ŠคํŠธ ์—†์ธ ๋ชป ๋ฐฐํฌ!ํ…Œ์ŠคํŠธ๋Š” ๋ฐฐํฌ ์ „์—๋งŒ ์‹คํ–‰. ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—๋Š” ๋ถˆํ•„์š”

๐Ÿฃ ์˜์ฒ : "tailwindcss ๊ฐ€ devDependencies ์ธ ๊ฒŒ ์•„์ง๋„ ์ข€ ์ด์ƒํ•œ๋ฐ์š”?"

๐Ÿฆ ์˜ํ˜ธ: "Next.js ๋นŒ๋“œ ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค๋ณผ๊ฒŒ์š”:

๊ฐœ๋ฐœ ์‹œ
 ์†Œ์Šค ์ฝ”๋“œ (.tsx)
   + Tailwind ํด๋ž˜์Šค ์Šค์บ” (tailwindcss ์‚ฌ์šฉ)
   + PostCSS ์ฒ˜๋ฆฌ (postcss, autoprefixer ์‚ฌ์šฉ)
   โ†“ ๋นŒ๋“œ
.next/static/css/xxx.css (์™„์„ฑ๋œ CSS ํŒŒ์ผ)

ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„
 .next/ ํด๋”๋งŒ ์‹คํ–‰
   โ†’ tailwindcss? ํ•„์š” ์—†์Œ. CSS ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง.

๋นŒ๋“œ ๋„๊ตฌ๋Š” ๋นŒ๋“œํ•  ๋•Œ๋งŒ ํ•„์š”ํ•ด์š”. ์™„์„ฑ๋œ ๊ฑด๋ฌผ ์ง“๊ณ  ๋‚˜๋ฉด ๊ณต์‚ฌ ๋„๊ตฌ ์น˜์›Œ๋„ ๋ผ์š”."


๐Ÿค peerDependencies โ€” "๋‚˜๋Š” ๋„ค ๊ฒƒ์„ ๊ณต์œ ํ• ๊ฒŒ"

peerDependencies ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

node_modules/
  react/                          โ† ๋‚ด ์•ฑ์˜ React 18.2.0
  @youngsoo/ui/
    node_modules/
      react/                      โ† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋“ค๊ณ ์˜จ ๋˜ ๋‹ค๋ฅธ React 18.2.0

๋ฒ„์ „์ด ๊ฐ™์•„๋„ ๋ฌธ์ œ๋‹ค. node_modules ๋‚ด ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ์žˆ์œผ๋ฉด Node.js ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. React ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹จ์ผ ์ „์—ญ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์กดํ•˜๋ฉด:

  • useState, useEffect ๋“ฑ ํ›…์ด "์–ด๋–ค React ์— ๋“ฑ๋กํ•ด์•ผ ํ•˜์ง€?" ํ˜ผ๋™ โ†’ Invalid hook call
  • Context.Provider ์˜ ๊ฐ’์ด ๋‹ค๋ฅธ React ์ธ์Šคํ„ด์Šค์˜ useContext ๋กœ ์ฝํžˆ์ง€ ์•Š์Œ โ†’ undefined

peerDependencies ์˜ ํ•ด๊ฒฐ์ฑ…

// @youngsoo/ui/package.json
{
  // ๐Ÿ’ก "๋‚ด๊ฐ€ ์ง์ ‘ ์„ค์น˜ ์•ˆ ํ• ํ…Œ๋‹ˆ, ๋‚  ์“ฐ๋Š” ์•ฑ์•„! ๋„ค๊ฐ€ ์„ค์น˜ํ•œ ๋ฆฌ์•กํŠธ ์ข€ ๋นŒ๋ ค์ค˜!"
  // ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ์Œ๋‘ฅ์ด ๋ฆฌ์•กํŠธ๊ฐ€ ์ƒ๊ฒจ์„œ ํ›… ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฑธ ๋ง‰์„ ์ˆ˜ ์žˆ์–ด์š”.
  "peerDependencies": {
    "react": "^18.0.0",
    "react-dom": "^18.0.0"
  },
  // ๐Ÿฆ "ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€๊ธˆ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ˆ๊นŒ..."
  // ๊ฐœ๋ฐœ์šฉ์œผ๋กœ๋งŒ ์ž„์‹œ๋กœ ์„ค์น˜ํ•ด๋‘ก๋‹ˆ๋‹ค.
  "devDependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  }
}

์˜๋ฏธ: "๋‚˜(@youngsoo/ui)๋Š” React ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ง์ ‘ ์„ค์น˜ํ•˜์ง€ ์•Š์„๊ฒŒ. ๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์ด React ๋ฅผ ์ œ๊ณตํ•ด์ค˜. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณต์œ ํ•ด์„œ ์“ธ๊ฒŒ."

๊ฒฐ๊ณผ:

node_modules/
  react/                    โ† ์•ฑ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ React 18.2.0
  @youngsoo/ui/             โ† ์ž์ฒด node_modules/react ์—†์Œ

devDependencies ์—๋„ ๋„ฃ๋Š” ์ด์œ : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” React ๊ฐ€ ์‹ค์ œ๋กœ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

npm v7+ ์—์„œ peerDependencies ์ž๋™ ์„ค์น˜

# npm v7+ ๋Š” peerDependencies ๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•จ
# (npm v6 ์ดํ•˜์—์„œ๋Š” ๊ฒฝ๊ณ ๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์ž๋™ ์„ค์น˜ ์•ˆ ํ•จ)
 
npm install @youngsoo/ui
# โ†’ @youngsoo/ui ์„ค์น˜ + peerDependencies ์ธ react, react-dom ๋„ ํ•จ๊ป˜ ์„ค์น˜

peerDependenciesMeta โ€” ์„ ํƒ์  peer

{
  "peerDependencies": {
    "react": "^18.0.0",
    "next": ">=13.0.0"
  },
  "peerDependenciesMeta": {
    "next": {
      "optional": true
    }
  }
}

next ๋Š” ์žˆ์œผ๋ฉด Next.js ์ „์šฉ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜์ง€๋งŒ, ์—†์–ด๋„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋™์ž‘ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.


๐ŸŽฒ optionalDependencies โ€” ์žˆ์œผ๋ฉด ์ข‹๊ณ , ์—†์–ด๋„ ๊ดœ์ฐฎ์•„

{
  "optionalDependencies": {
    "fsevents": "^2.3.3"
  }
}

์„ค์น˜์— ์‹คํŒจํ•ด๋„ ์ „์ฒด npm install ์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ฃผ์š” ์‚ฌ์šฉ ์ผ€์ด์Šค:

  • fsevents โ€” macOS ์ „์šฉ ํŒŒ์ผ ๊ฐ์‹œ ๋ชจ๋“ˆ (Linux/Windows ์—์„œ๋Š” ์„ค์น˜ ์‹คํŒจํ•ด๋„ ๋ฌด๋ฐฉ)
  • ํŠน์ • OS ์ „์šฉ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ
  • ์žˆ์œผ๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ ์—†์–ด๋„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ๋™์ž‘ํ•˜๋Š” ํŒจํ‚ค์ง€

์ฝ”๋“œ์—์„œ๋Š” ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค:

let fsevents
try {
  fsevents = require('fsevents')
} catch (e) {
  // fsevents ๊ฐ€ ์—†์„ ๋•Œ fallback
  fsevents = null
}

๐Ÿ”ง overrides โ€” ๋ฒ„์ „ ์ถฉ๋Œ์˜ ์™ธ๊ณผ์  ํ•ด๊ฒฐ

overrides ๋Š” npm 8.3+ ์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์ง์ ‘ ์˜์กด์„ฑ๋ฟ ์•„๋‹ˆ๋ผ ๊ฐ„์ ‘ ์˜์กด์„ฑ์˜ ๋ฒ„์ „๊นŒ์ง€ ๊ฐ•์ œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ ์ผ€์ด์Šค 1 โ€” ๊ฐ„์ ‘ ์˜์กด์„ฑ์˜ ๋ณด์•ˆ ์ทจ์•ฝ์  ์ˆ˜์ •

๋‚ด ์•ฑ
  โ””โ”€ some-library@2.0.0
       โ””โ”€ vulnerable-pkg@1.0.0  โ† ์ทจ์•ฝ์  ๋ฐœ๊ฒฌ! 1.2.0 ์—์„œ ํŒจ์น˜๋จ

some-library ๊ฐ€ ์•„์ง ์—…๋ฐ์ดํŠธ๋ฅผ ์•ˆ ํ–ˆ์„ ๋•Œ:

{
  "overrides": {
    "vulnerable-pkg": "^1.2.0"
  }
}

์‚ฌ์šฉ ์ผ€์ด์Šค 2 โ€” ํŠน์ • ํŒจํ‚ค์ง€ ์•ˆ์˜ ์˜์กด์„ฑ๋งŒ ์ˆ˜์ •

{
  "overrides": {
    "some-library": {
      "vulnerable-pkg": "^1.2.0"
    }
  }
}

some-library ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” vulnerable-pkg ๋งŒ ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๊ณ , ๋‹ค๋ฅธ ๊ณณ์—์„œ ์“ฐ๋Š” ๊ฑด ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์šฉ ์ผ€์ด์Šค 3 โ€” ๋ฒ„์ „ ํ†ต์ผ (์ค‘๋ณต ํŒจํ‚ค์ง€ ์ œ๊ฑฐ)

{
  "dependencies": {
    "next": "^14.1.0",
    "some-old-lib": "^3.0.0"
  },
  "overrides": {
    "some-old-lib": {
      "react": "$react"
    }
  }
}

$react ๋Š” dependencies.react ์˜ ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜๋Š” ํ‘œํ˜„์‹. some-old-lib ๊ฐ€ ๋“ค๊ณ ์˜ค๋Š” React ๋ฅผ ๋ฉ”์ธ ์•ฑ์˜ React ์™€ ๋™์ผํ•˜๊ฒŒ ๊ฐ•์ œํ•œ๋‹ค.

๐Ÿฆ ์˜ํ˜ธ์˜ ์กฐ์–ธ: "overrides ๋Š” '์™ธ๊ณผ์  ์ˆ˜์ˆ ' ์ด์—์š”. ํ•ญ์ƒ ๊ฐ€์žฅ ์ข์€ ๋ฒ”์œ„๋กœ ์ ์šฉํ•˜๊ณ , ์™œ ์ด override ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ์•ผ ํ•ด์š”."

{
  "overrides": {
    // react-beautiful-dnd ๊ฐ€ 14.3.0 ์—์„œ Breaking Change ๋„ฃ์Œ (SemVer ์œ„๋ฐ˜)
    // 14.2.0 ์ด ๋งˆ์ง€๋ง‰ ์•ˆ์ • ๋ฒ„์ „
    "react-beautiful-dnd": "14.2.0"
  }
}

๐Ÿš€ Next.js ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ๋ถ„๋ฅ˜ ์‹ค์ „

์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์™„์„ฑํ˜• ์˜์กด์„ฑ ๋ถ„๋ฅ˜:

{
  "dependencies": {
    "next": "^14.1.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
 
    "@prisma/client": "^5.9.1",
    "next-auth": "^4.24.5",
 
    "jotai": "^2.6.4",
    "@tanstack/react-query": "^5.18.0",
    "@tanstack/react-query-devtools": "^5.18.0",
 
    "zod": "^3.22.4",
    "socket.io-client": "^4.7.2",
 
    "@youngsoo/ui": "workspace:*"
  },
 
  "devDependencies": {
    "typescript": "^5.3.3",
    "@types/react": "^18.2.48",
    "@types/react-dom": "^18.2.18",
    "@types/node": "^20.11.5",
 
    "eslint": "^8.56.0",
    "eslint-config-next": "^14.1.0",
    "prettier": "^3.2.4",
 
    "tailwindcss": "^3.4.1",
    "autoprefixer": "^10.4.17",
    "postcss": "^8.4.33",
 
    "prisma": "^5.9.1",
 
    "jest": "^29.7.0",
    "@testing-library/react": "^14.1.2",
    "@testing-library/jest-dom": "^6.4.1",
    "jest-environment-jsdom": "^29.7.0",
 
    "husky": "^9.0.10",
    "lint-staged": "^15.2.2",
    "@next/bundle-analyzer": "^14.1.0",
    "cross-env": "^7.0.3"
  }
}

๋ถ„๋ฅ˜ ๊ทผ๊ฑฐ ์ƒ์„ธ ํ•ด์„ค

ํŒจํ‚ค์ง€์œ„์น˜์ด์œ 
@prisma/clientdependenciesNext.js ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ / Route Handler ์—์„œ DB ์ฟผ๋ฆฌ ์‹คํ–‰
prisma (CLI)devDependencies๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์Šคํ‚ค๋งˆ ์ƒ์„ฑ CLI ๋„๊ตฌ. ๋Ÿฐํƒ€์ž„ ๋ถˆํ•„์š”
next-authdependencies๋ฏธ๋“ค์›จ์–ด + ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ๊ฒ€์ฆ. ๋Ÿฐํƒ€์ž„ ํ•„์š”
jotaidependenciesํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰
@tanstack/react-query-devtoolsdependenciesNext.js ์„œ๋ฒ„ ๋ฒˆ๋“ค์—์„œ process.env.NODE_ENV ์ฒดํฌ ํ›„ ๋ Œ๋” ์—ฌ๋ถ€ ๊ฒฐ์ •ํ•˜๋ฏ€๋กœ dependencies
zoddependenciesRoute Handler ์—์„œ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
socket.io-clientdependencies๋ธŒ๋ผ์šฐ์ €์—์„œ WebSocket ์—ฐ๊ฒฐ
tailwindcssdevDependencies๋นŒ๋“œ ํƒ€์ž„ CSS ์ƒ์„ฑ ๋„๊ตฌ
@types/*devDependenciesํƒ€์ž… ์ •๋ณด๋Š” ๋Ÿฐํƒ€์ž„์— ์—†์Œ

๐Ÿ’ก @tanstack/react-query-devtools ์ฃผ์˜: ์ด ํŒจํ‚ค์ง€๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ process.env.NODE_ENV !== 'production' ์ผ ๋•Œ๋งŒ ์‹ค์ œ devtools UI ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ devDependencies ์— ๋„ฃ์–ด๋„ ๋˜์ง€๋งŒ, ์ผ๋ถ€ ๋ฒˆ๋“ค๋Ÿฌ ์„ค์ •์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€ import ๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด dependencies ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.


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

์ข…๋ฅ˜ํŒ๋‹จ ๊ธฐ์ค€๋Œ€ํ‘œ ์˜ˆ์‹œ
dependenciesํ”„๋กœ๋•์…˜ ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ ์ฝ”๋“œreact, next, @prisma/client
devDependencies๊ฐœ๋ฐœ/๋นŒ๋“œ ํƒ€์ž„์—๋งŒ ํ•„์š”typescript, tailwindcss, prisma CLI
peerDependenciesํ˜ธ์ŠคํŠธ ์•ฑ์ด ์„ค์น˜ํ•ด์•ผ ํ•  ๊ฒƒ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…์žฅ)react, react-dom (๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘ ์‹œ)
optionalDependencies์—†์–ด๋„ ๋™์ž‘์€ ๋จfsevents
overrides๊ฐ„์ ‘ ์˜์กด์„ฑ ๋ฒ„์ „ ๊ฐ•์ œ์ทจ์•ฝ์  ํŒจ์น˜, Breaking Change ๊ณ ์ •

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

Q1. prisma ์™€ @prisma/client ์˜ ์˜ฌ๋ฐ”๋ฅธ ์˜์กด์„ฑ ์œ„์น˜๋Š”?

a) ๋‘˜ ๋‹ค dependencies
b) ๋‘˜ ๋‹ค devDependencies
c) prisma ๋Š” devDependencies, @prisma/client ๋Š” dependencies
d) prisma ๋Š” dependencies, @prisma/client ๋Š” devDependencies

โœ… ์ •๋‹ต: c

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

  • @prisma/client โ†’ dependencies: Next.js ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋‚˜ Route Handler ์—์„œ ์‹คํ–‰ ์ค‘์— DB ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค. prisma.$connect(), prisma.user.findMany() ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋œ๋‹ค. ๋Ÿฐํƒ€์ž„ ํ•„์ˆ˜.
  • prisma (CLI) โ†’ devDependencies: npx prisma migrate dev, npx prisma generate ๊ฐ™์€ ๋ช…๋ น์–ด๋Š” ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ์‹คํ–‰๋œ๋‹ค. ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ prisma CLI ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ์ผ์€ ์—†๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "@prisma/client = ์„œ๋ฒ„๊ฐ€ DB ์— ์ ‘์†ํ•  ๋•Œ ์“ฐ๋Š” ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ. prisma = ์Šคํ‚ค๋งˆ ๊ด€๋ฆฌ CLI ๋„๊ตฌ."

Q2. ์•„๋ž˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ์›์ธ์€?

Uncaught Error: Invalid hook call.
Hooks can only be called inside of the body of a function component.

a) React ๋ฒ„์ „์ด ๋„ˆ๋ฌด ๋‚ฎ์•„์„œ ํ›…์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค
b) ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ useState ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค
c) ๋‘ ๊ฐœ์˜ React ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์กดํ•ด์„œ, ํ›…์ด ์–ด๋А ์ธ์Šคํ„ด์Šค์— ๋“ฑ๋กํ•ด์•ผ ํ• ์ง€ ํ˜ผ๋ž€์ด ์ƒ๊ฒผ๋‹ค
d) useEffect ๋ฅผ ์ž˜๋ชป๋œ ์œ„์น˜์—์„œ ํ˜ธ์ถœํ–ˆ๋‹ค

โœ… ์ •๋‹ต: c โ€” ๋‘ ๊ฐœ์˜ React ์ธ์Šคํ„ด์Šค ๋ฌธ์ œ

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

  • ์›๋ฆฌ ์„ค๋ช…: React ํ›…์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹จ์ผ ์ „์—ญ React ์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ ์ €์žฅ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ด๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ dependencies ์— react ๋ฅผ ๋„ฃ์œผ๋ฉด node_modules/library/node_modules/react ๋ผ๋Š” ๋ณ„๋„ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด ์ธ์Šคํ„ด์Šค๋Š” ์•ฑ์˜ node_modules/react ์™€ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ€๋กœ, ํ›…์ด "์–ด๋””์— ๋“ฑ๋กํ•ด์•ผ ํ•˜์ง€?" ํ˜ผ๋ž€์„ ๊ฒช๋Š”๋‹ค.
  • ํ•ด๊ฒฐ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ react ๋ฅผ peerDependencies ๋กœ ์ด๋™ํ•˜๋ฉด ํ˜ธ์ŠคํŠธ ์•ฑ์˜ React ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•ด ์ด ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "Invalid hook call = React ์ธ์Šคํ„ด์Šค ๋‘ ๊ฐœ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” peerDependencies ๋กœ ํ•ด๊ฒฐ."

Q3. ๐Ÿฃ ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„ โ€” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

์˜์ˆ˜๋„ค ํŒ€์ด @youngsoo/ui ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ package.json ์„ ์„ค๊ณ„ํ•˜๋Š” ํšŒ์˜๊ฐ€ ์—ด๋ ธ๋‹ค. ๊ฐ ํŒ€์›์ด ์˜๊ฒฌ์„ ๋ƒˆ๋‹ค.

  • ๐Ÿฃ ์˜์ฒ : "react ๋ฅผ dependencies ์— ๋„ฃ์„๊ฒŒ์š”. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ React ๊ฐ€ ํ•„์š”ํ•˜์ž–์•„์š”."
  • ๐Ÿ‘” ์˜์ˆ˜ (PM): "์ €๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, ๋‘ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์ด ๋ญ”์ง€ ์„ค๋ช…ํ•ด์ค˜์š”."
  • ๐Ÿฆ ์˜ํ˜ธ: "?"

์˜ํ˜ธ ๋ฆฌ๋“œ์˜ ์ž…์žฅ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๋ก ๊ณผ ๊ทผ๊ฑฐ๋ฅผ ์„ค๋ช…ํ•˜๋ผ.

โœ… ์ •๋‹ต: react ๋Š” peerDependencies ์™€ devDependencies ์— ๋™์‹œ์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค

{
  "name": "@youngsoo/ui",
  "peerDependencies": {
    "react": "^18.0.0",
    "react-dom": "^18.0.0"
  },
  "devDependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  }
}

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

  • dependencies ์— ๋„ฃ์œผ๋ฉด: ํ˜ธ์ŠคํŠธ ์•ฑ(youngsoo-community)์— ์ด๋ฏธ react@18 ์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด๋„, @youngsoo/ui ๊ฐ€ ์ž์‹ ์˜ node_modules ์— ๋˜ ๋‹ค๋ฅธ React ๋ฅผ ์„ค์น˜ํ•œ๋‹ค. โ†’ ๋‘ ์ธ์Šคํ„ด์Šค โ†’ Invalid hook call + Context ๋‹จ์ ˆ.
  • peerDependencies ์— ๋„ฃ์œผ๋ฉด: "๋‚˜๋Š” React ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ํ˜ธ์ŠคํŠธ ์•ฑ์˜ ๊ฒƒ์„ ์“ธ๊ฒŒ" ๋ผ๋Š” ์„ ์–ธ. npm ์ด ๋‹จ์ผ node_modules/react ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค.
  • devDependencies ์—๋„ ๋„ฃ๋Š” ์ด์œ : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธํ•  ๋•Œ(jest, storybook ๋“ฑ) ์‹ค์ œ๋กœ React ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. peerDependencies ๋งŒ ์žˆ์œผ๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ React ๊ฐ€ ์—†์–ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์•ˆ ๋Œ์•„๊ฐ„๋‹ค.
  • ์˜์ˆ˜(PM) ์—๊ฒŒ ํ•œ ๋งˆ๋””: "๊ฐ™์€ React ๋ฅผ ๊ณต์œ ํ•ด์•ผ Context ์™€ ํ›…์ด ์ •์ƒ ์ž‘๋™ํ•ด์š”. ๋น„์šฉ์€ ๊ฑฐ์˜ ์—†๊ณ  ์•ˆ์ •์„ฑ์€ ํฌ๊ฒŒ ์˜ฌ๋ผ๊ฐ€์š”."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋ฉด โ€” ํ˜ธ์ŠคํŠธ ์•ฑ๊ณผ ๊ณต์œ ํ•ด์•ผ ํ•  ๊ฒƒ์€ peerDependencies, ๊ฐœ๋ฐœํ•  ๋•Œ ์ง์ ‘ ์“ธ ๊ฒƒ์€ devDependencies ์—๋„ ํ•จ๊ป˜."

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

์˜ค๋Š˜ ์˜คํ›„ ๋‚ด๋‚ด Invalid hook call ์—๋Ÿฌ์™€ ์”จ๋ฆ„ํ–ˆ๋‹ค. ์ฒ˜์Œ์—” ๋‹จ์ˆœํžˆ ํ›…์„ ์ž˜๋ชป ์“ด ๊ฑด ์ค„ ์•Œ๊ณ  ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋’ค์กŒ๋Š”๋ฐ, ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด "๋‘ React ์ธ์Šคํ„ด์Šค ๋ฌธ์ œ" ๋ผ๊ณ  ๋”ฑ ์ง‘์–ด์ฃผ์…”์„œ ์›์ธ์„ ์ฐพ์•˜๋‹ค.

@youngsoo/ui ์— react ๋ฅผ peerDependencies ๋กœ ์˜ฎ๊ฒผ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ์‚ฌ๋ผ์กŒ๋‹ค. ์™œ ๊ทธ๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š”์ง€๋Š” ์ด์ œ ์™„์ „ํžˆ ์ดํ•ดํ•œ๋‹ค. node_modules ๊ฒฝ๋กœ๊ฐ€ ํ•˜๋‚˜๋กœ ํ†ต์ผ๋˜๋ฉด์„œ React ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ๋‚จ๋Š” ๊ฑฐ๋‹ค.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ peerDependencies ๋ฅผ ๋น ๋œจ๋ฆฌ๋ฉด, ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์—์„œ ์ด์œ  ๋ชจ๋ฅผ ํ›… ์˜ค๋ฅ˜๊ฐ€ ํ„ฐ์ง„๋‹ค. ์˜์กด์„ฑ์˜ ๊ณต์œ  ์—ฌ๋ถ€๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์˜ ์ฑ…์ž„์ด๋‹ค."

ํ‡ด๊ทผํ•˜๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๋‹ค๊ฐ€ ์ด๊ฒƒ์ €๊ฒƒ ๋จธ๋ฆฟ์†์—์„œ ์ •๋ฆฌ๋๋‹ค. dependencies vs devDependencies ํŒ๋‹จ ๊ธฐ์ค€ โ€” "ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์— ํ•„์š”ํ•œ๊ฐ€?" โ€” ์ด๊ฑฐ ํ•˜๋‚˜๋งŒ ๊ธฐ์–ตํ•ด๋„ ์•ž์œผ๋ก  ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด์ผ์€ npm install ์ด ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ lock ํŒŒ์ผ์„ ์“ฐ๋Š”์ง€ ํŒŒ๋ด์•ผ์ง€. ์˜ค๋Š˜์€ ์ผ์ฐ ์ž์•ผ๊ฒ ๋‹ค. ์ข€ ํ”ผ๊ณคํ•˜๋‹ค.


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