๋ณธ ๊ธ์ ํ ์คํธ ๋ฌธ์ ์ ๋๋ค.
- ์ด์ ๋ฅผ ๋ชจ๋ฅธ์ฑ
node_modules
๋ฅผ.gitignore
์ ์์ฑํ๋ ๋ถ- ๋จ๋ค ๋ค ์ด๋ค๋
yarn
์ด๋yarn berry
๋ฑ์์ฌ์ฉ
ํ๊ธฐ๋ง ํ๋ ๋ถ- ์ด๋ฒ์์ผ ๋ง๋ก pm์ ๋ํด ์ด๋ ดํ์ด๋๋ง ํ์ตํ๊ณ ์ถ์ผ์ ๋ถ
node_modules
๋ฅผ ํฌํจํ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ์ ์ธ ์์npm
์ด ๊ตฌ์ฑํ๋node_modules
์ ๊ตฌ์กฐyarn
(classic)์ด ๊ตฌ์ฑํ๋node_modules
์ ๊ตฌ์กฐpnpm
์ด ๊ตฌ์ฑํ๋node_modules
์ ๊ตฌ์กฐyarn berry
๊ฐ ๊ตฌ์ฑํ๋node_modules
์ ๊ตฌ์กฐ- ์ค์ ์ฝ๋๋ฅผ ํตํด ์ค์ต ๋ฐ ๋น๊ต
์ง๊ธ๊น์ง ์ ๋ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด ์ต๊ด์ฒ๋ผ ์๋์ ๊ฐ์ด ์์ํ๊ณค ํ๋๋ฐ์. ๋ฐ๋ก ์ด ํ ์ค๋ก ์ธํด์ ์ด ๊ธ์ด ์ถ๋ฐํ๊ฒ ๋์์ต๋๋ค.
์ต์ํ ์ฐ๋ฆฌ์ .gitignore
์ ์ ํฌ๋ ์ต๊ด์ฒ๋ผ
node_modules
๋ฅผ.gitignore
์ ์์ฑํ์๊น์?
์ด๋ฒ์ node_modules
๊ฐ ํ๋ก์ ํธ์์ ๊ฐ์ง๊ณ ์๋ ์๋ฏธ์ ๋ํด์ ํด์ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋๋ถ์ด ์ฌ๋ฌ ํฐ IT๊ธฐ์
๋ค์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ์ yarn berry ์ ๋ํ ํ๊ธฐ๋ค์ ๋ํ ์๋ฌธ์ ์ด ์๊ฒผ์ต๋๋ค.
์๋ฅผ ๋ค์๋ฉด, ํ ์ค ๊ธฐ์ ๋ธ๋ก๊ทธ์์ ๊ธฐ์ ๋
yarn-berry
์ ์ฅ์ ๋ค์ ๋ณด๊ณ , ์ ๋ง ๋น ๋ฅธ๊ฑฐ ๋ง์? ๋ด๊ฐ ํ์ธํด๋ด์ผ๊ฒ ์ด!
+) ๋ณธ ๊ธ์์ PM์
package manager
์ ์ฝ์นญ์ผ๋ก ์ฌ์ฉํ ์์ ์ ๋๋ค. ํน์ฌ๋ ํท๊ฐ๋ฆฌ์ ๋ค๋ฉด ์ด์ ์ ์ํด์ ์ฝ์ด์ฃผ์๊ธธ ๋ฐ๋๋๋ค.
node_modules
๋ฅผ ํฌํจํ ๊ธฐ๋ณธ์ ์ธ ํ๋ก์ ํธ ์์์ต์ํ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ
node_modules
๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํจํค์ง๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์
๋๋ค.
์ฆ ํ๋ก์ ํธ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ถ์ ์ฝ๋์ ํํค์ง๋ค์ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ ๊ณต๊ฐ์ผ๋ก ์ฎ๊ฒจ์จ ๊ฒฐ๊ณผ๋ฌผ ์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ npm i react
๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ์ ํจํค์ง๋ฅผ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ๋ก ๊ฐ์ ธ์ค๋ ๊ณผ์ ์ด์๋ ๊ฒ์
๋๋ค.
์ฒ์ฒํ ๊ทธ ๊ณผ์ ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
// npm init ํ ํ๋ก์ ํธ์ ์ธ๋ถ ํจํค์ง๊ฐ ์ ์ฉ๋๋ ๊ณผ์
npm init // ์ด๊ธฐ ํ๋ก์ ํธ ์
ํ
๋ช
๋ น์ด
npm i react // npm ์ด๋ผ๋ pm์ ํตํด์ react๋ฅผ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์ ์ค์นํฉ๋๋ค.
npm i react
์ ๋ํด์์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ react
๋ฅผ ์ค์นํ๋ ๋ช
๋ น์ด ์
๋๋ค. ์ฌ๊ธฐ์ ์ฌ๋ฌ๊ฐ์ง ๋ณํ ํํ์ค ์ต์
(yarn add , -g๋ฅผ ํตํ ์ ์ญ์ค์น , --save ๋ช
๋ น์ด๋ฅผ ํตํด devdependency์ ์ถ๊ฐ) ๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง ์ฐ์ ์ง๊ธ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ๋ง์ ๋ค๋ค๋ด
๋๋ค.
npm i react // ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก react package๋ฅผ ๋ด ๋ก์ปฌ ํ๋ก์ ํธ์ ์ค์นํฉ๋๋ค.
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ๊ธฐํ๊ฒ๋ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ npm init
์ผ๋ก ์์ฑ๋ package.json
์ ์ ์ธํ๊ณ ๋ ๋๊ฐ์ง ์์๊ฐ ๋ ์๋์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
(์ ๊ฐ ์ง๊ธ ์ฌ์ฉํ๋ npm
๋ฒ์ ์ 9.8.1๋ก ๊ธ ์์ฑ์ผ ๊ธฐ์ค ๊ฐ์ฅ ์ต์ ๋ฒ์ ์
๋๋ค.)
๊ทธ๋ ๋ค๋ฉด ํ์ฌ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ์ ํ๋ฒ ํ์ธํด๋ณด๊ฒ์ต๋๋ค.
package.json
(after npm i react) (npm init์ผ๋ก ์์ฑ)์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ npm i react
๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด package.json
์ dependencies
์ ์ ์ฅ๋ฉ๋๋ค. ์์์ ์ด์ง ์ธ๊ธํ๋ฏ, ์ด package.json
์์๋ devdependencies
๋ฅผ ๋น๋กฏํ์ฌ ์ฌ๋ฌ ์์ฑ๋ค์ด ์กด์ฌํ๋ฉฐ, ํ๋ก์ ํธ์ ๋ด๋ถ์์ ์ฌ์ฉํ ์ฌ๋ฌ ํํค์ง ์ ๋ณด๋ฅผ ๋น๋กฏํ ์คํฌ๋ฆฝํธ, ํ๋ก์ ํธ์ ๋ํ ์ ๋ณด๋ค์ด ํฌํจ๋์ด์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ธ์์๋ ๋ค๋ฃจ์ง ์์ง๋ง ์ฌ๋ฌ ์์ฑ๋ค์ด ์กด์ฌํ๋ค๋ ์ ์ ์๊ณ ๊ฐ๋ฉด ์ข๊ฒ ์ต๋๋ค!
'
๊ฝค๋ ์ ๊ธฐํ๊ณ ์ ์ฉํ ๋
์์
๋๋ค. ํ์ผ๋ช
์ lock
์ด ๋ถ์ด ์๋๊ฒ์ผ๋ก ๋ณด์ ๋ฌด์์ธ๊ฐ๋ฅผ "์ ๊ทธ๋ค" ๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ์, ์ฌ์ค ์ฐ๋ฆฌ๊ฐ ์์ผ๋ก ๋ค๋ฃฐ npm @2
๋ npm @3
์ ์์ ์์๋ ๊ฐ๋ฐ๋์ง ์๋ ์์์์ผ๋ฉฐ, yarn
์ ๊ฐ๋ฐ ์ดํ ์๊ฐ์ ๋ฐ์ npm
์ ๋ฌธ์ ์ ์ ํด์ํ๊ธฐ ์ํ์ฌ ๋์
๋์์ต๋๋ค. ๋ ์์ธํ ๋ด์ฉ์ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๊ฒ ์ง๋ง ํค์๋๋ฅผ ๋จผ์ ๋ง์๋๋ฆฌ์๋ฉด non-deterministically ๋ฌธ์ ํด๊ฒฐ
, ๋ฒ์ ๊ณ ์
ํนํ๋ non-deterministically ๋ฌธ์ ํด๊ฒฐ
์ด PM์์ ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ์ง๋์ง์ ๋ํด์ ๊ธฐ์ตํ๋ค๋ฉด ์ข ๋ ์๋ฏธ์๋ ํ์ต์ด ์งํ๋ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค.
๋๋ง์ node_modules
์
๋๋ค. ์ฌ์ค ์ด ๊ธ์ ๋ชจ๋ ํต์ฌ์ด๋ผ๊ณ ๋ด๋ ๋ฌด๋ฐฉํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ค์ ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋ด์ฉ์ ๊ฐ๊ธฐ ๋ค๋ฅธ PM๋ค์ด
๊ตฌ์ฑํ๋ node_modules
์ ์ฐจ์ด๋ฅผ ๋ถ์ํ๋ ๊ฒ์ด ์ด ๊ธ์ ํต์ฌ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
node_modules
๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์ ์ด์ํ ์ ์ด ์์ต๋๋ค.
๋ค์ ์์๋ฅผ ๋ณด๋ฉด, ์ ํฌ๊ฐ ์ค์นํ react
๋ฅผ ์ ์ธํ๊ณ ๋ ๋ช๊ฐ์ง ํด๋๊ฐ ๋ ์์ฑ๋์ด ์๋๊ฒ์ผ๋ก
๋ณด์
๋๋ค.
๋ถ๋ช ์ฐ๋ฆฌ๋
react
๋ง์ ์ค์นํ๋๋ฐ ๋ง์ด์ฃ ...
์ด๋ฐ ์๋ฌธ์ ๊ณง ํด๊ฒฐ ๋ ๊ฒ๋๋ค. ํ์ง๋ง ์ด๋ฒ์๋ ํค์๋๋ฅผ ๋ง์๋๋ฆฌ์๋ฉด ์ด๋ฐ ํ์์ ๋ฐ๋ก ์ ๋ น ์์กด์ฑ(Phantom Dependency)
์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๊ท์ฌ์ด ์ ๋ น์ ๊ฐ์ ธ์ ๋ณด์์ต๋๋ค?
์ผ์ถ
node_modules
๋ฅผ ๋น๋กฏํด์ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ์์์ ๋ํด์ ํ์ตํ์์ต๋๋ค. ์ง๊ธ ๋ถํฐ๋node_modules
์ ํฐ ๊ตฌ์กฐ๋ณํ๋ฅผ ๋ณด์๋npm @2
->npm @3
->yarn (classic)
->pnpm
->yarn berry
์์๋ก ํ์ต์ ์งํํ ์์ ์ ๋๋ค.
npm ํ๊ฒฝ์์์ node_modules ์ ๊ตฌ์กฐ์ ๋ํด์ ํ์ตํฉ๋๋ค.
npm v2 ์ npm v3(์ต์ ๋ฒ์ 2015๋ ์ดํ๋ก stable)์ ์ฃผ์ ๋ณ๊ฒฝ์ ์ ๊ดํ์ฌ ์์ฑํฉ๋๋ค.
npm @2
๋ npm v3
๊ฐ stable
๋๊ธฐ ์ ๊น์ง ์ฌ์ฉ๋์ด ์๋ npm
์ ๊ณผ๊ฑฐ์ ๋ฒ์ ์
๋๋ค.
npm v2
์์ ์์กด์ฑ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ์๋ฅผ ํตํด ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฃผ์ด์ง ์ํฉ์์ ์ธ ๊ฐ์ ๋ชจ๋ A, B, C๊ฐ ์๊ณ , A๋ B๋ฅผ v1.0์ผ๋ก ์๊ตฌํ๊ณ , C๋ B๋ฅผ ์๊ตฌํ์ง๋ง v2.0์ ์๊ตฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ์ด๋ฌํ ์ํฉ์์ npm @2
๋ ์ด๋ป๊ฒ ์์กด์ฑ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ๊น์?
์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง, npm @2
๋ ํด๋ ๋ด์ ๊ฐ ํจํค์ง์ ์ข
์์ฑ์ ๊ฐ๊ฐ ์ค์นํ๋ ๋ฐฉ์์ ์ทจํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ A, B, C๋ฅผ ์ค์นํ๋ ค๋ฉด ๊ฐ๊ฐ์ ํด๋์ ๊ฐ ํจํค์ง์ ์์กด์ฑ์ ์ค์นํฉ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ๋ก ์์กด์ฑ ์ง์ฅ(Dependency Hell)
์ด๋ผ๊ณ ํฉ๋๋ค.
Dependency Hell
์ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐ ๊ด๋ฆฌ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ํฉ์ ๋ํ๋ด๋ ์ฉ์ด์
๋๋ค. ์ด ๋ฌธ์ ๋ ์์กด์ฑ ๊ด๋ฆฌ ์์คํ
์์ ์ฌ๋ฌ ์์กด์ฑ๋ค์ด ๋ณต์กํ๊ฒ ๊ผฌ์ฌ์ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ์ํฉ์ ๋งํฉ๋๋ค. ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋ฐ์ํฉ๋๋ค:
Version Conflict (๋ฒ์ ์ถฉ๋): ์๋ก ๋ค๋ฅธ ํจํค์ง๋ค์ด ๋์ผํ ํจํค์ง์ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ์๊ตฌํ ๋ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, A ํจํค์ง๊ฐ B ํจํค์ง์ v1.0์ ์๊ตฌํ๊ณ , C ํจํค์ง๊ฐ B ํจํค์ง์ v2.0์ ์๊ตฌํ ๊ฒฝ์ฐ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
Transitive Dependencies (๊ฐ์ ์์กด์ฑ): ํ๋์ ํจํค์ง๊ฐ ๋ค๋ฅธ ํจํค์ง์ ์์กดํ๋ฉฐ, ๋ค๋ฅธ ํจํค์ง๊ฐ ๋ ๋ค๋ฅธ ํจํค์ง์ ์์กดํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฐ ์์กด์ฑ ์ฒด์ธ์ด ๋ณต์กํ๊ฒ ๊ผฌ์ผ ๊ฒฝ์ฐ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
Complex Dependency Graphs (๋ณต์กํ ์์กด์ฑ ๊ทธ๋ํ): ์ฌ๋ฌ ๊ฐ์ ํจํค์ง๋ค์ด ๋ณต์กํ๊ฒ ์ฝํ ์์ ๋, ์ด๋ค ํจํค์ง๋ฅผ ์ค์นํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ฉด ๋ค๋ฅธ ํจํค์ง๋ค์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
Dependency Hell
์ ์ํํธ์จ์ด์ ์ ์ง ๊ด๋ฆฌ ๋ฐ ์
๋ฐ์ดํธ ๊ณผ์ ์์ ์์ธกํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ด๋ ค์์ง๋ฉฐ, ๊ฐ๋ฐ์๋ค์ ์๊ฐ์ ํด๊ฒฐ์ฑ
์ ์ฐพ๋ ๋ฐ ์์์ผ ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด npm @2
์์๋ ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ์๊น์? ๋ฐ๋ก ์๋์์ ํ์ธํ ์ ์์ต๋๋ค.
์๋๋ npm @2
์์ ํด๋น package
๋ค์ ์์กด์ฑ ๊ด๊ณ๋ฅผ ํด์ํ์ฌ ์์ฑ๋ node_modules
์
๋๋ค.
project/
โโ node_modules/
โ โโ A/
โ โ โโ node_modules/
โ โ โ โโ B@v1.0/
โ โ โโ package.json (A's dependencies: B@v1.0)
โ โโ C/
โ โ โโ node_modules/
โ โ โ โโ B@v2.0/
โ โ โโ package.json (C's dependencies: B@v2.0)
โโ package.json (Project's dependencies: A, C)
์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์๋ฏ, npm @2
์์๋ ์ด๋ ค์ด ๋ฐฉ์๋ณด๋จ ์ง๊ด์ ์ด๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ฑํํ์ต๋๋ค. ์์กด์ฑ๊ด๊ณ๋ฅผ ํด๋น packages
๋ค์๊ฒ ๋ชจ๋ ๋จ๊ฒจ๋ ๊ฒ์ด์ง์.
์์ ๊ฐ์ ํด๋ ๊ตฌ์กฐ ํํ๋ก ํํํ ์ ์์ผ๋ฉฐ, ์๋๋ npm.github.io ์์ ์ธ์ฉํ ๋์๋ ์ ๋๋ค.
์์ ๋ฐฉ์์์ ํ์ธํ ์ ์๋ฏ์ด, Dependency Hell
์ ํผํ๊ธฐ ์ํด์, ๊ฐ๊ฐ์ ๋ชจ๋ package ๋ค์ ๋ํด์ ๋ชจ๋ ์์กด์ฑ์ ๋ช
์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
npm v2์๋ ์ฌ๋ฌ๊ฐ์ง ํ๊ณ๊ฐ ์์ต๋๋ค.
๋ฐ๋ก ์์ ๊ทธ๋ฆผ์ด npm @2
์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ ๋ํด์ ๋ณด์ฌ์ฃผ๋ ๋ํ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋ฌดํํ ์ค๋ณต๋๋ B v1์ด ์ค์น ๋ ์ ์์ต๋๋ค.
npm @2
์์๋ ์์กด์ฑ์ ์ค์ฒฉํ์ฌ ์ค์นํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค. ์ด๋ก ์ธํด ์ฌ๋ฌ ๋ชจ๋์ด ๋์ผํ ํจํค์ง์ ๋ค๋ฅธ ๋ฒ์ ์ ์ค๋ณต์ผ๋ก ์ค์นํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋์คํฌ ๊ณต๊ฐ ๋ญ๋น์ ์์กด์ฑ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.npm @2
์ ์์กด์ฑ ๊ด๋ฆฌ ๋ฐฉ์์ ์์กด์ฑ์ ์ค์ฒฉ ์ค์นํ๋ฏ๋ก ์ค์น ์๋๊ฐ ์๋์ ์ผ๋ก ๋๋ฆด ์ ์์ต๋๋ค. ๋ชจ๋ ์์กด์ฑ์ ์ค์ฒฉ์ ์ผ๋ก ์ค์นํ๋ ๊ณผ์ ์ด ๋ ๋ง์ ์๊ฐ์ ํ์๋ก ํฉ๋๋ค.๊ทธ๋ ๋ค๋ฉด npm @2
์ ์ด๋ฌํ ๋จ์ ๋ค์ด npm @3
์์๋ ์ด๋ป๊ฒ ํด๊ฒฐ ๋์๊ณ , ๊ทธ๋ผ์๋ ๊ฐ์ง๊ณ ์๋ ํ๊ณ์ง์ ์ ์ด๋ค ๊ฒ์ด ์์๊น์?
npm @3
๋ 2015๋
5์์ beta
๋ฒ์ ๋ฆด๋ฆฌ์ฆ ์ดํ 4๋ฌ๋ค 9์์ ์ ์ ๋ฒ์ ์ผ๋ก ๋ฐฐํฌ๋์์ต๋๋ค.
npm @3
๋ npm @2
์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค. ๋ํ์ ์ธ ํค์๋๋ ๋ฐ๋ก, "Flat
" ์
๋๋ค.
Flat์ ๊ฒ์ํ๋ Flat earth๊ฐ ๋์ค๋ ๊ตฐ์... ๊ทธ๋๋ Flat์ ๋ํด์ ์ง๊ด์ ์ผ๋ก ์ ์ ์์ผ๋, ๊ฐ์ ธ์ ๋ณด์์ต๋๋ค. (~~์ง๊ตฌ๋ ํํํ์ฃ .~~)
npm @3
์ ํน์ง์ ๋ฐ๋ก "Flat"
์์ ์ฌ์ง์ ๋ณด๋ฉด ์ข ๋ ์ดํด๊ฐ ๋น ๋ฅผ ์ ์์ต๋๋ค.
NPM @3
์์๋ package๋ค์ ๊ฐ๋ฅํ
flatํ๊ฒ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ด๋ฐ ์๊ฐ์ด ๋ค ์๋ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด v2์์ ๋ง์ฝ์ด์๋, Dependency Hell
๋ฌธ์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๊ฑฐ์ง??
npm @3
์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ์ต๋๋ค. ์ค์น ์์(npm v3์์๋ ์ค์ํ ๊ฐ๋
) ์ ๋ฐ๋ผ, ํ์ฌ๋ package A ๊ฐ package C ๋ณด๋ค ๋จผ์ ์ค์น ๋์๋๋ฐ์, ์ด๋ ๋จผ์ Flatํ๊ฒ top level์ B v1.0์ด ์ฌ๋ผ๊ฐ๊ฒ ๋ฉ๋๋ค.
์ด ๋ํ tree ๊ตฌ์กฐ๋ก ํ์ธํด๋ณธ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
project/
โโ node_modules/
โ โโ A/
โ โ โโ package.json (A's dependencies: B@v1.0)
โ โโ B@v1.0/
โ โโ C/
โ โ โโ node_modules/
โ โ โ โโ B@v2.0/
โ โ โโ package.json (C's dependencies: B@v2.0)
โโ package.json (Project's dependencies: A, B@v1.0 ,C)
npm @2
์์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ node_modules
์ top-level์ B ๊ฐ ๋ฑ์ฅํ๋ค๋ ๊ฒ์
๋๋ค!
์ด๋ฅผ ํตํด์ ์ฐจํ์ B@v1.0๊ฐ ๋ ์ฌ์ฉ๋ ๋, ๋์ด์ ํ์ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํ์ง ์์๋ ๊ด์ฐฎ์ต๋๋ค.
์ด๋ฅผ ์ข๋ ๊ทธ๋ฆผ์ ํตํด์ ์ค๋ช ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์๋ก์ด ์์กด์ฑ์ ๊ฐ์ง D ํจํค์ง๋ฅผ ์ฐ๋ฆฌ์ ์๋น์ค์ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํด ๋ด ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋์๋๊ฐ ๋ง๋ค์ด์ง๋๋ค! ํน์ ์กฐ๊ธ ์ด์ํ์ ๊ฐ์? npm v2์ ๋๋์ด ๋๋ฉฐ ๊ฑฐ์ ์ ์ฌํ๋ค๊ณ ๋๋ผ์ค๊ฒ๋๋ค. ๋ง์ต๋๋ค! npm v3์์๋ "๊ฐ๋ฅํ" flatํ๊ฒ ๋ง๋๋ ค ํ๋ฉฐ , ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ npm v2์ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ B v2.0์ top - level๋ก ์ฌ๋ฆด ์ ์์ผ๋ฏ๋ก, package C ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์กด์ฑ์ ํ์์ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด B v1.0์ ์์กด์ฑ์ผ๋ก ๊ฐ์ง๋ ํจํค์ง๋ฅผ ์ถ๊ฐํด๋ณด๋ฉฐ ๊ฐ์ ์ ์ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
package E๋ B v1.0์ ์์กด์ฑ์ผ๋ก ๊ฐ์ง๋ ํจํค์ง ์
๋๋ค. ์ด ๋ํ ์ ํฌ์ ์๋น์ค์ ์ถ๊ฐํด๋ณด๋๋ก ํ์ฃ
B v2.0์ ์ถ๊ฐํ ๋์๋ ๋ค๋ฅธ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ก์ต๋๋ค. ์ด๋ B v1.0์ด ์ด๋ฏธ top level์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ค์ง ๋์๋ ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ package A ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ dependency ์์ด ์ ์ธ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ง์ฝ B v1.0์ B v2.0์ผ๋ก update ์์ผ์ฃผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
ํด๋น ์๋น์ค ๋ด์์๋ B v2.0๋ง ์ฌ์ฉํ๋ฏ๋ก ๋ฑ๋ด๋ ๊ฐ์ํ๋ package ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ค๊ฐ์? ๊ทธ๋๋ npm v2์์ ๋ณด๋ค ๋ง์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง๊ฒ์ฒ๋ผ ๋ณด์ฌ์ง๋๋ค. ๋ฌด์๋ณด๋ค. memory๋ฅผ ๋นํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ถ๋ถ์ด ์๋น๋ถ๋ถ ๊ฐ์ ์ด ๋๊ฒ์ ํ์ธํ ์ ์์ด์. ํ์ง๋ง ๊ทธ๋ผ์๋ ์ฌ๋ฌ๊ฐ์ง ํ๊ณ๊ฐ ์กด์ฌ ํ๋๋ฐ์, ๊ณผ์ฐ ์ด๋ค๊ฒ ์์๊น์??
ํธ์ํฐ์์ ๋ ๋๋ node_modules ์ ๋จธ
๋ค๋ฅธ ๊ธ์์ ์ข ๋ ์ค๋ช
ํด ๋๋ฆฌ๊ฒ ์ง๋ง, ์์ง๋ node_modules
์ flat ํ๊ฒ ํ์์๋ ์ฌ์ ํ ๋ฌด๊ฒ์ต๋๋ค. ๋ค์์ ์ํฉ์์ node_modules
์๋ง๋ํ ํฌ๊ธฐ๋ก ์ธํด์ CI ๋ฑ ์์
์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณค ํฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฌ๋ฌ๊ฐ์ง ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๊ณ ์๋์์ต๋๋ค.
์ฌ์ง์ด
node_modules
๋ฅผ ์์ ๊ธฐ๋...(yarn berry
)
node_modules
๋ด๋ถ์์ dependency
๋ฅผ ์ฐพ๊ธฐ ์ํด์๋ node_modules ๋ก๋ฉ ๋ฐฉ๋ฒ ์ ํตํด์ ์งํ๋ฉ๋๋ค.
๋ค์ ๊ธ์ node_modules
๋ด๋ถ์์ dependency
๋ฅผ ์ฐพ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๊ณ ์์ต๋๋ค.
๊ฐ๋จํ๊ฒ ์์ฝ์ ํ์๋ฉด
- ํ์ฌ ์์น์
node_modules
์์dependency
๋ฅผ ์ฐพ๋๋ค.- ๋ง์ฝ ๋ชป์ฐพ์๋ค๋ฉด... ์์ ํด๋์
node_modules
๋ฅผ ์กฐ์ฌํ๋ฉฐ, ์ด ๊ณผ์ ์ ์ฐพ์๋ ๊น์ง "๋ฐ๋ณต" ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ dependency
๊ฒ์ ๋ฐฉ๋ฒ์ผ๋ก ์ธํด์ ๋ณต์กํ node_modules
๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ npm
์ ๊ฒฝ์ฐ ๊ต์ฅํ ๊ธด ์๊ฐ์ ์์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์คํ๋ ค ์์ ๋ฐ์ ํ ์ ์๋ ๋ฌธ์ ๋ npm @2
์์๋ ๊ฑฐ์ ๋ฐ์ํ์ง ์์ ์ ์์ต๋๋ค. ์ข
์์ฑ์ ๊ฐ์ง๋ ๋ชจ๋ ํจํค์ง๋ค์ ๋ํด์ ํ์ฌ ํจํค์ง๊ฐ "๋ชจ๋" ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋นํจ์จ์ ์ธ ๋์คํฌ ํ์ฉ๋ฐฉ๋ฒ์ด ์ด ๊ฒฝ์ฐ์ ์คํ๋ ค ์ ๋ฆฌํด์ง ๊ฒฝ์ฐ ์
๋๋ค.
์ด ๋์๋๋ ์์์ npm @3
์ ํจ์จ์ฑ์ ์ค๋ช
๋๋ฆฌ๋ฉฐ ๋ง์๋๋ ธ๋ ๋์๋ ์
๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ์ค๋ช
๋๋ฆด ์์๊ฐ ํ๋๋ ์์ต๋๋ค. ๋ฐ๋ก "์ ๋ น ์์กด์ฑ"์ ์๋ฏธํฉ๋๋ค. ์ ๋ App์ ์ด์ํ๋ฉด์ B v2.0์ ์ค์นํ์ ์ด ์์ง๋ง ๋ง์น ์ค์นํ๊ฒ ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ๋ก flat ํ๊ฒ ์ฎ๊ธฐ๋ ๊ณผ์ ์์ ๋ฐ์ํ phantom dependency
๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ์, ์ด๋ฅผ ํตํด์ ์ฝ๋์ ๋ณต์ก์ฑ๊ณผ ๋ชจํธํจ์ ๋๋ฆด ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ ์์์์๋ package A
๋ฅผ ์ค์นํ ์ดํ package C
๋ฅผ ์ค์นํ์ต๋๋ค. ํ์ง๋ง ๋ฐ๋๋ก ์งํํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
ํด๋น ๋์๋๋ฅผ ์ค๋ช ํ๊ธฐ ๋ฐ๋ก ์ง์ ์์๋ package A๋ฅผ ๋จผ์ ์ค์น ํ package C๋ฅผ ์ค์น ํ์๋๋ฐ, ๋ง์ฝ ์ด๊ฒ ์๋๋ผ package C๋ฅผ ๋จผ์ ์ค์นํ๋ค๋ฉด, flatํ๊ฒ ๋ง๋๋ คํ๋ npm v3์ ๋ฐ๋ผ top-level์๋ B v1.0์ด ์๋ B v2.0์ด ์ค๊ฒ ๋ฉ๋๋ค.
์ฆ ์ค์น ์์์ ๋ฐ๋ผ ๋ค๋ฅธ
node_modules
์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
+) ํ์ง๋ง ์ด ์์ ์์์ ํด๋น ๋ฌธ์ ๋ npm @3์์๋ง ํด๋นํฉ๋๋ค. ์ดํ yarn๊ณผ ์๋ก ๊ฒฝ์๊ณผ ์ฑ์ฅ์ ๊ฑฐ๋ญํ๋ฉฐ, package-lock.json ์ด ๋ฑ์ฅํ๊ฒ ๋๋ฉฐ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
yarn
์ 2016๋
์ดํ๋ก ํ์ด์ค๋ถ, ๊ตฌ๊ธ , Exponent ์ ๊ฐ์ ํ์ฌ๋ค์ ํ๋ ฅ์ผ๋ก ์ธํด์ ๊ฐ๋ฐ๋ ์๋ก์ด package manager
์
๋๋ค.
yarn
์ ์ฌ์ฉํ๋ฉด ์์ง๋์ด๋ค์ ์ฌ์ ํ npm
๋ ์ง์คํธ๋ฆฌ์ ์ ๊ทผํ ์ ์์ง๋ง, ํจํค์ง๋ฅผ ๋ ๋นจ๋ฆฌ ์ค์นํ๊ณ ์ฌ๋ฌ ๊ธฐ๊ณ์์ ์ผ๊ด๋๊ฒ ์ข
์์ฑ์ ๊ด๋ฆฌํ๊ฑฐ๋ ๋ณด์์ด ์ ์ง๋๋ ์คํ๋ผ์ธ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํจํค์ง ๋งค๋์ ๊ฐ ์๋ ์์ ์๋ JavaScript ์์ง๋์ด๋ค์ด ํ๋ก์ ํธ์ ์ง์ ์ ์ฅ๋๋ ์์์ ์ข ์์ฑ์ ์์กดํ๊ฑฐ๋ CDN์์ ์ ๊ณต๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ฃผ์ JavaScript ํจํค์ง ๋งค๋์ ์ธ npm์ Node.js๊ฐ ์๊ฐ๋ ์งํ์ ๋ง๋ค์ด์ก์ผ๋ฉฐ, ๊ธ์ธ ์ธ๊ณ์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํจํค์ง ๋งค๋์ ์ค ํ๋๊ฐ ๋์์ต๋๋ค. ์๋ก์ด ์คํ ์์ค ํ๋ก์ ํธ๊ฐ ์์ฒ ๊ฐ ์์ฑ๋์๊ณ ์์ง๋์ด๋ค์ ์ด์ ๋ณด๋ค ๋ ๋ง์ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ฌ๋ npm
์๋ ์ฌ์ ํ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํฌํจํ๊ณ ์์์ต๋๋ค.
๋ค๋ฅธ ๊ธฐ๊ธฐ ๋ฐ ์ฌ์ฉ์ ๊ฐ์ ์ข ์์ฑ์ ์ค์นํ๋ ์ผ๊ด์ฑ ๋ฌธ์ , ์ข ์์ฑ์ ๊ฐ์ ธ์ค๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ, ์ผ๋ถ ์ข ์์ฑ์์ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์คํํ๋ npm ํด๋ผ์ด์ธํธ์ ์คํ ๋ฐฉ์๊ณผ ๊ด๋ จ๋ ๋ณด์ ๋ฌธ์ ๋ฑ์ด ๋ฐ์ํ์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง, ์ข ์ข ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
๋ํ์ ์ธ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ด ์์์ต๋๋ค.
non-deterministically
(๋น๊ฒฐ์ ์ - node_modules๊ฐ ๋ค๋ฅผ ์ ์์) ํ์๊ทธ๋ ๋ค๋ฉด Yarn
์์๋ ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๊น์?
yarn
์ npm v3
์ node_modules
์ ๊ฐ์ด flat
ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ์ ์ด ์ถ๊ฐ๋์๋๋ฐ์.
yarn
์์๋ non-deterministically(๋น๊ฒฐ์ ์ )
ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด, lock ํ์ผ์ ์ ์ํ์ต๋๋ค.
์ด๋ ์ค์น ์์์ ํ๊ฒฝ, ์ฌ์ฉ์ ๊ฐ์ ๋ฐ์ํ๋ node_modules ๊ตฌ์กฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์
๋์์ผ๋ฉฐ,
์ด lock ํ์ผ ๋ด๋ถ์๋ ํจํค์ง์ ๋ฒ์ ๊ณผ ์์กด์ฑ ์ ๋ณด๊ฐ ์ ํํ๊ฒ ๊ธฐ๋ก๋ lock ํ์ผ์ ์ฌ์ฉํ์ฌ ์ค์น ๊ณผ์ ์ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ก ์ธํด ์์กด์ฑ ์ถฉ๋์ ํผํ๊ณ ์ค์น๋ฅผ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋๋ก ํ์์ต๋๋ค. (๋ฌผ๋ก npm ์ง์์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก npm @5
๋ถํฐ๋ package-lock.json
์ด ๋์
๋์์ต๋๋ค.)
์ฆ, ๋์ผํ lock ํ์ผ์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ ์๋ฒฝํ ๋์ผํ node_modules
๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ํ yarn
์์๋ ๋ค์์ ๋ฐฉ๋ฒ์ ํตํด ๋น ๋ฅธ install
์ ๊ตฌํํ๋ ค ๋
ธ๋ ฅํ์ต๋๋ค.
๋ณ๋ ฌ ์ค์น
: ํจํค์ง ๋งค๋์ ๋ ์ฌ๋ฌ ๊ฐ์ ์์กด์ฑ์ ๋์์ ์ค์นํ์ฌ ์๊ฐ์ ๋จ์ถ์ํต๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ ํจํค์ง๋ฅผ ํ ๋ฒ์ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํจ์ผ๋ก์จ ์ ์ฒด ์ค์น ๊ณผ์ ์ ๋น ๋ฅด๊ฒ ์๋ฃํ ์ ์๋๋ก ํฉ๋๋ค.
์บ์ฑ: ์ด๋ฏธ ์ค์นํ ํจํค์ง๋ ๋ก์ปฌ ์บ์์ ์ ์ฅ๋์ด ๋ค์์ ๊ฐ์ ํจํค์ง๊ฐ ํ์ํ ๋ ์ฌ๋ค์ด๋ก๋ํ์ง ์๋๋ก ํฉ๋๋ค. ์บ์ฑ์ ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ๋ฐฉ์งํ๋ฉฐ, ํจํค์ง๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ค์นํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋น๋ ์บ์ฑ: ํจํค์ง ์ค์น ์ค์ ํ์ํ ๋น๋ ๊ณผ์ ๋ ์บ์ฑํ์ฌ ์ด์ ์ ๋น๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋น๋ ๊ณผ์ ์ด ๋์ฑ ๋น ๋ฅด๊ฒ ์ด๋ค์ง ์ ์๋๋ก ํฉ๋๋ค.
๋ณด์ : yarn.lock
์ ๋จผ์ ํ์ธํ ํ, package.json
๊ณผ ๋น๊ตํ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค๋ฉด, ๋ฐ๋ก ์ข
๋ฃํฉ๋๋ค. ์ด๋ npm์์ ๋ฐ์ํ๋ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก Yarn์ ๋ค์์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
โโโ .yarn/ - 1
โ โโโ cache/ - 2
โ โโโ releases/ - 3
โ โโโ yarn-3.1.1.cjs - 4
โโโ node_modules/ - 5
โโโ .yarnrc.yml - 6
โโโ package.json - 7
โโโ yarn.lock - 8
.yarn/
: Yarn ๊ด๋ จ ์ค์ ๋ฐ ์บ์ ๋๋ ํ ๋ฆฌ๊ฐ ๋ค์ด ์๋ ํด๋์
๋๋ค.cache/
: Yarn์ด ๋ด๋ ค๋ฐ์ ํจํค์ง์ ๊ด๋ จ๋ ์บ์ ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ์
๋๋ค.releases/
: Yarn์ ๋ค์ํ ๋ฒ์ ๊ณผ ๊ด๋ จ๋ ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ์
๋๋ค.yarn-3.1.1.cjs
: Yarn ๋ฒ์ 3.1.1์ ์คํ ํ์ผ(cjs ํ์)์
๋๋ค.node_modules/
: ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ํจํค์ง์ ์ค์ ์ฝ๋๊ฐ ๋ค์ด ์๋ ๋๋ ํ ๋ฆฌ์
๋๋ค..yarnrc.yml
: Yarn์ ์ค์ ํ์ผ์ธ .yarnrc.yml ํ์ผ๋ก, ํ๋ก์ ํธ์ Yarn ๊ตฌ์ฑ ์ต์
์ ์ง์ ํ ์ ์์ต๋๋ค.package.json
: ํ๋ก์ ํธ์ ๋ฉํ ์ ๋ณด์ ์ข
์์ฑ์ ์ ์ํ๋ ํ์ผ๋ก, ํจํค์ง ๋ฒ์ ๋ฐ ์คํฌ๋ฆฝํธ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.yarn.lock
: ํจํค์ง ์์กด์ฑ์ ์ ํํ ๋ฒ์ ์ ๋ณด์ฅํ๊ธฐ ์ํ Yarn ๋ฝ ํ์ผ๋ก, ํจํค์ง ๋ฒ์ ๋ฐ ์์กด์ฑ ํธ๋ฆฌ๊ฐ ๊ณ ์ ๋์ด ์์ต๋๋ค.
์ฌ์ง์์ํ์ธํ ์ ์๋ฏ, ํด๋น ๋ ํฌ์ gnomon
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ, ๊ฐ ํจํค์ง์ ์ข
๋ฃ์์ ์ ํ์ธํ ๊ฒฐ๊ณผ npm
๋ณด๋ค yarn
์ด ๋ ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์์ ํ์ธํ์ต๋๋ค.
npm : 37์ด yarn : 26์ด ์์ธํ ์ ํ ์กฐ๊ฑด์ ํด๋น repo์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๋ฌผ๋ก npm
์์๋ ์ด๋ฐ yarn
์ ๋
ธ๋ ฅ์ ๋ค์ง์ง ์๊ณ npm @5 ๋ถํฐ๋ ๊ฑฐ์ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋๋ก ๊ตฌํ๋์์ต๋๋ค.
ํ์ง๋ง ์์ง๋ yarn
๊ณผ์ ์ ์๋ฏธํ ์๋์ ์ฑ๋ฅ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ํ yarn
์ด @2๊ฐ ์ถ์๋๊ณ , classic์ผ๋ก ๋ถ๋ฅ๋์ด ๊ฐ๋ฐ์ด ์ข
๋ฃ๋์๋ค๋ ์ ์ ์ธ์งํ ํ์๊ฐ ์์ต๋๋ค!
yarn
์ npm v3
๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ (์๋, ๋ณด์) ๋ฑ๋ฑ์ ํ๊ธฐ์ ์ผ๋ก ํด๊ฒฐํ์ต๋๋ค๋ง, ์์ง node_modules
๋ฅผ ๊ตฌํํจ์ ์์ด์ ๋ง๋ํ ์๊ฐ๊ณผ ์์์ ์ฌ์ฉํ๊ณ ์๋ค๋ ํ๊ณ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์๋ก์ด package manager
๋ค์ด ํ์์ฑ์ด ๋๋๋์์ต๋๋ค.
pnpm
์ ํจํค์ง ์์กด์ฑ ๊ด๋ฆฌ ๋๊ตฌ๋ก, npm
๊ณผ ๋น์ทํ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ง๋ง ๋
ํนํ ๋ฐฉ์์ผ๋ก ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. pnpm
์ "ํผํฌ๋จผ์ค"์ "๋์คํฌ ๊ณต๊ฐ ์ ์ฝ"์ ์ค์ํ ๊ฐ์น๋ก ๋ด์ธ์ฐ๋ฉฐ, ๋ค๋ฅธ ํจํค์ง ๋งค๋์ ๋ค๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅธ ์๋ ๋ฐฉ์์ ๊ฐ๊ณ ์์ต๋๋ค.
flat
ํ๊ฒ ์ ๋ต์ด์์๊น?phantom dependency
ํด๊ฒฐnpm @3
์ yarn
์ node_modules
๊ตฌ์กฐ๋ Flat
ํ ํํ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค. ์ด ๋น์์๋ ํ๊ธฐ์ ์ธ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. npm v2 ๊ฐ ๊ฐ์ง๋ ๊ณ ์ง์ ์ธ ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด node_modules
๊ตฌ์กฐ๊ฐ ์ด๋์ ๋ ๊ฐ์ ๋์๊ธฐ ๋๋ฌธ์ด์ฃ . ํ์ง๋ง ์์ง ์ฐ์ฌํ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๊ฐ ์กด์ฌํ์ต๋๋ค.
phantom dependency
๊ฐ ์กด์ฌํ๊ฑฐ๋, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์์ง๋ ๋ฌด๊ฒ๊ณ ๋๋ฆฐ node_modules
๋๋ฌธ์ด์์ต๋๋ค.
์ฌ๊ธฐ์ pnpm
์ ํ๊ธฐ์ ์ธ ์๊ฐ์ ํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ก npm v2
์ ๊ตฌ์กฐ๋ฅผ ๋ค์ํ๋ฒ ์ฌ์ฉํ๋ ์ ํ์ ํ ๊ฒ์ด์ฃ .
๋ค์ ์ฌ์ง์์ ๋ณผ ์ ์๋ฏ pnpm
์ ์์ฃผ ๋จ์ํ node_modules
๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ฌ๊ธฐ์ top-level
์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ ๋ชจ๋ ์ฌ๋ณผ๋ฆญ๋งํฌ๋ก .pnpm์
์คํ ์ด์ ๋จ ํ๋ฒ๋ง ์ค์น๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์๋ก๊ฐ ์๋ก๋ฅผ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ก ์ฐ๊ฒฐ๋์ด ์๊ธฐ์ pnpm
์ ํตํ node_modules
๋ npm
๊ณผ yarn
์ ๋นํด ์ง๊ด์ ์ธ ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
npm
- yarn
- pnpm
๊ฐ๊ฐ์ node_modules
์๋๋ pnpm
์ ๋ชจ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช
๋๋ฆฌ๊ธฐ ์ํด์ ์์๋ก ์์ฑํ ํด๋ ๊ตฌ์กฐ์
๋๋ค.
node_modules
โโโ .pnpm
โโโ bar@1.0.0
โ โโโ node_modules
โ โโโ bar -> <store>/bar // ๋ณธ์ธ ์ค์ค๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
โ โโโ index.js
โ โโโ package.json
โโโ foo@1.0.0
โโโ node_modules
โโโ foo -> <store>/foo
โโโ index.js
โโโ package.json
node_modules
์์ ์๋ ๋ชจ๋ ํจํค์ง์ ๋ชจ๋ ํ์ผ์ ์ฝํ
์ธ ์ฃผ์ ์ง์ ์ ์ฅ์์ ๋ํ ๋งํฌ์
๋๋ค. bar@1.0.0
์ ์์กดํ๋ foo@1.0.0
์ ์ค์นํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. pnpm์ ๋ค์๊ณผ ๊ฐ์ด ๋ ํจํค์ง๋ฅผ ๋ชจ๋ node_modules
์ ๋งํฌํฉ๋๋ค.
์ด๊ฒ์ node_modules
์ ์ ์ผํ "์ค์ " ํ์ผ์
๋๋ค. ๋ชจ๋ ํจํค์ง๊ฐ node_modules
์ ๋งํฌ๋๋ฉด, ์ค์ฒฉ๋ ์์กด์ฑ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ์ฌ๋ณผ๋ฆญ ๋งํฌ
๊ฐ ์์ฑ๋ฉ๋๋ค.
๋์น์ฑ์
จ๊ฒ ์ง๋ง ๋ ํจํค์ง ๋ชจ๋ node_modules ํด๋ ์์ ํ์ ํด๋์ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค foo@1.0.0/node_modules/foo
. ์ด๊ฒ์ ๋ค์์ ์ํด ํ์ํฉ๋๋ค:
ํจํค์ง๊ฐ ์๊ธฐ ์์ ์ ๋ํ import๋ฅผ ํ์ฉํฉ๋๋ค. foo
๋ require('foo/package.json')
๋๋ import \* as package from "foo/package.json"
๋ฅผ ํ ์ ์์ด์ผ ํฉ๋๋ค.
์ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ
๋ฅผ ํผํฉ๋๋ค. ํจํค์ง์ ์์กด์ฑ์ ์์กดํ๋ ํจํค์ง์ ๋์ผํ ํด๋์ ์์ต๋๋ค. Node.js์ ๊ฒฝ์ฐ, ์์กด์ฑ์ด ํจํค์ง์ node_modules
๋ด๋ถ์ ์๋์ง ๋๋ ์์ ๋๋ ํ ๋ฆฌ์ ๋ค๋ฅธ node_modules
์ ์ด ์๋์ง ์ฌ๋ถ๋ก ์ฐจ์ด๋ฅผ ๋์ง ์์ต๋๋ค.
์ค์น์ ๋ค์ ๋จ๊ณ๋ ์์กด์ฑ์ ์ฌ๋ณผ๋ฆญ ๋งํฌํ๋ ๊ฒ์
๋๋ค. bar
๋ foo@1.0.0/node_modules
ํด๋์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ๊ฒ๋๋ค.
node_modules
โโโ .pnpm
โโโ bar@1.0.0
โ โโโ node_modules
โ โโโ bar -> <store>/bar
โโโ foo@1.0.0
โโโ node_modules
โโโ foo -> <store>/foo
โโโ bar -> ../../bar@1.0.0/node_modules/bar
๋ค์์ผ๋ก, ์ง์ ์์กด์ฑ์ด ์ฒ๋ฆฌ๋ฉ๋๋ค. foo
๋ ๋ฃจํธ node_modules
ํด๋์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฉ๋๋ค. ๊ทธ ์ด์ ๋ foo
๊ฐ ํ๋ก์ ํธ์ ์์กด์ฑ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
node_modules
โโโ foo -> ./.pnpm/foo@1.0.0/node_modules/foo
โโโ .pnpm
โโโ bar@1.0.0
โ โโโ node_modules
โ โโโ bar -> <store>/bar
โโโ foo@1.0.0
โโโ node_modules
โโโ foo -> <store>/foo
โโโ bar -> ../../bar@1.0.0/node_modules/bar
์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ ์ด์์์ ์์กด์ฑ ์์ ์์กด์ฑ ๊ทธ๋ํ์ ๊น์ด์ ๊ด๊ณ์์ด ์ด ๊ตฌ์กฐ๋ฅผ ์ ์งํฉ๋๋ค.
bar
๋ฐ foo
์ ์์กด์ฑ์ผ๋ก qar@2.0.0
์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ก์ด ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
node_modules
โโโ foo -> ./.pnpm/foo@1.0.0/node_modules/foo
โโโ .pnpm
โโโ bar@1.0.0
โ โโโ node_modules
โ โโโ bar -> <store>/bar
โ โโโ qar -> ../../qar@2.0.0/node_modules/qar
โโโ foo@1.0.0
โ โโโ node_modules
โ โโโ foo -> <store>/foo
โ โโโ bar -> ../../bar@1.0.0/node_modules/bar
โ โโโ qar -> ../../qar@2.0.0/node_modules/qar
โโโ qar@2.0.0
โโโ node_modules
โโโ qar -> <store>/qar
๋ณด์๋ค์ํผ ๊ทธ๋ํ๊ฐ ๋ ๊น์ด์ง๋๋ผ๋ (foo > bar > qar), ํ์ผ ์์คํ ์ ๋๋ ํ ๋ฆฌ ๊น์ด๋ ์ฌ์ ํ ๋์ผํฉ๋๋ค.
์ด ๋ ์ด์์์ ์ธ๋ป ๋ณด๊ธฐ์๋ ์ด์ํด๋ณด์ผ ์ ์์ง๋ง, Node
์ ๋ชจ๋ resolution
์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋ฉ๋๋ค. ๋ชจ๋์ ํ์ธํ ๋, Node
๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ฌด์ํ๋ฏ๋ก, foo@1.0.0/node_modules/foo/index.js
์์ bar ๊ฐ ํ์ํ ๋ Node
๋ foo@1.0.0/node_modules/bar
์์ bar ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋์ , bar
๋ ์ค์ ์์น๋ก ํ์ธ๋ฉ๋๋ค(bar@1.0.0/node_modules/bar
). ๊ฒฐ๊ณผ์ ์ผ๋ก, bar
๋ bar@1.0.0/node_modules
์ ์๋ ์์กด์ฑ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋ํ pnpm
์์๋ npm
๊ณผ yarn
์์์๋ ๋ค๋ฅด๊ฒ ๋ถํ์ํ ํํค์ง๋ค์ top-level
์ ์ฌ๋ฆฌ์ง ์์ phantom dependency
๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
Yarn Berry
๋ Yarn
์ ์ต์ ๋ฒ์ ์
๋๋ค. Yarn
์ด ์๋๋ npm
์ ๋จ์ ์ ๊ทน๋ณตํ๊ณ ์ ๋ง๋ค์ด์ง ํจํค์ง ๋งค๋์ ๋ก ์์ํ๋ค๋ฉด, Berry
๋ ์ด์ ๊ทธ ์์ฒด๋ก ๊ฐ๋ ฅํ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ์
๋๋ค. ํนํ, ์ด ๋ฒ์ ์์๋ Plug'n'Play (PnP)
๋ผ๊ณ ํ๋ ์๋ก์ด ํจํค์ง ๋ก๋ฉ ๋ฉ์ปค๋์ฆ์ ๋์
ํ์ต๋๋ค. ์ด๋ฒ์๋ Yarn Berry
์ PnP์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
ํ๊ฒฝ ์ค์ : Yarn Berry
์์๋ .yarnrc.yml
ํ์์ ์ค์ ํ์ผ์ ์ฌ์ฉํ๋ฏ๋ก, ๋์ฑ ์ ์ฐํ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ ์ํคํ
์ฒ: Yarn Berry
๋ ์๋ก์ด ํ๋ฌ๊ทธ์ธ ์ํคํ
์ฒ๋ฅผ ๋์
ํด ๊ธฐ๋ฅ ํ์ฅ์ด ๋์ฑ ์ฌ์์ก์ต๋๋ค.
Yarn Berry
์ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ ํจํค์ง ๋งค๋์ ์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์์ ์ ์๋ํํ๊ฑฐ๋ ์๋ก์ด ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํ ๋,Yarn Berry
์ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ์ ๋์ ์ผ๋ก ์ธํด, ์ปค๋ฎค๋ํฐ๋ ๊ฐ๋ฐ์๋ค์ด ์ง์ Yarn Berry
์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ๊ฐ์ ํ ์ ์๋ ์ฌ์ง๊ฐ ์๊ฒผ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ถ๊ฐ ๋ช ๋ น์ด๋, ํน์ ํด๋ผ์ฐ๋ ์๋น์ค์ ์ฐ๋ํ๋ ๊ธฐ๋ฅ ๋ฑ์ ํ๋ฌ๊ทธ์ธ ํํ๋ก ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด,Yarn Berry
๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ํ์ ์์ ๋ค์ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๋ง์ถคํ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๊ฒ ๋์ด, ํ๋ก์ ํธ์ ํจ์จ์ฑ๊ณผ ์์ฐ์ฑ์ด ํฅ์๋ฉ๋๋ค. ํ ์ค yarn plugin repo ์์๋ workspace๋ฅผ ๊ด๋ฆฌํ๋ ํ๋ฌ๊ทธ์ธ์ ์ง์ ๊ฐ๋ฐํด ์ฌ์ฉ์ค์ ๋๋ค.
PnP (Plug'n'Play)
: Yarn Berry
์์ ๊ฐ์ฅ ํฐ ๋ณํ๋ PnP ํจํค์ง ๊ด๋ฆฌ
๋ฉ์ปค๋์ฆ์ ๋์
์
๋๋ค. ์ด๋ก ์ธํด node_modules
๋๋ ํฐ๋ฆฌ์ ํ์์ฑ์ด ์ฌ๋ผ์ง๊ณ , ๋์คํฌ ๊ณต๊ฐ๊ณผ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. yarn berry pnp ์ค๋ช
Zero-Installs
: Yarn Berry
๋ Zero-Installs
๊ธฐ๋ฅ์ ํตํด ๋ ํฌ์งํ ๋ฆฌ์ ์ค์น๋ ํจํค์ง๋ฅผ ์บ์ฑ, ์ด๋ฅผ ํตํด ๋ณ๋์ ์ค์น ๊ณผ์ ์์ด ๋ฐ๋ก
์ฌ์ฉํ ์ ์์ต๋๋ค.
Yarn Berry
์ Plug'n'Play (PnP)
๋ ์ด๋ฆ ๊ทธ๋๋ก "ํ๋ฌ๊ทธ ์ค ํ๋ ์ด"๋ฅผ ์๋ฏธํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ฌ๊ทธ ์ค ํ๋ ์ด ๊ธฐ์ ์ ํ๋์จ์ด๋ฅผ ์ปดํจํฐ์ ์ฐ๊ฒฐํ๋ฉด ์๋์ผ๋ก ์ธ์๋์ด ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์๋ฏธํ๋๋ฐ, Yarn
์ PnP
์์๋ ์ด์ ์ ์ฌํ ๊ฐ๋
์ ์ฐจ์ฉํ๊ณ ์์ต๋๋ค. ํจํค์ง๋ฅผ "ํ๋ฌ๊ทธ"ํด๋์ผ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ ์ค์ ์ด๋ ์ถ๊ฐ ์์
์์ด๋ ์์กด์ฑ์ ํด๊ฒฐํฉ๋๋ค.
ํ ์ค ๊ธฐ์ ๋ธ๋ก๊ทธ์์ ์ฒ๋ผ .pnp.cjs
์์ react๋ฅผ ์ฐพ์๋ณด์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด react
์ ๋ํ ์์ธํ ์ ๋ณด๊ฐ ๋ณด์ด๋ฉฐ, .yarn
์ ์ด๋ ์์น์ cache
ํํ๋ก ์ ์ฅ๋์ด์๋์ง ์์ฃผ ์ฝ๊ฒํ์ธ ํ ์ ์์์ต๋๋ค. ์๋๋ pnp
์ ์์ธํ ์๋ ์๋ฆฌ๋ฅผ ํํํฉ๋๋ค.
.pnp.js
ํ์ผ: Yarn
์ .pnp.js
ํ์ผ์ ์์ฑํ์ฌ ํ๋ก์ ํธ ๋ด์ ๋ชจ๋ ํจํค์ง์ ๊ทธ ํจํค์ง๋ค์ ์์กด์ฑ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ผ์ข
์ "๋งต"์ด๋ฉฐ, Node.js
๊ฐ ์ด ํ์ผ์ ํตํด ํจํค์ง๋ฅผ ์ด๋ป๊ฒ ๋ก๋ํ ์ง ์๊ฒ ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ ์ค ํ๋ ์ด ๋ก๋: Yarn
์ ์์ฒด์ ์ธ ๋ก๋๋ฅผ ํตํด ํจํค์ง๋ฅผ ๋ก๋ํฉ๋๋ค. ์ด๋ก ์ธํด node_modules
ํด๋๊ฐ ํ์ ์์ด์ง๋ฉฐ, ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋จ์ํ๋ฉ๋๋ค.
Virtual File System (VFS)
: ์ค์ ํ์ผ์ด ๋์คํฌ์ ์ ์ฅ๋์ง ์๊ณ ๋, .pnp.js
ํ์ผ์ ํตํด ๊ฐ์์ ํ์ผ ์์คํ
์ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๊ฐ์์ ํ์ผ ์์คํ
์ ์ค์ ํ์ผ ์์คํ
์ฒ๋ผ ๋์ํ์ง๋ง, ๋์คํฌ ๊ณต๊ฐ์ ์ฐจ์งํ์ง ์์ต๋๋ค.
์ ํต์ ์ธ(yarn) node_modules
ํด๋ ๊ตฌ์กฐ
my_project/
โโโ node_modules/
โ โโโ lodash/
โ โโโ express/
โ โโโ ...
โโโ package.json
โโโ package-lock.json
Yarn PnP
ํด๋ ๊ตฌ์กฐ
my_project/
โโโ .pnp.js (๋๋ .pnp.cjs)
โโโ .yarn/
โ โโโ cache/
โ โโโ ...
โโโ package.json
โโโ .yarnrc.yml
โโโ yarn.lock
์๋ npm
์ ๋น๋กฏํ ๋ค๋ฅธ node
ํํค์ง์์ ๋น๊ตํ๋ ํด๋๊ตฌ์กฐ๋ฅผ ์ ์ด๋ณด์์ต๋๋ค.
์ค์น ์๊ฐ: ๊ธฐ์กด์ Yarn
์ด๋ npm
์์๋ node_modules
ํด๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์ฌ๋ฌ ๊ฐ์ ์์ ํ์ผ์ ๋ค๋ฃจ๊ฒ ๋๋ฏ๋ก ์ค์น ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ PnP
๋ .pnp.js
ํ๋๋ก ๋ชจ๋ ๊ฒ์ ๊ด๋ฆฌํ๋ฏ๋ก ์ค์น ์๊ฐ์ด ๋ํญ ์ค์ด๋ญ๋๋ค.
๋์คํฌ ๊ณต๊ฐ: node_modules
๋ฐฉ์์ ๋์ผํ ํจํค์ง๋ฅผ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๋ณ๋๋ก ์ค์นํด์ผ ํ๋ฏ๋ก ๋์คํฌ ๊ณต๊ฐ์ ๋ง์ด ์ฐจ์งํฉ๋๋ค. PnP๋ ํจํค์ง๋ฅผ ์ค์ํ๋ ์บ์์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
Yarn Berry
์ "Zero-Installs" ๊ธฐ๋ฅ์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, ์์กด์ฑ ์ค์น ์์ด ํ๋ก์ ํธ๋ฅผ ๋ฐ๋ก ์์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ธฐ๋ฅ์ ํฌ๊ฒ ๋ ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
Yarn
์ .yarn/cache
๋๋ ํ ๋ฆฌ์ ์์กด์ฑ ํจํค์ง๋ฅผ ์บ์ํฉ๋๋ค..pnp.js
ํ์ผ: Yarn Berry
์ PnP (Plug'n'Play)
๊ธฐ๋ฅ์ ํตํด ์์ฑ๋ .pnp.js
ํ์ผ์ด ํ๋ก์ ํธ์ ํฌํจ๋ฉ๋๋ค. ์ด ํ์ผ์ ์์กด์ฑ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ด์, Node.js
๊ฐ ํจํค์ง๋ฅผ ์ด๋ป๊ฒ ๋ก๋ํ ์ง ์ ์ ์์ต๋๋ค..yarn/cache
๋๋ ํ ๋ฆฌ์ .pnp.js
ํ์ผ์ Git
๊ฐ์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์ ํฌํจ์ํต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ CI/CD
ํ๊ฒฝ์์๋ yarn install
์ ์คํํ ํ์๊ฐ ์์ต๋๋ค.ํ์ง๋ง ์ด๋ค ๋ฉ์ง ๊ฐ๋ฐ์ ๋ถ๊ป์๋ ์ผ๋ฐ์ ์ธ npmํ๊ฒฝ์์๋ node_modules๋ฅผ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์ ํฌํจ ํ์ฌ zero-install
์ ์ํํ๋ ค ํ๋๋ฐ, ํฅ๋ฏธ๋ก์ด ์ ๊ทผ๋ฒ์ด๋ผ ์ถ๊ฐํด๋ด
๋๋ค. node_modules๋ git์์๋ ๊ด๋ฆฌํ๋ฉด ์ด๋จ๊น?
yarn berry
์ ์ ์ฉํ ๊ธฐ๋ฅ ์ค ํ๋๋ patch
๋ฅผ ์ด์ฉํ ๋ค์ํ ๊ธฐ๋ฅ์
๋๋ค. ๋ค์์ ์ง๋ฐฉ๊ธฐ์ ๋ธ๋ก๊ทธ ์์ yarn patch
๋ฅผ ์ด์ฉํ์ฌ ์คํจํ ํ
์คํธ ์ฝ๋์ ๋ํด์ ์ค๋ฅ๋ฅผ ์ ํ์ธํ๊ธฐ ์ํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
[Yarn berry] Yarn Berry ํ๊ฒฝ์ ๋ํ ์ดํด๋ ๋์ด๊ธฐ yarn-berry
์ ํ๊ฒฝ์ ๋ํด์ ๊น๊ฒ ์ค์ตํด๋ณด์ ๋ถ์ ๊ธ์
๋๋ค. ์ ๊ฐ ํ์ธํด๋ณด์ง ์์, ์ ํ๋๋ฅผ ํ๋จํ๊ธด ํ๋๋. ์ด ๊ธ์ ์ฐธ๊ณ ๋ก ํ์ตํด๋ณด์๋ฉฐ ์ด ๊ธ์ ๊ฒ์ฆํด๋ณด๋๊ฒ์ ์ด๋จ๊น ์ถ์ด์ ์ถ๊ฐํด ๋ณด์์ต๋๋ค.
์ ์ด์ ๋๋ง์ ๋ง์ง๋ง ๋จ๋ฝ์ ๋๋ฌํ๊ฒ ๋์์ต๋๋ค. ์ฌ์ค ์ด ๋ชจ๋ ๊ณต๋ถ๋ ์ด ํ๋ฒ์ ์ค์ต์ ์ํจ์ด์์ต๋๋ค
๊ผญ ๋์ผ๋ก ํ์ธํด๋ณด๊ณ ์ถ์๊ฑฐ๋ ์! '
pnpm benchmark์์ pnpm
์ ์ฑ๋ฅ์ ๋ํ ์งํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ณตํํ์ต๋๋ค.
๋ฌผ๋ก pnpm
์ ๊ณต์ ํ์ด์ง์์ ๊ณต๊ฐํ ๋งํผ pnpm์ ๋ค์ ์น์ฐ์ณ์ง ๊ฒฐ๊ณผ๊ฐ ๋์์์ง ๋ชจ๋ฅธ๋ค๋ ํจ๋ฆฌ์ ์ธ ์์ฌ์ด ๋ค๊ธด ํ์ง๋ง ๋ณดํธ์ ์ผ๋ก, npm๊ณผ yarn
์ด pnpm
๊ณผ yarn berry
์ ๋นํด ๋ฎ์ ์ฑ๋ฅ์ ๋ณด์ด๋๊ฒ์ผ๋ก ํ์ธํ ์ ์์์ต๋๋ค.
๋ค์์ ์ค์ ์ค์ต ๊ฒฐ๊ณผ๋ฌผ ์
๋๋ค. ๋ชจ๋ pm์ด ๋์ผํ dependency
๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ, ์์ธํ ์ค์ ์ ๋ํด์ ๊ถ๊ธํ์๋ค๋ฉด [repo]
(https://github.com/adultlee/study-package-manager)์ ๋ฐฉ๋ฌธํด์ฃผ์ธ์! ํน์ ์ด์๋ก ์์ ์ฌํญ์ ๋ง์ํด์ฃผ์ ๋ค๋ฉด ์ ๊ทน ๋ฐ์ํ๊ฒ ์ต๋๋ค!
๋ค์์ node_modules์ lock ํ์ผ ๋ชจ๋ ์ ๊ฑฐํ ๊ฒฝ์ฐ ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ์๋์ง๋ง ์ด๊ธฐ ์๋ฌด๋ฐ ์ ํ ์ด ์๋ ๊ฒฝ์ฐ ์๋
๋ค์์ node_modules๋ง ์ ๊ฑฐํ, ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์๋ง ์ฌ๋ผ๊ฐ ํ์ผ๋ก๋ง ํํค์ง๋ฅผ ์ฌ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ์ ๋๋ค.
์ ๊ฐ ์์์ ๋ดค๋๋ฐ๋ก... ์ญ์๋ ์๋์ ์ธ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ ์ค์์ ๊ธฐ์ ํ๋ฐ๋ก ๋ง์ด์ฃ ... ๋ฐ์ ์ด ์๊ธฐ๋ฅผ ๋ฐ๋ฌ์ง๋ง ์์ฝ๊ฒ๋ ์ด๋ฒ์ ์๋์์ต๋๋ค! (์ฌ๊ธฐ์ ์ฌ์ค ์๋์ ์ธ ์ฑ๋ฅ์ด ์ผ์ด๋ ๊น๋ญ์, yarn-berry๋ ์ฌ์ค์ node_modules๋ฅผ ์์ถํด์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ธ๋ฐ์. ์ผ๋ฐ์ ์ธ node ํ๋ก์ ํธ์ node_modules๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์์ ๊ด๋ฆฌํ๋ค๋ฉด "์๋"๋ ๋น์ทํ ์ ์์ต๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ ๊ด๋ฆฌ์ ๊ท๋ชจ์์ ์ข์ ํ๊ฐ๋ฅผ ๋ฐ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.)
์ ๊ฐ ์๊ฐํ๋๊ฒ ๋งํผ pnpm
์ ๋ฒค์น๋งํฌ์์ ์ ์ํ ์ฑ๋ฅ์ด ๊ทธ๋๋ก ์คํ๋์ง๋ ์์์ต๋๋ค.
์คํ๋ ค node_modules
๋ง ์ ๊ฑฐํ ์ํ์์ package-lock.json
์ฆ lock
ํ์ผ๋ง ๊ฐ์ง๊ณ ๊ตฌ์ฑํจ์ ์์ด์๋ ์ผ๋ถ ์ํ์ ์์ด์๋ pnpm
์ด ๋ถ๋ถ์ ์ผ๋ก ๋ ๋๋ฆฌ๊ธฐ๊น์ง ํ์ต๋๋ค.
ํ์ง๋ง ๊ทธ ๋ฐ์๋ ์ด๋์ ๋ ์์ํ ์งํ๋ฅผ ๊ฐ์ง๊ณ ๊ตฌํ์ด ๋์์ผ๋ฉฐ, ์ค์ ๋ก pm
๋ณ๋ก ๊ตฌ์ฑ๋๋ node_modules
๋ฅผ ๋น๋กฏํ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ๊ตฌ์กฐ์ ๋ํด์ ๊น๊ฒ ํ์ตํ๊ฒ ๋์์ต๋๋ค.
์์ฝ์ง๋ง, ์ฐ์ ์ฌ๊ธฐ์ ๊ธ์ ๋ฉ์ถ๊ณ ์ ๊ฐ ๋์น๊ฒ๋ค์(ํ๊ฒฝ์ ์๋ฒฝํ๊ฒ ํต์ ํด ๋ณ์ธ์ ๋ชจ๋ ํ์ธ) ๋ฐ๊ฒฌํ๊ธฐ ์ํ ๊ณต๋ถ๋ฅผ ๋ ๋๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ค์ ๋์ ์๋ ๊ธ์ด๊ธด ํ์ง๋ง ๋๊ตฐ๊ฐ ํ๋ช ์ด๋ผ๋ ์ฆ๊ฒ๊ฒ ์ฝ์ด์ฃผ์ ๋ค๋ฉด, ์ด ๋ํ ์๋ฏธ์์ผ๋ฆฌ๋ผ ์๊ฐํฉ๋๋ค! ๋ชจ๋๋ค ์ฆ๊ฑฐ์ด ํ๋ฃจ๋์๊ธธ๐