๐ฆ npm ๋ฉํ ๋ชจ๋ธ โ ๋ ์ง์คํธ๋ฆฌ, ํจํค์ง, ๋ชจ๋์ ๊ฟฐ๋ซ์ด๋ผ
๐ ๊ฐ์
npm ์ด ๋ฌด์์ธ์ง, ๋ ์ง์คํธ๋ฆฌ๋ ์ด๋ป๊ฒ ์๋ํ๋์ง, ํจํค์ง์ ๋ชจ๋์ ์ฐจ์ด๋ ๋ฌด์์ธ์ง โ ์๋์ด๊ฐ ๊ฐ๋ ๊ทผ๋ณธ์ ์ธ ์ดํด๋ฅผ ์ฌ๋๋ค.
๐ ๋ชฉ์ฐจ
- ๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐ npm ์ ์ธ ๊ฐ์ง ์ผ๊ตด
- ๐ฆ ํจํค์ง vs ๋ชจ๋
- ๐ ์ค์ฝํ ํจํค์ง
- โ๏ธ npm install ์ด ์ค์ ๋ก ํ๋ ์ผ
- ๐พ npm ์บ์
- ๐จ ์์ฃผ ๋ง์ฃผ์น๋ npm ์๋ฌ ํด๊ฒฐ
- ๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
- ๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
- ๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
- ๐ ๋ ์์๋ณด๊ธฐ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 7๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
npm ์ ์ ์ฒด ํ์
โ ๋ ์ง์คํธ๋ฆฌ ๋์ ์๋ฆฌ โ ํจํค์ง vs ๋ชจ๋ ๊ตฌ๋ถ โ install ๋ด๋ถ ๊ณผ์ โ ์บ์ ์๋ฆฌ โ ์๋ฌ ํด๊ฒฐ
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- npm ์ด CLI / ๋ ์ง์คํธ๋ฆฌ / ์น์ฌ์ดํธ ์ธ ๊ฐ์ง ์ญํ ์ ํ๋ค๋ ๊ฒ์ ์ค๋ช ํ ์ ์๋ค
- ํจํค์ง์ ๋ชจ๋์ ์ฐจ์ด๋ฅผ ์ ํํ ๊ตฌ๋ถํ ์ ์๋ค
-
@org/packageํํ์ ์ค์ฝํ ํจํค์ง๊ฐ ์ ์ฐ์ด๋์ง ์ดํดํ๋ค -
npm install์ด ๋ด๋ถ์ ์ผ๋ก HTTP ์์ฒญ โ tarball ๋ค์ด โ ์บ์ โ ์์ถ ํด์ ์์ผ๋ก ๋์ํจ์ ์ค๋ช ํ ์ ์๋ค -
EACCES,ENOENT,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 cipackage-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-depsENOENT โ ํ์ผ์ ๋ชป ์ฐพ์ ๋
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /path/to/package.json์์ธ: ํ์ฌ ๋๋ ํฐ๋ฆฌ์ package.json ์ด ์๋ ๊ฒฝ์ฐ.
# ์ฌ๋ฐ๋ฅธ ๋๋ ํฐ๋ฆฌ์ธ์ง ํ์ธ
ls package.json
# ์๋ค๋ฉด ์ด๊ธฐํ
npm init -yENOTFOUND โ ๋ ์ง์คํธ๋ฆฌ ์ฐ๊ฒฐ ์คํจ
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 ์ ํด๋ถํ๋ค๊ณ ํ์
จ์ผ๋๊น.