ํจํค์ง ๋งค๋์ ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ ๋จผ์ ํจํค์ง๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ์์๋ณด์
ํจํค์ง๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ์ด๋ค. ์ฆ ์ด๋ค ๊ธฐ๋ฅ์ ์์ฃผ ์ฌ์ฉํ๊ฑฐ๋, ์ง์ ๊ตฌํํ๊ธฐ ๋ฒ๊ฑฐ๋ก์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๋ถ๋ฌ๋ค ์ธ ์ ์๋๋ก ๋ฐฐํฌ๋ ๋ชจ์์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ํจํค์ง ๋งค๋์ ๋ ๋ง ๊ทธ๋๋ก "ํจํค์ง"๋ฅผ ๊ด๋ฆฌํ๋ ๋๊ตฌ์ธ ๊ฒ์ด๋ค. ์ค๋ช ์ ๋ง๋ถ์ด์๋ฉด ์ํํธ์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋๊ตฌ์ด๋ค. ํจํค์ง ๋งค๋์ ๋ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ค์นํ๋ ๊ณผ์ ์์ ์์กด์ฑ(dependency)์ ๊ด๋ฆฌํด ํ๋ก์ ํธ์ ํจ์จ์ฑ์ ๋์ฌ์ฃผ๋ ๋๊ตฌ์ด๋ค.
์ด๋ ค์ด ๋ด์ฉ์ ์๋์ง๋ง ์ฝ๋๋ก ๊ฐ๋จํ ํ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ง์ ๊ตฌํํ ์์
const removeDuplicates = (arr) => {
return arr.filter((item, index) => arr.indexOf(item) === index);
}
const numbers = [1, 2, 2, 3, 4, 4, 5];
console.log(removeDuplicates(numbers)); // [1, 2, 3, 4, 5];
ํจํค์ง(lodash)๋ฅผ ํ์ฉํ ์์
const _ = require('lodash');
const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = _.uniq(numbers);
console.log(uniqueNumbers); // [1, 2, 3, 4, 5];
package.json
{
name: "project",
version: "1.0.0",
"dependencies": {
"lodash": "^x.y.z"
}
}
โ์์กด์ฑ(dependency) ๐ก ์ํํธ์จ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ฑ๋ ์ 3์ ์ํํธ์จ์ด
์ ๋ฆฌํ์๋ฉด ํจํค์ง ๋งค๋์ ๋ ํ๋ก์ ํธ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋๊ตฌ์ด๋ค.
์ด์ ํจํค์ง ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง ์์์ผ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ ์ง ์์๋ณผ ์ฐจ๋ก์ด๋ค.
์ด ๋ถ๋ถ์ ๋ํ ์ค๋ช ์ ํ ์ค์์ ์์ฑํ ๊ธ๊ณผ yarn ๊ณต์ ๋ฌธ์, ๊ทธ๋ฆฌ๊ณ GPT๋ฅผ ์ฐธ๊ณ ํ๋ค.
Resolution ๋จ๊ณ๋ ํ ๋ง๋๋ก ์ ์ํ๋ฉด 'ํ์ํ ๋ฒ์ ์ ๊ฒฐ์ (๊ณ ์ ) (resolve dependencies)' ํ๋ ๋จ๊ณ์ด๋ค.
ํจํค์ง ๋งค๋์ ๋ ์ด ๋จ๊ณ์์ package.json
๋๋ lock
ํ์ผ์ ์ฐธ๊ณ ํด ํ์ํ ํจํค์ง ๋ฒ์ ์ ๊ฒฐ์ ํ๋ค.
Resolution์ ๊ฒฐ๊ณผ๋ก '๊ฒฐ์ ๋ ๋ฒ์ ์ ํจํค์ง๋ฅผ ์ค์ ๋ก ๋ค์ด๋ก๋' ํ๋ ๋จ๊ณ์ด๋ค. ์ด ๊ณผ์ ์์ ํ์ํ ํจํค์ง๋ฅผ ์บ์์ ์ ์ฅํ๋ค.
๋ค์ด๋ก๋ํ ํจํค์ง๋ฅผ ํ๋ก์ ํธ์ node_modules์ ๋ฐฐ์นํ๊ณ , ๊ฐ ํจํค์ง์ ์์กด์ฑ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐธ์กฐํ ์ ์๋๋ก ์ฌ๋ณผ๋ฆญ ๋งํฌ ๋ฑ์ ์ค์ ํ๋ค. ์ฆ, 'Resolution/Fetch ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ค ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๋จ๊ณ' ์ด๋ค.
์ด ๊ธ์ ์ฐ๊ฒ ๋ ๊ฐ์ฅ ์ค์ํ ๋ชฉ์ ์ด๋ค. ๊ฐ ํจํค์ง ๋งค๋์ ๊ฐ ์ด๋ค ๋ชฉ์ ์ ๊ฐ์ง๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฅ์ ๊ณผ ๋จ์ ์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํ๋ค.
npm(Node Package Manager)๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ Node.js ์ํ๊ณ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํจํค์ง ๋งค๋์ ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์ด ํจํค์ง๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋๋ก 2009๋ ์ ๋ฑ์ฅํ๋ค.
JS ์ํ๊ณ์์ ๊ฐ์ฅ ๋จผ์ ๋ฑ์ฅํ ํจํค์ง ๋งค๋์ ์ธ๋งํผ, ์๋ง์ ํจํค์ง๊ฐ ๊ณต์ ๋๊ณ ์์ผ๋ฉฐ ๋๊ตฌ๋ ์ฝ๊ฒ ๊ณต์ ํ๊ณ ๋ค์ด๋ก๋ํ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ํน์ง์ด์ ์ฅ์ ์ด๋ค.
๊ทธ๋ฌ๋ npm์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค์ด ๊ณ ์ง์ ์ผ๋ก ๊ฒช๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ๋ฐ๋ก ์์กด์ฑ์ ์ค์นํ๋ ๊ณผ์ ์ด๋ค.
npm์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ์์กด์ฑ์ ์ค์นํ ๋ ๋ชจ๋ ์์กด์ฑ์ node_modules ๋๋ ํ ๋ฆฌ ํ์์ ์ ์ฅํ๋๋ฐ, ์์กด์ฑ์ ์์กด์ฑ๊น์ง ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฒ์ ์ ํ์ฉํด ๋ชจ๋ ํ์ ์์กด์ฑ ํธ๋ฆฌ๋ฅผ ์ค๋ณต์ผ๋ก ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ๋ณต์กํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ฉด ํจํค์ง๋ฅผ ์ฐพ๊ธฐ ์ํด node_modules๋ฅผ ๊ณ์ ํ๊ณ ์ฌ๋ผ๊ฐ๊ฒ ๋ผ์ ์๋์ ์ฉ๋ ์ธก๋ฉด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉฐ, ๋ค๋ฅธ ๋ฒ์ ์ ๋์ผํ ํจํค์ง๊ฐ ์ค๋ณต์ผ๋ก ์ค์น๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
(Engineering at Meta - Yarn: A new package manager for JavaScript)
์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ๊ฐ ์ฑ์ฅํ๊ณ ๊ฐ ๋น์ฆ๋์ค๋ง๋ค ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ ์ ๋น๋ํด์ง์ ๋ฐ๋ผ ์ผ๊ด์ฑ, ๋ณด์, ์ฑ๋ฅ ์ธก๋ฉด์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด 2016๋ Facebook์ ์ฃผ์ถ์ผ๋ก ๊ฐ๋ฐ๋ yarn์ด ๋ฑ์ฅํ๋ค.
yarn์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ๋ค.
yarn์ ๋ณ๋ ฌ ๋ค์ด๋ก๋์ Fetching ๋จ๊ณ์์ ์บ์ฑ์ ํตํด ๋ณด๋ค ๋น ๋ฅด๊ฒ ํจํค์ง๋ฅผ ์ค์นํ ์ ์๋๋ก ํ๋ค. ๋ํ yarn์ yarn.lock ํ์ผ์ ํตํด ๋ชจ๋ ์์กด์ฑ์ ์ ํํ ๋ฒ์ ์ ๊ณ ์ ํ์ฌ ํจํค์ง์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค.
yarn.lock
ํ์ผ์ด ์กด์ฌํ๊ณ package.json์ ๋ช
์๋ ๋ชจ๋ ์์กด์ฑ์ ๋ง์กฑํ๋ค๋ฉด, yarn.lock
์ ๋ช
์๋ ๋ฒ์ ๊ทธ๋๋ก ์ค์น๋๊ณ yarn.lock
ํ์ผ์ ๋ณํ์ง ์๋๋ค.yarn.lock
ํ์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋ package.json์ ๋ช
์๋ ์์กด์ฑ์ ๋ง์กฑํ์ง ์๋๋ค๋ฉด, package.json์ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์๋ ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ์ฐพ์ ์ค์นํ๊ณ ์ด๋ฅผ yarn.lock
ํ์ผ์ ์ ์ฅํ๋ค.๋ํ yarn์ flatํ node_modules ๊ตฌ์กฐ๋ฅผ ์ฑํํด node_modules ์ค์ฒฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. flatํ node_modules ๊ตฌ์กฐ๋, yarn์ node_modules ํด๋์ ๊ฐ ํจํค์ง๋ฅผ ์ต์์ ์์ค์ flatํ๊ฒ ์ค์นํด ํ์ ํจํค์ง์ ๋ํด ์ค๋ณต ์ค์น๋ฅผ ํผํ๊ณ ๋จ์ผ ๋ฒ์ ๋ง ๋ฐฐ์นํ๋ ๋ฐฉ์์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ํจํค์ง๊ฐ ๋์ผํ ๋ฒ์ ์ lodash๋ฅผ ์์กด์ฑ์ผ๋ก ๊ฐ์ง๋ค๋ฉด, node_modules/lodash์ ํ ๋ฒ๋ง ์ค์นํ๊ณ ๋ชจ๋ ํจํค์ง๊ฐ ์ด ์์น์ lodash๋ฅผ ์ฐธ์กฐํ๋๋ก ์ฒ๋ฆฌํ๋ค.
pnpm ๊ณต์ ๋ฌธ์ - ๋๊ธฐ pnpm์ ๋์คํฌ ๊ณต๊ฐ ํจ์จ์ฑ๊ณผ ํจํค์ง ์ค์น ์๋๋ฅผ ๋์ด๊ธฐ ์ํด 2017๋ ์ ์ถ์๋์๋ค.
pnpm์ ๋ชจ๋ ์์กด์ฑ์ ์ ์ญ์ ์ผ๋ก ๋จ์ผ ์์น์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ํ๋ ๋งํฌ๋ก ์ฐธ์กฐํด ์ถ๊ฐ์ ์ธ ๋์คํฌ ๊ณต๊ฐ์ ์๋นํ์ง ์๋๋ค.
ํ๋ ๋งํฌ ๋ฐฉ์ ๋๋ถ์ pnpm์ ์ฉ๋๊ณผ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์์กด์ฑ์ ํ๋๋ง ์ค์นํ๊ณ , ํด๋น ์์น์ ๋ฐ๋ก ์ ๊ทผํ๊ณ !
๋ํ pnpm์ symlink๋ฅผ ์ฌ์ฉํด ํ๋ก์ ํธ์ ํ์ํ ์์กด์ฑ์ ์๋ก ์ฐธ์กฐํ๋๋ก ํ๋ค. ํน์ ํจํค์ง์ ๋ชจ๋ ์์กด์ฑ๋ค์ node_modules/.pnpm/
๋ด์ ์ ์ ํ ๋๋ ํ ๋ฆฌ์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ ๋๋๋ก ํ๋ค.
(๋ ์์ธํ ๋ด์ฉ์ pnpm ๊ณต์ ๋ฌธ์ - ํํํ node_modules๊ฐ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ๋ฅผ ์ฝ๊ณ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค)
PnP๋ yarn์ ์ต์ ๋ฒ์ ์ธ yarn berry์์ ๋ฑ์ฅํ ์ ๋ต์ด๋ค. (์ฃผ์ํด์ผ ํ ์ ์, PnP๋ ํจํค์ง ๋งค๋์ ๊ฐ ์๋ ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฐฉ์์ด๋ค.)
PnP๋ node_modules ์์ด (!) ์์กด์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํน์ง์ด๋ค.
PnP๋ ์์กด์ฑ์ .pnp.cjs
ํ์ผ์ ๊ธฐ๋กํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์์์ ํจํค์ง๋ฅผ ์ง์ ๋ก๋ํด ๋ ๋น ๋ฅธ ํจํค์ง ์ค์น๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.์ด ๊ณผ์ ์์ ๋ชจ๋ ์์กด์ฑ์ ๋ฒ์ ์ ๋จ์ผ ํ์ผ์์ ์ง์ ํจ์ผ๋ก์จ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ๋ ์๊ฒฉํ๊ฒ ๊ด๋ฆฌํ๋ค.
// pnp.cjs
["my-service", /* ... */ [{
// ./my-service์์...
"packageLocation": "./my-service/",
"packageDependencies": [
// React๋ฅผ import ํ๋ฉด 18.2.0 ๋ฒ์ ์ ์ ๊ณตํ๋ผ.
["react", "npm:18.2.0"]
]
]
์์ ๊ฐ์ด ํจํค์ง์ ๋ฒ์ ์ ๋ช ์ํด node_modules๋ฅผ ์ฌ์ฉํ์ง ์์์ผ๋ก์จ Link ๋จ๊ณ์ ์๋๋ฅผ ๋์ฑ ์ฌ๋ ธ๋ค.
์ด๋ ๊ฒ ํจํค์ง ๋งค๋์ ๊ฐ ๋ฌด์์ธ์ง์ ๊ฐ ํจํค์ง ๋งค๋์ ๊ฐ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง, ๋์๊ฐ PnP์ ๋ํด์๋ ๊ฐ๋จํ๊ฒ ๋ค๋ค๋ดค๋ค. ๊ธ์ ์ฐ๋ฉฐ ๋๋ ์ ์, ๊ฒฐ๊ตญ ๊ณต๋ถ๋ฅผ ํจ์ ์์ด ๊ฐ์ฅ ์ค์ํ ์ ์ ํด๋น ๊ธฐ์ ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๊ฐ์ ์ง์คํ๋ฉด ํด๋น ๊ธฐ์ ์ ๋ํ ์ดํด๊ฐ ๋ ๋น ๋ฅด๊ฒ ๋๋ค๋ ์ ์ด๋ค. ์ด ๊ธฐ์ ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ๋๋ ์ด ๊ธฐ์ ์ ํ์ฉํด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ๋ฅผ ํ ๋ฒ ๋ ๊ณ ๋ฏผํ๊ณ ์๊ฐํ๋ฉด ๋ ๋์ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ ๊ฒ ๊ฐ์, ์ด๋ ต์ง๋ง ๋งค์ฐ ๋ฟ๋ฏํ ๊ณต๋ถ์๋ค!