Pegjs: ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„

์— ๋งŒ๋“  2018๋…„ 03์›” 16์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

0.11 ์ดํ›„(๊ทธ๋Ÿฌ๋‚˜ 0.12 ์ด์ „) ์ €๋Š” Yarn ์ž‘์—… ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๋‹จ์ผ ์ €์žฅ์†Œ๋กœ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  pegjs ๋ชจ๋“ˆ์„ ๋Œ€๋ถ€๋ถ„ @pegjs ์— ์žˆ๋Š” ๋…๋ฆฝ ๋ชจ๋“ˆ๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค( @peg ์˜ ๊ณต์‹ ๋ฌธ๋ฒ• ํฌํ•จ ).

์•„๋ž˜๋Š” ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ชจ๋“ˆ ๋ชฉ๋ก์ด์ง€๋งŒ 0.12๊ฐ€ ๋ฆด๋ฆฌ์Šค๋˜๊ธฐ ์ „์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ

  • PEG.js์—์„œ ์‚ฌ์šฉํ•˜๋Š” ECMAScript์˜ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ์œ„ํ•œ @pegjs/lib ๋ž˜ํผ
  • @pegjs/util PEG.js ํŒจํ‚ค์ง€์—์„œ ๊ณต์œ ๋˜๋Š” ๊ณตํ†ต ์ฝ”๋“œ
  • @pegjs/harness PEG.js ๋ฐ ์œ ์‚ฌํ•œ ๋„๊ตฌ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋ชจ๋“ˆ ์„ธํŠธ
  • @pegjs/AST ๋ฐ ์‚ฌ์–‘์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค์˜ ๋””์ž์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • @pegjs/config ๋Š” PEG.js์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • @pegjs/language ast ํด๋ž˜์Šค, opcode, ๊ธฐ๋ณธ ์ฝ”๋“œ ์ž‘์„ฑ๊ธฐ ๋ฐ ์˜ค๋ฅ˜ ํด๋ž˜์Šค
  • @pegjs/parser PEG.js ๋ฌธ๋ฒ• ํŒŒ์„œ
  • @pegjs/bytecode ๋ฉ”์†Œ๋“œ๋Š” PEG.js ๋ฐ”์ดํŠธ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • @pegjs/runtime ์ƒ์„ฑ๋œ ํŒŒ์„œ์˜ ๋Ÿฐํƒ€์ž„
  • @pegjs/linter ๋ฌธ๋ฒ• ์†Œ์Šค ๋˜๋Š” ast๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํŒจ์Šค
  • @pegjs/javascript PEG.js ์ปดํŒŒ์ผ๋Ÿฌ์šฉ ES5/ES20x ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ
  • @pegjs/compiler ๋Š” ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ๋ฆฐํ„ฐ์™€ ๋” ๋งŽ์€ ํŒจ์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • @pegjs/core ๋ฉ”์ธ API ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • @pegjs/cli https://en.wikipedia.org/wiki/Command-line_interface
  • @pegjs/repl https://en.wikipedia.org/wiki/Read โ€“evalโ€“print_loop
  • @pegjs/run #522

์ธํ„ฐํŽ˜์ด์Šค

  • pegjs ์ตœ์‹  ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค(์˜ˆ: 0.12.x )๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” Node.js์šฉ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฆด๋ฆฌ์Šค
  • @pegjs/browser ๋ธŒ๋ผ์šฐ์ € ๋ฆด๋ฆฌ์Šค(ํ˜„์žฌ๋Š” ํ•˜์œ„ ํŒจํ‚ค์ง€)
  • @pegjs/x ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์Œ, ๋‹จ์ผ ํŒจ์Šค, ์ตœ์†Œ ์˜ต์…˜ ๋ฐ ์†๋„ ์ „์šฉ ๋ณ€ํ˜•(#348์—์„œ ์˜๊ฐ)
  • @pegjs/e ๋Š” ๋ฌธ๋ฒ•๊ณผ API ๋ชจ๋‘์— ์‹คํ—˜์  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๊ณต์šฉ ํ…Œ์ŠคํŠธ๋ฒ ๋“œ).
feature task

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@StoneCypher ๋ง์˜ ๋™๋ฃŒ๋ฅผ ์žก์•„๋ผ ๐Ÿ˜† Yarn์€ NPM์˜ ๋Œ€์•ˆ์ผ ๋ฟ์ด๋ฏ€๋กœ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž๋Š” NPM, Yarn ๋˜๋Š” ํŒ์—…๋˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์—… ๊ณต๊ฐ„์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค . ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์˜ root package.json( "private": true ) , ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ํ•˜์œ„ ๋ชจ๋“ˆ์€ NPM์— ๊ฒŒ์‹œ๋œ ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆ๋กœ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‚˜ ๋˜๋Š” ๊ฐœ๋ฐœ ๋ฐ/๋˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. PEG.js ์ปดํŒŒ์ผ๋Ÿฌ ํ•ดํ‚น.

๋˜ํ•œ Rollup๊ณผ Babel์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ Yarn์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • Yarn ์€ ์ž‘์—… ๊ณต๊ฐ„์„ ์ง€์›ํ•˜๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค.
  • Rollup ์€ Browserify์™€ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ์ด๋ฉฐ ๋ง‰ ๋‹ค๋ฅธ ์ฝ”๋“œ๋งŒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • Babel ์€ ES2018+์—์„œ ES*๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ณ€ํ™˜๊ธฐ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž๊ฐ€ ์›์‚ฌ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š” ํšŒ์‚ฌ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ ๋นŒ๋“œ ์ธํ”„๋ผ์—์„œ ์ธํ„ฐ๋„ท์˜ ์ฃผ์š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ‹ˆ์ƒˆ ์‹คํ—˜์ ์ธ ๋นŒ๋“œ ์ „๋žต์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์‹ค์ด ์ฃฝ์–ด๊ฐ€๊ณ  ์ž‘์—… ๊ณต๊ฐ„์ด ์ œ๋Œ€๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋…ธ๋“œ ์‚ฌ์šฉ์ž๋Š” ์›์‚ฌ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://stackoverflow.com/questions/46947557/do-yarn-workspaces-work-with-npm-too

๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋„๊ตฌ๋ฅผ Facebook์˜ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜์ ์ธ ์ตœ์‹  ๋นŒ๋“œ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋กค์—…๊ณผ babel(๋˜๋Š” ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ์„ค์ •)์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ผ๋ฐ˜ ES5๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ typescript ๋ฐ flowtype ์ง€์›, es6 ๋ชจ๋“ˆ ์ง€์› ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ •๋ง ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@StoneCypher ๋ง์˜ ๋™๋ฃŒ๋ฅผ ์žก์•„๋ผ ๐Ÿ˜† Yarn์€ NPM์˜ ๋Œ€์•ˆ์ผ ๋ฟ์ด๋ฏ€๋กœ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์ž๋Š” NPM, Yarn ๋˜๋Š” ํŒ์—…๋˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์—… ๊ณต๊ฐ„์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค . ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์˜ root package.json( "private": true ) , ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ํ•˜์œ„ ๋ชจ๋“ˆ์€ NPM์— ๊ฒŒ์‹œ๋œ ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆ๋กœ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‚˜ ๋˜๋Š” ๊ฐœ๋ฐœ ๋ฐ/๋˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. PEG.js ์ปดํŒŒ์ผ๋Ÿฌ ํ•ดํ‚น.

๋˜ํ•œ Rollup๊ณผ Babel์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ Yarn์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • Yarn ์€ ์ž‘์—… ๊ณต๊ฐ„์„ ์ง€์›ํ•˜๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค.
  • Rollup ์€ Browserify์™€ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ์ด๋ฉฐ ๋ง‰ ๋‹ค๋ฅธ ์ฝ”๋“œ๋งŒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • Babel ์€ ES2018+์—์„œ ES*๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ณ€ํ™˜๊ธฐ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚˜๋ฅผ ์›์‚ฌ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ํ•œ

๊ทธ๋ž˜์„œ, ๋‹น์‹ ์€ ๋‚˜๋ฅผ ์›์‚ฌ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. yarn ์ด ์ฃฝ์–ด๊ฐ€๊ณ  ์žˆ๊ณ  Windows์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋‚ฎ์€ ํ’ˆ์งˆ์˜ ๋„๊ตฌ ๋•Œ๋ฌธ์— ๋ณ‘ํ•ฉ์„ ๊ฑฐ๋ถ€ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์—ฌ๋Ÿฌ PR์ด ์ด๋ฅผ ๋‹ค์‹œ ๋นผ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

yarn ์€(๋Š”) ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

yarn ๋Š” ์ƒ๋‹นํ•œ ์žฅ๋ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹น์‹ ์„ ๋•๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚˜๋Š” ๋ถ„ํ•ดํ•˜๊ธฐ ์ „์— ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ž‘์—… ์ •์ฑ… ๋•Œ๋ฌธ์— ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

npm ์˜ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. yarn ์ด(๊ฐ€) ์œ ์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. yarn ํ–‰๋™์€ ์ด์ œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Œ€์™€ ํฌ๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

monorepo๋Š” ๋˜ํ•œ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , ๋ณต์žกํ•œ ์ถ”๊ฐ€ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทœ๋ฒ”์„ ๋ฌด์‹œํ•˜๊ณ , ์ž ์žฌ์  ๊ธฐ์—ฌ์ž๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ๋‹น์‹ ์ด ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ ์ž‘์—…๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ด์˜ ์ œ๊ธฐ์˜ ์„ฑ๊ฒฉ์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ํ•˜์…จ์„ ๊ฒƒ ๊ฐ™์•„์š”.

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋‚ญ๋น„๋œ ์ž‘์—…์ž…๋‹ˆ๋‹ค(์ง€๋‚œ ๋‹ฌ๋ถ€ํ„ฐ ํ˜„์žฌ "๋‹น์‹ ์˜ ์ทจ๋ฏธ ํ”„๋กœ์ ํŠธ"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์„ ๋ง ๊ทธ๋Œ€๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ ์ „๋ฉด์ ์œผ๋กœ ๋Œ€์ฒดํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋นŒ๋“œ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ณ  npm ์—๋Š” ์žˆ์ง€๋งŒ yarn ์—๋Š” ์—†๋Š” ์ƒˆ ๋„๊ตฌ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

Yarn์€ 2018๋…„์— ์ฃฝ์–ด๊ฐ€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ 2020๋…„์ž…๋‹ˆ๋‹ค. Yarn์€ ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๋…„ ๋™์•ˆ ๋‚ด ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ์„ค์น˜ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋งค์šฐ ์ค‘์š”ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ˆ˜์ •์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ์—†์ด 3๋…„ ๋™์•ˆ ์ง„ํ–‰๋˜๋Š” ํ”„๋ฆฐ์ง€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋Œ€์‹  ์ •์ƒ์ ์ธ ๊ฑด๊ฐ•ํ•œ ๊ฐœ๋ฐœ ํŒจํ„ด์„ ๊ฐ€์ง„ ์ผ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ํ—ˆ์šฉํ•˜์‹ญ์‹œ์˜ค.

์˜ˆ, yarn ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ yarn ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋‚ด๊ฐ€ 2๋…„ ์ „์— ๋งŒ๋“ค์ง€ ๋ง๋ผ๊ณ  ์š”์ฒญํ–ˆ๋˜ ๋ฐ”๋กœ ๊ทธ ์ƒˆ๋กœ์šด ๊ธฐ๋ฐ˜ ์‹œ์„ค์„ ๋งŒ๋“ค์—ˆ๊ณ , ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•œ ๋ฐ”๋กœ ๊ทธ ์ด์œ ๋กœ ๊ทธ๊ฒƒ์„ ํ˜„์žฌ ๋ฒ„๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰