์žฌ๋ฐŒ๊ฒŒ ํ•ฉ์‹œ๋‹ค

๊ธฐ๋กํ•˜๊ธฐ, ๊ฐ€์‹œํ™”ํ•˜๊ธฐ

React

๋ชจ๋“ˆํ™”์˜ ๊ฐœ๋…๋ถ€ํ„ฐ Yarn Berry๊นŒ์ง€

์€๋˜๋”” 2022. 10. 10. 12:25
๋””ํ”„๋งŒ์—์„œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. Yarn Berry์˜ ํŠน์ง•์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ๋ชจ๋“ˆํ™”์™€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๊ฐœ๋…๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์งš์–ด๋ณด์•˜๋‹ค. 

๐Ÿ—‚ ๋ชจ๋“ˆํ™”์˜ ํ•„์š”์„ฑ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด๋„ ๋ชจ๋‘ ๊ฐ™์€ ์ „์—ญ ์Šค์ฝ”ํ”„ ์œ„์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆํ™”๋ฅผ ์œ„ํ•ด์„ , ES6 ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค. script ํƒœ๊ทธ์— module ํƒ€์ž…์„ ์„ค์ •ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“ˆ๋กœ ๋กœ๋“œํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„์— ํฌํ•จ๋œ๋‹ค. ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„ ๋‚ด์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๋ณ„๋„์˜ ๋…๋ฆฝ๋œ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์™ธ๋ถ€์—์„œ๋Š” exportํ•œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ES6์—์„œ๋Š” named export ๋ผ๋Š” ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • export ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜, ๋ณ€์ˆ˜, ํด๋ž˜์Šค๋ฅผ ๊ฐœ๋ณ„๋กœ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • default export ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ import ์‹œ์— ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ๋˜ํ•œ ES6 ๋ชจ๋“ˆ์€ ๋™์  import, export๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ์‹คํ–‰์‹œ์ ์— import/exportํ•  ๋Œ€์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

export ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

// lib.js
export const sayHello = () => {
	console.log('hi');
}

// index.js
import {sayHello} from './lib';

sayHello();

export default ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

// lib.js
export default const sayHello = () => {
	console.log('hi');
}

// index.js
import sayHello from './lib';

sayHello();

๐Ÿ’๐Ÿป‍โ™‚๏ธ npm๊ณผ package.json

๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

๋งŒ์•ฝ scriptํƒœ๊ทธ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์„ ๋กœ๋“œํ•œ๋‹ค๋ฉด, ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์˜์กด์„ฑ์— ๋งž๊ฒŒ ์ผ์ผ์ด ๋‚˜์—ดํ•ด์•ผ ํ•˜๊ณ  ๊ฐ ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „์„ ์•Œ๋งž๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด npm์ด ๋“ฑ์žฅํ–ˆ๋‹ค! npm์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ package.json์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

package.json

ํŒจํ‚ค์ง€์— ๊ด€๋ จ๋œ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํŒŒ์ผ์ด๋‹ค. ๊ฐ€๋ น CRA๋กœ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ package.json์€ ํ•ด๋‹น React App์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ์•ฑ์˜ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค๋„ ๋‹ด๊ณ  ์žˆ๋‹ค.

 

์‹ค์ œ๋กœ CRA ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๊ฐ€์žฅ ์ƒ์œ„ ํด๋”์— package.json ํŒŒ์ผ์ด ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ node_modules ๋‚ด์˜ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์—๋„ ๊ฐ๊ฐ package.json ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

npm install ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด package.json์— ๋ช…์‹œ๋œ ๋ชจ๋“  ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์ด node_modules ํด๋”์— ์„ค์น˜๋œ๋‹ค. ์ฐธ๊ณ ๋กœ node_modules๋Š” ํ•ญ์ƒ .gitignore์— ํฌํ•จ๋˜๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ํด๋”์˜ ํฌ๊ธฐ๊ฐ€ ๊ฑฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํฌ๊ธฐ๊ฐ€ ํฐ node_modules๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  package.json ํŒŒ์ผ์„ ์ฐธ์กฐํ•ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

npm์˜ ๋ฌธ์ œ์ 

  • ๋น„ํšจ์œจ์ ์ธ ์˜์กด์„ฑ ํƒ์ƒ‰ ๋ฐฉ์‹
    node_modules๋ฅผ ์‚ฌ์šฉํ•˜๋Š” npm์€, ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์ƒ์œ„ ํด๋”์˜ node_modules๋ฅผ ๊ณ„์†ํ•ด์„œ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ํƒ์ƒ‰ ๋ฐฉ์‹์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋˜ํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๋Š” I/O ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ํŒจํ‚ค์ง€ ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ ์ธํ•œ ์œ ๋ น ์˜์กด์„ฑ(phantom dependency) ๋ฌธ์ œ

๐Ÿซ Yarn Berry

Plug’n’Play

Yarn Berry์˜ Plug’n’Play ์ „๋žต์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

Yarn Berry๋Š” node_modules ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  .yarn/cache , .pnp.cjs ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • .pnp.cjs : ๊ฐ ํŒจํ‚ค์ง€์˜ ์˜์กด์„ฑ ์ •๋ณด์™€, ๊ฐ ์˜์กด์„ฑ์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ธ node_modules ํƒ์ƒ‰ ์—†์ด ์›ํ•˜๋Š” ์˜์กด์„ฑ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • .yarn/cache : ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์ด zip ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์••์ถ• ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_moduls์— ๋น„ํ•ด ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค.

๋˜ํ•œ PnP๋Š” ํŒจํ‚ค์ง€ ํ˜ธ์ด์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, npm๊ณผ ๊ธฐ์กด yarn์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์œ ๋ น ์˜์กด์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

Zero-Install

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ node_modules๋Š” ํฌ๊ธฐ๊ฐ€ ์ปค ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ cloneํ•ด ์•ฑ์„ ์ฒซ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ npm install ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜๋กœ ๋ณ€๊ฒฝ ์‹œ์—๋„ ์žŠ์ง€ ์•Š๊ณ  npm install ์„ ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค. ๋ฐ˜๋ฉด yarn berry๋Š” ์˜์กด์„ฑ์„ zip ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค. ๋”ฐ๋ผ์„œ ์˜์กด์„ฑ๋“ค์„ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ ๊ด€๋ฆฌํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. Zero-Install ๊ธฐ๋Šฅ์€ ๋ฐ”๋กœ ์ด ์ ์„ ํ™œ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด Zero-Install์ด๋ž€, Yarn Berry์—์„œ ์˜์กด์„ฑ์„ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ์˜์กด์„ฑ๋“ค์ด github๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(github์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—), git clone์œผ๋กœ ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ–ˆ์„ ๋•Œ ์˜์กด์„ฑ๋“ค์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. (์ด๋ฅผ ํ†ตํ•ด CI์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด ์ ์€ ์•„์ง CI๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์—†์–ด์„œ ์™€๋‹ฟ์ง€๋Š” ์•Š๋Š”๋‹ค.)

 

yarn berry ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ahmatda ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ์‹ค์ œ๋กœ ์˜์กด์„ฑ zip ํŒŒ์ผ๋“ค์ด ์—…๋กœ๋“œ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ์— ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด pnpm๊ณผ yarn berry์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ๋„ ์ •๋ฆฌ ํ•ด๋ด์•ผ๊ฒ ๋‹ค. ๋ฐฉ๊ธˆ ๊ฐ„๋‹จํžˆ ์ฐพ์•„๋ณธ ๋ฐ”๋กœ๋Š”, pnpm์—์„œ๋„ PnP ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค(!)

References

https://ui.toast.com/fe-guide/ko_DEPENDENCY-MANAGE

 

์˜์กด์„ฑ ๊ด€๋ฆฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์„œ๋ฒ„ ํ†ต์‹  ์—†์ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์ดˆ๊ธฐ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ, ํ˜„์žฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ค‘์š”ํ•œ ์›น ๊ธฐ์ˆ 

ui.toast.com

https://toss.tech/article/node-modules-and-yarn-berry

 

node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry

ํ† ์Šค ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋Œ€๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € Yarn Berry. ์ฑ„ํƒํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ๊ณผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ข‹์•˜๋˜ ์ ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

toss.tech