๐ฆ pnpm ๋ฉํ ๋ชจ๋ธ โ npm์ด ๋ชป ํผ ๋ฌธ์ ๋ฅผ pnpm์ ์ด๋ป๊ฒ ํ์๋๊ฐ
๐ ๊ฐ์
content-addressable store, ํ๋๋งํฌ, ์ค์น ์๋์ ๋น๋ฐ๊น์ง โ pnpm์ ํ์ ๋ฐฐ๊ฒฝ๊ณผ ์ฒ ํ์ ์ดํดํ๋ค
01. pnpm ๋ฉํ ๋ชจ๋ธ
๐ ๋ชฉ์ฐจ
- ๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐พ npm์ ๊ณ ์ง์ ์ธ ๋ ๊ฐ์ง ๋ฌธ์
- ๐ช content-addressable store
- ๐ ํ๋๋งํฌ vs ์ฌ๋งํฌ
- ๐ pnpm ์ค์น 3๋จ๊ณ ํ์ดํ๋ผ์ธ
- โ๏ธ npm vs pnpm ํ๋์ ๋น๊ต
- pnpm ์ค์น & ํ๋ก์ ํธ ์ฒซ ์ธํ
- ์ด์ ๋ฆฌ
- ๋ง๋ฌด๋ฆฌ ํด์ฆ
- ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
- ๋ ์์๋ณด๊ธฐ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: ์ฝ 25๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 12๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[npm์ ๋ฌธ์ ์ธ์] โ [content-addressable store ์๋ฆฌ] โ [ํ๋๋งํฌ/์ฌ๋งํฌ ๋ฉ์ปค๋์ฆ] โ [์ค์น ํ์ดํ๋ผ์ธ] โ [์ฒซ ์ธํ ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- npm๊ณผ pnpm์ ๊ทผ๋ณธ์ ์ธ ์ ์ฅ ๋ฐฉ์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ ์ ์๋ค
- content-addressable store ๊ฐ ์ ๋์คํฌ๋ฅผ ์ ์ฝํ๋์ง ์ดํดํ ์ ์๋ค
- ํ๋๋งํฌ์ ์ฌ๋งํฌ์ ์ญํ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค
- pnpm ์ ์ค์นํ๊ณ Next.js ํ๋ก์ ํธ์ ์ฒซ ์ธํ ์ ํ ์ ์๋ค
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'

- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋, ์ ์์ฆ ํ๋ก์ ํธ 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 ๋ก ํ์ผ์ ๋ณต์ฌํ์ง ์๋๋ค. ๋์ ๋ ์ข
๋ฅ์ ๋งํฌ๋ฅผ ์ฌ์ฉํ๋ค.
ํ๋๋งํฌ (Hard Link) โ ์คํ ์ด โ .pnpm
๊ธ๋ก๋ฒ ์คํ ์ด์ ํ์ผ
~/.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 ๋ฒํธ๊ฐ ๋์ผ!์ฌ๋งํฌ (Symbolic Link) โ .pnpm โ ํ๋ก์ ํธ ๋ฃจํธ
ํ๋ก์ ํธ/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 ํ๋์ ๋น๊ต
| ํญ๋ชฉ | npm | pnpm |
|---|---|---|
| ํ์ผ ์ ์ฅ ๋ฐฉ์ | ํ๋ก์ ํธ๋ณ ๋ณต์ฌ | ๊ธ๋ก๋ฒ ์คํ ์ด + ํ๋๋งํฌ |
| ๋์คํฌ ์ฌ์ฉ | ํ๋ก์ ํธ ์ ร ํจํค์ง ํฌ๊ธฐ | ๊ณ ์ ํ์ผ ์ ร ํ์ผ ํฌ๊ธฐ |
| node_modules ๊ตฌ์กฐ | ํํํ(hoisting) | ์ฌ๋งํฌ ๊ธฐ๋ฐ ๊ฒฉ๋ฆฌ |
| ํฌํ ์์กด์ฑ | ๋ฐ์ ๊ฐ๋ฅ โ ๏ธ | ์์ฒ ์ฐจ๋จ โ |
| ์ค์น ์๋ | ๋๋ฆผ | ๋น ๋ฆ (์บ์ ์ ํ๋๋งํฌ๋ง) |
| lockfile | package-lock.json | pnpm-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 pnpmpackage.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=trueNext.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๊ธฐ๋ณธ ๋ช ๋ น์ด ๋์ํ
| npm | pnpm | ์ค๋ช |
|---|---|---|
npm install | pnpm install | ์ ์ฒด ์์กด์ฑ ์ค์น |
npm install react | pnpm add react | ํจํค์ง ์ถ๊ฐ |
npm install -D jest | pnpm add -D jest | devDependency ์ถ๊ฐ |
npm uninstall react | pnpm remove react | ํจํค์ง ์ ๊ฑฐ |
npm update | pnpm update | ํจํค์ง ์ ๋ฐ์ดํธ |
npm run dev | pnpm dev | ์คํฌ๋ฆฝํธ ์คํ |
npx create-next-app | pnpm dlx create-next-app | ์์ ํจํค์ง ์คํ |
npm ci | pnpm install --frozen-lockfile | CI ํ๊ฒฝ ์ค์น |
๐ ์ด์ ๋ฆฌ
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 ์ค์นํ๊ณ ํ๋ก์ ํธ๋ค ์ ํํด๋ด์ผ์ง. ์ค๋ ๋ฐฐ์ด ๊ฑธ ์จ๋จน์ด๋ณด์!