์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง ๋งค๋์ npm, yarn, pnpm์ ์ฐจ์ด๋ฅผ ์์๋ณด์.
ํจํค์ง ๋งค๋์ ๋?
๐๐ปโ๏ธ ํจํค์ง๋? npm์ ๋ฑ๋ก๋ node ๋ชจ๋.
์ด๋ฌํ ํจํค์ง๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์ด๋ก๋, ์ค์น, ์ ๋ฐ์ดํธ, ์์กด์ฑ ๊ด๋ฆฌ, ์ ๊ฑฐ ๋ฑ ๋ณต์กํ ์ํฉ๋ค์ด ๋ง์ด ์๊ธฐ๋๋ฐ ํจํค์ง ๋งค๋์ ๋ ์ด๋ฌํ ๊ณผ์ ๋ค์ ์๋ํํ์ฌ ํธ๋ฆฌํ๊ณ ์์ ํ๊ฒ ์ํํ ์ ์๋๋ก ํด์ค๋ค.
ํจํค์ง ๋งค๋์ ์ ๋ฑ์ฅ ์ด์ : ํ๋ก๊ทธ๋จ์ dependencies๋ฅผ ์๋์ผ๋ก ๋ค์ด๋ก๋ ํ๊ณ ๊ด๋ฆฌ
๋ฑ์ฅ ์ดํ: ํจํค์ง ๋งค๋์ ๋ฅผ ์ฌ์ฉํด dependencies๋ฅผ ๋ค์ด๋ก๋ ๋ฐ ๊ด๋ฆฌ
๋ชจ๋ ํจํค์ง ๋งค๋์ ์์ ํต์ฉ๋๋ ๊ฐ๋ ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
package.json
์ ํ๋ก๊ทธ๋จ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.node_modules
ํด๋์ dependencies๋ฅผ ์ค์นํ๋ค.- lock ํ์ผ์๋ ๊ฐ dependency์ ์ ํํ ๋ฒ์ ์ด ๊ธฐ์ฌ๋์ด ์๋ค. lock ํ์ผ์ ํตํด ๋ชจ๋ ํ์์ด ์ ํํ ๋์ผํ ๋ฒ์ ์ dependency๋ฅผ ์ค์นํ ์ ์๋ค.
๋ชจ๋ ํจํค์ง ๋งค๋์ ์์ ๊ณตํต์ ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- metadata์ ์์ฑ ๋ฐ ๊ด๋ฆฌ
- dependencies์ ์ค์น, ์ ๋ฐ์ดํธ, ์ญ์
- ์คํฌ๋ฆฝํธ ์คํ
- ํจํค์ง ํผ๋ธ๋ฆฌ์ฌ
- ๋ณด์ ๊ฒ์ฌ
npm - yarn - pnpm ์์ผ๋ก ํผ์ง๋งํ ์ฐจ์ด์ ๋ค์ ์ดํด๋ณด๋๋ก ํ์.
npm v.s. yarn
๐ ํจํค์ง ์ค์น ๋ฐฉ์์ ์ฐจ์ด
npm: ํจํค์ง๋ฅผ ์์ฐจ์ ์ผ๋ก ์ค์นํ๋ค.
yarn: ์ฌ๋ฌ ํจํค์ง๋ฅผ ๋์์ ๊ฐ์ ธ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ค์นํ๋ค.
→ ์๋ ์ธก๋ฉด์์ yarn์ด ๋ ์ฐ์ธํ๋ค. (๋ค๋ง npm์ ์
๋ฐ์ดํธ๋ก ์ธํด ํ์ฌ๋ ๊ทธ ์ฐจ์ด๊ฐ ๊ทผ์ํ๋ค๊ณ ํ๋ค.)
npm, yarn v.s. pnpm
๐ node_modules์ structure ์ฐจ์ด
npm, yarn: flat structure
pnpm: flat structure์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ symlinked structure
flat structure๋?
ํจํค์ง A,B,C๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํจํค์ง A,C๋ ๋ชจ๋ ํจํค์ง B์ ์์กดํ๋ค. ์ด๋ฌํ ์ํฉ์ ๊ฐ์ ํ์ ๋ npm@3 ์ด์ ์ node_modules ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์๋ค.
ํด๋น ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ๋ค์์ ๋ฌธ์ ์ ์ ๊ฐ์ง๋ค.
- depth๊ฐ ์ง๋์น๊ฒ ๊น์ด์ง ์ ์๋ค.
- depth๊ฐ ๊น์ด์ง์ ๋ฐ๋ผ directory path ๋ํ ๊ธธ์ด์ง๋ค.
- ๋์ผํ ํจํค์ง์ ๋ํ ์ค๋ณต๋ ํ์ผ๋ค์ด ์์ฑ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด npm์ flat structure๋ฅผ ๋์ ํ๋ค. yarn ๋ํ flat structure๋ฅผ ์ฌ์ฉํ๋ค. flat structure๋ ์๋ ์ด๋ฏธ์ง์ฒ๋ผ ์๊ฒผ๋ค.
flat ํ๋ค๋ ๋ง์ด ์ด์ ์ดํด๊ฐ ๋๋๊ฐ? ๋ณด๋ฉด ๋ชจ๋ ํจํค์ง์ depth๊ฐ ๋์ผํ๋ค. ํจํค์ง A,C์ ํ์์ ์๋ B๊ฐ top์ผ๋ก ํธ์ด์คํ ๋์์ผ๋ฏ๋ก, ์ด๋ฅผ ํจํค์ง ํธ์ด์คํ ๋ฐฉ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ํ์ง๋ง ๋ง์ฝ ํจํค์ง A,C๊ฐ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ํจํค์ง B๋ฅผ ํ์๋ก ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ํจํค์ง A-C ์์ผ๋ก ์ค์นํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋๋ค.
a/
b/ # v1.0.0
c/
โโโ node_modules/
โโโ b/ # v2.0.0
ํจํค์ง A ์ค์น ์ B๋ฅผ ํธ์ด์คํ ํด top์ ์ค์นํ๋ค. C ์ค์น ์ top์ ์ด๋ฏธ v1.0.0์ B๊ฐ ์์ผ๋ฏ๋ก C ํ์์ v.2.0.0์ B๋ฅผ ์ค์นํ๋ค. ์ฆ ํจํค์ง์ ์ค์น ์์์ ๋ฐ๋ผ node_modules์ ๊ตฌ์กฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
flat structure์ ๋ฌธ์ ์
- ghost dependency
= modules can access packages they don't depend on ๋ชจ๋ ํจํค์ง๊ฐ ํธ์ด์คํ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํจํค์ง์ dependency์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค. - ํ ํจํค์ง์ ์ฌ๋ฌ ๋ฒ์ ์ด ํ์ํ ๊ฒฝ์ฐ ๋์ผํ ํจํค์ง์ ํ์ผ์ด ์ฌ๋ฌ ๊ณณ์ ๋ณต์ฌ๋์ด์ผ ํ๋ค.
pnpm์ symlinked structure
์์์ ๊ธฐ์ ํ flat structure์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ ์, pnpm์ symlinked structure๋ฅผ ์ฌ์ฉํ๋ค.
pnpm์ node_modules ํด๋๋ nested ํํ์ด๋ค.(=flat ํ์ง ์๋ค) ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์์์ ์ด๋ฏธ nested node_modules์ ๋ฌธ์ ์ ์ ๋ํด ์ดํด๋ดค์๋ค. pnpm์ ์ด๋ป๊ฒ nested๊ณผ flat์ ๋ฌธ์ ์ ์ ๋์์ ํด๊ฒฐํ์๊น?
์ฐ์ ๋ชจ~๋ ํจํค์ง๋ค์ .pnpm-store ํด๋์ ์ ์ฅ๋๋ค. ํ์ํ ๋ชจ๋ ํจํค์ง์ ๋ชจ๋ ๋ฒ์ ์ด ํด๋น ํด๋์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅ๋๊ณ , node_modules์์๋ ํด๋น ํด๋์ ๋ํ hard link์ symbolic link๋ฅผ ํตํด ํจํค์ง์ ์ ๊ทผํ๋ค. ๊ฐ ํจํค์ง๊ฐ ํ ๋ฒ๋ง ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ single source of truth๋ฅผ ์งํฌ ์ ์์ผ๋ฉฐ, ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์๋ค. link๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋์ผํ ํจํค์ง๊ฐ ์ฌ๋ฌ ๊ณณ์ ๋ณต์ฌ๋ ์ผ์ด ์๋ค. ๋ ๊ตฌ์กฐ์ ์ผ๋ก nestedํ๊ธฐ ๋๋ฌธ์ ๊ฐ ํจํค์ง์ ์์กด ๊ด๊ณ๋ฅผ ๋ช ํํ ํ์ ํ ์ ์์ผ๋ฉฐ, ghost dependency ๋ฌธ์ ๋ํ ๋ฐ์ํ์ง ์๋๋ค.
์ฐธ๊ณ ๋ก pnpm์ npm์ drop-in replacement๋ก์ npm๋ง ์๋ค๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
* drop-in replacement: ์ค์ ์ ๋ฐ๊ฟ ํ์ ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ, ์๋์ ์์ ์ฑ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ ํฅ์์ด ์ด๋ค์ง๋ ๋์ฒดํ
์ฐธ๊ณ ๋งํฌ
https://blog.outsider.ne.kr/1230
https://medium.com/pnpm/why-should-we-use-pnpm-75ca4bfe7d93
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Yarn Berry๋ก React Native ํ๋ก์ ํธ ์์ํ๊ธฐ (0) | 2022.10.12 |
---|---|
๋ชจ๋ํ์ ๊ฐ๋ ๋ถํฐ Yarn Berry๊น์ง (0) | 2022.10.10 |
Context API ์ ๋๋ก ์ดํดํ๊ธฐ (1) | 2022.09.22 |
useEffect ์ ๋๋ก ์ดํดํ๊ธฐ (2) | 2022.09.21 |
Custom Hook์ ํจ์์ผ๊น ์ปดํฌ๋ํธ์ผ๊น (0) | 2022.09.09 |