๋ฐ”๋ฒจ 7 ์ถœ์‹œ


์›๋ฌธ : https://babeljs.io/blog/2018/08/27/7.0.0

2๋…„์— ๊ฐ€๊นŒ์šด ์‹œ๊ฐ„ ๋™์•ˆ 4k์˜ ์ปค๋ฐ‹, 50ํšŒ ์ด์ƒ์˜ ํ”„๋ฆฌ ๋ฆด๋ฆฌ์ฆˆ, ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๋„์›€์— ํž˜์ž…์–ด ๋ฐ”๋ฒจ 7 ์ •์‹ ์ถœ์‹œ๋ฅผ ๋ฐœํ‘œํ•˜๊ฒŒ ๋˜์–ด ํฅ๋ถ„๋œ๋‹ค. ์ด๋ฒˆ ์ถœ์‹œ๋Š” ๋ฐ”๋ฒจ 6 ์ดํ›„ ๊ฑฐ์˜ 3๋…„ย ๋งŒ์ด๋‹ค! ๋งŽ์€ ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์ถœ์‹œ ์ฒซ ์ฃผ์—๋Š” ์šฐ๋ฆฌ์˜ ์‚ฌ์ดํŠธ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ๋ฐ”๋ฒจ 7์—์„œ๋Š” ๋” ๋นจ๋ผ์กŒ๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ ๋„๊ตฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ ์„ค์ •, "overrides" ์„ค์ • ์˜ต์…˜, ์šฉ๋Ÿ‰/์••์ถ•์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์˜ต์…˜, JSX ํ”„๋ ˆ๊ทธ๋จผํŠธ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ์ƒˆ๋กœ์šด ์ œ์•ˆ ๋“ฑ ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค!

๋ฐ”๋ฒจ์—๊ฒŒ ๊ณ ๋งˆ์›€์„ ๋Š๋‚€๋‹ค๋ฉด, Open Collective์—์„œ ๋ฐ”๋ฒจ์„ ํ›„์›ํ•˜๊ฑฐ๋‚˜ Patreon์—์„œ ๋‚˜๋ฅผ ์ง€์›ํ•ด๋‹ฌ๋ผ. ๋˜๋Š” ๋‹น์‹  ๋˜๋Š” ๋‹น์‹ ์˜ ํšŒ์‚ฌ๊ฐ€ ๋ฐ”๋ฒจ๊ณผ ๊ด€๋ จ๋œ ์ผ์„ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ณต๋™ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด ๊ฐ์‚ฌํ•˜๋‹ค!

๋“œ๋””์–ด ์ถœ์‹œ๋˜์—ˆ๋‹ค! ๐ŸŽ‰

์ ˆ๋Œ€ ์™„๋ฒฝํ•  ์ˆ˜๋Š” ์—†๊ฒ ์ง€๋งŒ ์ด์ œ๋Š” ๋‚ด๋ณด๋‚ผ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค! @babel/core๋Š” Next.js 6, vue-cli 3.0, React Native 0.56๊ณผย ๊ฐ™์€ ๋„๊ตฌ ์‚ฌ์šฉ ๋ฐ ์›Œ๋“œํ”„๋ ˆ์Šค ํ”„๋ก ํŠธ์—”๋“œ ๋•๋ถ„์— ์ด๋ฏธ ์›”๊ฐ„ 510๋งŒ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋‹ฌ์„ฑํ•˜์˜€๋‹ค๐Ÿ™‚!

๋ฐ”๋ฒจ์˜ ์—ญํ• 

์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ณ„์—์„œ์˜ ๋ฐ”๋ฒจ์˜ ์—ญํ• ์„ ๋‹ค์‹œ ์†Œ๊ฐœํ•˜๋Š” ๊ฒƒ์œผ๋กœ์จ ์ด๋ฒˆ ๊ธ€์„ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ตœ์ดˆ์˜ ๋ฌธ์ œ๋Š” ์„œ๋ฒ„ ์–ธ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ, ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด์„œ ๊ฐ™์€ ์ง€์›์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์—์„œ ์‹œ์ž‘๋˜์—ˆ๋‹ค. (ํŠนํžˆ ์ธํ„ฐ๋„ท์ต์Šคํ”Œ๋กœ๋Ÿฌ ๊ตฌ ๋ฒ„์ „์— ํ•ด๋‹น) ๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ(์˜ˆ: class A {})์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋“ค์€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ SyntaxError ๋•Œ๋ฌธ์— ๋นˆ ํ™”๋ฉด์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

๋ฐ”๋ฒจ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ณ€ํ™˜์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฉ์•ˆ์„ ์ œ์‹œํ–ˆ๋‹ค. (class A {}๋ฅผ var A = function A() {}๋กœ ๋ณ€ํ™˜)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋ฒจ์€ TC39(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์˜ ์ŠคํŽ™์„ ์ •ํ•˜๋Š” ์กฐ์ง)๋ฅผ ๋•๋Š” ๋‹ค๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค.

๋ฐ”๋ฒจ์€ ์˜ค๋Š˜๋‚  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์—์„œ ํ•„์ˆ˜์ด๋‹ค. ํ˜„์žฌ ๊นƒํ—™์—์„œ๋Š” 130๋งŒ ๊ฐœ ์ด์ƒ์˜ ๋””ํŽœ๋˜์‹œ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, npm์—์„œ ์›”๊ฐ„ 1700๋งŒ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋‹ฌ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ(๋ฆฌ์•กํŠธ, ๋ทฐ, ์— ๋ฒ„, ํด๋ฆฌ๋จธ)์™€ ํšŒ์‚ฌ(ํŽ˜์ด์Šค๋ถ, ๋„ทํ”Œ๋ฆญ์Šค, ์—์–ด๋น„์•ค๋น„)๋ฅผ ํฌํ•จํ•ด ์ˆ˜๋ฐฑ ๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฐ”๋ฒจ์€ ๋งŽ์€ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉ๋ฒ•์„ ๋ชจ๋ฅด๋ฉด ์•ˆ๋˜๋Š”, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ† ๋Œ€๊ฐ€ ๋˜์—ˆ๋‹ค. ๋ฐ”๋ฒจ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋””ํŽœ๋˜์‹œ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.

๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค์€ ์‚ฌ๋žŒ์ด๋‹ค.

๋ฐ”๋ฒจ์€ ์–ธ์–ด์˜ ๋ฏธ๋ž˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒํƒœ๊ณ„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋ฐ”๋ฒจ์€ ๋ช‡ ๋ช…์˜ ์ž์›๋ด‰์‚ฌ์ž๋“ค์ด ์ด๋„๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ค‘์‹ฌ์˜ ํ”„๋กœ์ ํŠธ์— ๋ถˆ๊ณผํ•˜๋‹ค.

์ž‘๋…„์— ์ฒ˜์Œ์œผ๋กœ ํŒ€์—์„œ ๋ช‡ ๋ช…์ด ๋งŒ๋‚  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํŠธ์œ„ํ„ฐ

์ด ๊ธ€์„ ํ†ตํ•ด์„œ, ์ด ํ”„๋กœ์ ํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๋‚˜๋Š” 6.0 ๋ฒ„์ „ ์ถœ์‹œ ๋ช‡ ๋‹ฌ ์ „์— ํ•ฉ๋ฅ˜ํ–ˆ๋Š”๋ฐ, ๋‹น์‹œ ๋ฐ”๋ฒจ์€ ๋…ผ์Ÿ๊ฑฐ๋ฆฌ์˜€๋‹ค. ์กฐ์ง ๋Œ€๋ถ€๋ถ„์€ ๋ฒˆ์•„์›ƒ๋œ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค(๋ฐ”๋ฒจ ์ฐฝ์‹œ์ž์ธ Sebastian์„ ํฌํ•จํ•ด)์ด ์ด๋Œ๊ณ  ์žˆ์—ˆ๊ณ , ๋‚จ์•„์žˆ๋Š” ๋ช‡ ๋ช… ์กฐ์ฐจ๋„ ๋ฐ”๋ฒจ์— ๋Œ€ํ•œ ์• ์ •์ด ์—†๋Š” ์ƒํƒœ์˜€๋‹ค.

๋งŽ์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์šฐ๋ฆฌ์˜ ์—ญํ• ์— ๋Œ€ํ•ด์„œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋™์ž‘ ๋ฐฉ์‹์ด๋‚˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต์‹์ ์ธ ๊ต์œก์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค. ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„, ๋‚˜๋Š” ์ผ๋ถ€๋Ÿฌ ๋Œ€ํ•™์—์„œ ์ปดํ“จํ„ฐ ๊ณตํ•™์„ ์ „๊ณตํ•˜์ง€ ์•Š์•˜์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ˆ˜์—…์€ ์žฌ๋ฏธ์—†๊ณ  ์–ด๋ ต๊ฒŒ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋Œ€์‹  ๋‚˜๋Š” ํˆด๋ง, ๋ฆฐํ„ฐ, ๋ฐ”๋ฒจ ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ธ์–ด์— ๋” ๋Œ๋ ธ๋‹ค.

๋‚˜๋Š” ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ณ , ๊ทธ ์˜คํ”ˆ ์†Œ์Šค๋“ค์„ ์ง€์›ํ•ด ์ฃผ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. (๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์‹œ๊ฐ„๊ณผ ๊ธˆ์ „์  ์ง€์›์„ ํ†ตํ•ด์„œ ๋ง์ด๋‹ค)

๋งŽ์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค์€ ๊ทธ๋“ค์ด ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ๊ทผ๋ณธ์ ์œผ๋กœ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ๋‹ค. ๋จผ์ € ์ผ์„ ์‹œ์ž‘ํ•œ ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งŽ์€ ๊ฒƒ์„ ์„ฑ์ทจํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋˜๋ฉด ๋‹น์‹ ์€ ํ˜ธ๊ธฐ์‹ฌ๊ณผ ๊ฒธ์†์„ ๊ฒธ๋น„ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋‚˜์˜ ๋ฐ”๋žŒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋‘ย "์ผ"์„ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ”„๋กœ์ ํŠธ์˜ ๋น„์ „์— ๋Œ€ํ•œ ํฌ๋ง์ด๋‹ค.

๋ฐ”๋ฒจ์€ ํŽ˜์ด์Šค๋ถ๊ณผ ๊ฐ™์€ ์ฃผ์š” ํšŒ์‚ฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ํŒ€์ด๋‚˜ ํšŒ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์†Œ์ˆ˜์˜ ์ž์›๋ด‰์‚ฌ์ž๋งŒ์ด ๋ฐ”๋ฒจ์—์„œ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” ์ง์žฅ์„ ๊ทธ๋งŒ๋‘๊ณ  ์˜คํ”ˆ ์†Œ์Šค์—์„œ ํ’€ํƒ€์ž„์œผ๋กœ ์ผ์„ ํ•œ ์ง€ ๋ถˆ๊ณผ ๋ช‡ ๋‹ฌ๋ฐ–์— ๋˜์ง€ ์•Š์•˜๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ด "์ทจ๋ฏธ" ์™ธ์—๋„ ๊ฐ์ž์˜ ์‚ถ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผํ•˜๋Š” ๋ฐฉ์‹์˜ ํ† ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹คํ•จ๊ป˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ์•„๋‹ˆ๋ฉด ๊ทธ ํ† ๋Œ€๊ฐ€ ์„œ์„œํžˆ ๋ฌด๋„ˆ์ง€๋„๋ก ๋‚ด๋ฒ„๋ ค๋‘๋Š” ๊ฒƒ์€ ์•„๋‹Œ๊ฐ€? ์–ด๋–ป๊ฒŒ ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์–ด๋Š ์„ ๊นŒ์ง€ ๋ฐ›์•„๋“ค์ผ ๊ฒƒ์ธ๊ฐ€? ๋‹ค๋ฅธ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค์˜ ๊ฒฝํ—˜์œผ๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๋ถ„๋ช…ํžˆ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ง€๋ฐฐํ–ˆ์ง€๋งŒ, ๊ทธ ๋’ค์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค(๋ฉ”์ธํ…Œ์ด๋„ˆ๋“ค)์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ ๋„ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ๊ฑด๊ฐ•ํ•œ ์ƒํƒœ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ?

#BabelSponsorsEverything

ํŠธ์œ„ํ„ฐ

์˜คํ”ˆ ์†Œ์Šค์˜ ์ง€์† ๊ฐ€๋Šฅ์„ฑ์€ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ˆ ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋‚ด๋ฏธ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ๋žŒ๊ณผ ํšŒ์‚ฌ์— ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์น˜๋ฅผ ๋งํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ, ๊ธฐ๊บผ์ด ๊ทธ ์ผ์— ์ฐธ์—ฌํ•˜๋Š” ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์˜ ๊ฐ€์น˜๋ฅผ ์•Œ์•„๋ณด๋Š” ์ผ์€ ์–ด๋ ต๋‹ค.

์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ชจ๋‘ ํ†ตํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ์ง€๊ธˆ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ๋ณด๋Ÿฌ ๊ฐ€์ž!

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ์— ์ •๋ฆฌํ•ด ๋‘์—ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์€ ์ƒˆ๋กœ์šด babel-upgrade ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ๊ณ  ์•ž์œผ๋กœ๋„ ๊ณ„์† ์ถ”๊ฐ€๋  ์˜ˆ์ •์ด๋‹ค.

  • ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋…ธ๋“œ ๋ฒ„์ „(0.10, 0.12, 4, 5)์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•œ๋‹ค. (์ฐธ์กฐ)
  • "scoped" ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด @babel ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. (์ฐธ์กฐ) ์ด๊ฒƒ์€ ๊ณต์‹ ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ, babel-core๋Š” @babel/core๊ฐ€ ๋œ๋‹ค.
  • preset-es2015์™€ ๊ฐ™์€ ์—ฐ๋„๋ณ„ ํ”„๋ฆฌ์…‹ ์ผ๋ถ€๋ฅผ ์ œ๊ฑฐํ•˜์˜€๋‹ค. (์ฐธ์กฐ). @babel/preset-env๋Š” ๋ชจ๋“  ์—ฐ๋„๋ณ„ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๊ณผ ํŠน์ • ๋ธŒ๋ผ์šฐ์ €๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์–ด ๊ธฐ์กด ํ”„๋ฆฌ์…‹์„ ๋Œ€์ฒดํ•œ๋‹ค.
  • ๋˜ํ•œ @babel/preset-stage-0์™€ ๊ฐ™์€ "Stage" ํ”„๋ฆฌ์…‹์„ ์ œ๊ฑฐํ•˜๊ณ , ๊ฐœ๋ณ„ ์ œ์•ˆ์„ ๋ช…์‹œํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. ๋น„์Šทํ•œ ์ด์œ ๋กœ ๊ธฐ๋ณธ์ ์ธ @babel/polyfill์˜ ์ œ์•ˆ๋„ ์ œ๊ฑฐํ•œ๋‹ค. (์ฐธ์กฐ) ์ด ๋‚ด์šฉ์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์ „์ฒด ๊ธ€์„ ์ฝ์–ด๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.
  • ๋ช‡๋ช‡ ํŒจํ‚ค์ง€๋“ค์˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ๋‹ค. TC39 ์ œ์•ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ -transform ๋Œ€์‹ ์— -proposal๋กœ ๋ฐ”๋€๋‹ค. (์ฐธ์กฐ) ๊ทธ๋ž˜์„œ @babel/plugin-transform-class-propertie๋Š” @babel/plugin-proposal-class-propertie๊ฐ€ ๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋œ ํŒจํ‚ค์ง€(user-facing packages)๋ฅผ ์œ„ํ•œ @babel/core์˜ peerDependency๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. (์˜ˆ: babel-loader, @babel/cli ๋“ฑ) (์ฐธ์กฐ)

babel-upgrade

babel-upgrade๋Š” package.json์™€ .babelrc ํ™˜๊ฒฝ ์„ค์ •์— ์žˆ๋Š” ๋””ํŽœ๋˜์‹œ๋“ค์„ ํ˜„์žฌ ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋„๊ตฌ์ด๋‹ค.

npx babel-upgrade ์ปค๋ฉ˜๋“œ๋กœ git ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ(ํ”„๋กœ์ ํŠธ ํด๋”)์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋˜๋Š” npm i babel-upgrade -g ๋กœ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ ค ํ•œ๋‹ค๋ฉด, --install๋ฟ๋งŒ ์•„๋‹ˆ๋ผ --write๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

npx babel-upgrade --write --install

๋ฐ”๋ฒจ 7์˜ ๋ชจ๋“  ๋ณ€ํ™”์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ์ด์Šˆ๋ฅผ ๋ฆฌํฌํŒ…ํ•˜๊ฑฐ๋‚˜ PR์„ ๋‚ ๋ ค์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค! ์•ž์œผ๋กœ์˜ ์†Œ๋ง์€ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์— ๋Œ€ํ•ด ์ด ๋™์ผํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ PR ํ”„๋กœ์ ํŠธ ๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ค์ • ํŒŒ์ผ๋“ค

babel.config.js๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค. ์ด๊ฒƒ์€ .babelrc๋ฅผ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ํ•„์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹ˆ๋‚˜, ์–ด๋–ค ๊ฒฝ์šฐ ์— ๊ต‰์žฅํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

*.js ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ๋“ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ๊ฝค ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ESLint์™€ ์›นํŒฉ์€ ๊ฐ๊ฐ .eslintrc.js, webpack.config.js ํ™˜๊ฒฝ์„ค์ • ํŒŒ์ผ๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜๋Š” "production" ํ™˜๊ฒฝ์—์„œ๋งŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ปดํŒŒ์ผํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค. (.babelrc ํŒŒ์ผ์—์„œ "env" ์˜ต์…˜์„ ์ด๋ฏธ ์„ค์ •ํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค)

var env = process.env.NODE_ENV;
module.exports = {
  plugins: [
    env === "production" && "babel-plugin-that-is-cool"
  ].filter(Boolean)
};

babel.config.js์€ .babelrc๊ณผ ๋‹ค๋ฅธ ์„ค์ • ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฐ”๋ฒจ์ด ์„ค์ • ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๊ฐ ํŒŒ์ผ์„ ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์›๋ž˜ ํŒŒ์ผ๊ณผ ์„ค์ • ํŒŒ์ผ์„ ๋น„๊ตํ•œ๋‹ค. ์ด๋Š” ์•„๋ž˜ ์†Œ๊ฐœ๋  overrides ์˜ต์…˜ ์‚ฌ์šฉ์— ์ข‹๋‹ค.

overrides๋กœ ์„ ํƒ์  ์„ค์ •ํ•˜๊ธฐ

์ตœ๊ทผ ES2015+ ํŒจํ‚ค์ง€ ๋ฐฐํฌ์™€ ์‚ฌ์šฉ/์ปดํŒŒ์ผ๋ง์— ๋Œ€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฐ”๋ฒจ ์„ค์ • overrides ๊ฐ’ ๋Œ€ํ•œ ์„น์…˜์„ ๋ณด๋ฉด, overrides๋Š” ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

module.exports = {
  presets: [
    // defeault config...
  ],
  overrides: [{
    test: ["./node_modules"],
    presets: [
      // config for node_modules
    ],
  }, {
    test: ["./tests"],
    presets: [
      // config for tests
    ],
  }]
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ…Œ์ŠคํŠธ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ, ์„œ๋ฒ„ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํŽธ์ง‘ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋”๋งˆ๋‹ค .babelrc ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์†๋„ ๐ŸŽ

๋ฐ”๋ฒจ์€ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋œ ๋“ ๋‹ค! v8 ํŒ€์—์„œ ์š”์ฒญํ•œ ํŒจ์น˜๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๋‹ค๋ฅธ ํ›Œ๋ฅญํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋„๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์›น ๋„๊ตฌ ๋ฒค์น˜๋งˆํฌ์˜ ์ผ๋ถ€๊ฐ€ ๋œ ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค.

์•„์›ƒํ’‹ ์˜ต์…˜

๋ฐ”๋ฒจ์€ ํ˜„์žฌ ํ”„๋ฆฌ์…‹๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ต์…˜์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ๋ฐฐ์—ด์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ์‹ธ๊ณ  ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "plugins": [
-   "pluginA",
+   ["pluginA", {
+     // options here
+   }],
  ]
}

์ผ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ loose ์˜ต์…˜์„ ์กฐ๊ธˆ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค! ์ด ์˜ต์…˜๋“ค์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋น„๊ทœ๊ฒฉ ์ค€์ˆ˜ ๋™์ž‘(noe-spec compliant behavior)์„ ์„ ํƒํ•˜๊ณ  ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ์„ ๋Œ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜ต์…˜๋“ค์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค.

  • ํด๋ž˜์Šค์—์„œ, ์ด์ œ๋Š” class A {}๊ฐ€ classCallCheck ํ—ฌํผ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
class A {}
var A = function A() {
-  _classCallCheck(this, A);
};
  • for-of ๋ฃจํ”„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์ด ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ์— ์ƒˆ๋กœ์šด ์˜ต์…˜ ["transform-for-of", { "assumeArray": true }]์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
let elm;
for (elm of array) {
  console.log(elm);
}
let elm;

for (let _i = 0, _array = array; _i < _array.length; _i++) {
  elm = _array[_i];
  console.log(elm);
}
  • preset-env์„ ์œ„ํ•ด loose ๋ชจ๋“œ์—์„œ transform-typeof-symbol ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ์™ธํ–ˆ๋‹ค. #6831

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด๋Ÿฌํ•œ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•˜์œผ๋ฏ€๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘์€ ๋ฐ”๋ฒจ์„ ๋„๊ฑฐ๋‚˜ preset-env๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๊ทœ๊ฒฉ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด๋‚˜ ์ ์€ ์šฉ๋Ÿ‰์˜ ์•„์›ƒํ’‹์„ ํ•„์š”๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค(๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค). ์šฐ๋ฆฌ๋Š” ์ด ์ผ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋” ๋‚˜์€ ๋ฌธ์„œ์™€ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

"Pure" ์ฃผ์„ ์ง€์›

#6209 ์ดํ›„์—, ํŠธ๋žœ์ŠคํŒŒ์ผ ๋œ ES6 ํด๋ž˜์Šค๋“ค์€ /*#__PURE__*/ ์ฃผ์„์ด ๋‹ฌ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ์ฃผ์„์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด Uglify์™€ babel-minify์™€ ๊ฐ™์€ ๋ฏธ๋‹ˆํŒŒ์ด์–ด์—๊ฒŒ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ์ฃผ์„์€ ๋‹ค๋ฅธ ํ—ฌํผ ํ•จ์ˆ˜์—๋„ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

class C {
  m() {}
}
var C =
/*#__PURE__*/
function () {
  // ...
}();

๋ฏธ๋‹ˆํŒŒ์ด์–ด ํžŒํŠธ์™€ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค!

๊ตฌ๋ฌธ(Syntax)

TC39 ์ œ์•ˆ ์ง€์›

์Šคํ…Œ์ด์ง€ ํ”„๋ฆฌ์…‹์„ ์ œ๊ฑฐํ•˜๊ณ , ์Šคํ…Œ์ด์ง€ 4 ๋ฏธ๋งŒ์˜ ์ œ์•ˆ์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ช…์‹œํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ ์ •์ฑ…์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์šฐ๋ ค๋˜๋Š” ์ ์€, ์‚ฌ๋žŒ๋“ค์ด ์ด๋“ค ๋ฌธ๋ฒ•์ด ์•ž์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฑฐ๋ผ๋Š” ์ฐฉ๊ฐ์„ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹๊นŒ ํ•˜๋Š” ์ ์ด๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋Š” ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ฉฐ, ํŠนํžˆ ์Šคํ…Œ์ด์ง€ 0 ๋˜๋Š” 1์˜ ๊ฒฝ์šฐ ์•ž์œผ๋กœ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋”์šฑ ๋†’๋‹ค. ์ด ๊ธ€์—์„œ ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

์—ฌ๊ธฐ ๋ฐ”๋ฒจ์ด ์ง€์›ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ชฉ๋ก์ด ์žˆ์œผ๋ฉฐ(์ด ๊ธฐ๋Šฅ๋“ค์€ ์ถ”๊ฐ€, ์‚ญ์ œ, ์ค‘์ง€๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค), ์ด๋“ค์€ ๋ชจ๋‘ 7 ๋ฒ„์ „์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

๋ชจ๋“  ์ œ์•ˆ๋“ค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งค๋ฒˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์–ด๋ ค์šด ์ผ์ด๋ฏ€๋กœ, ์šฐ๋ฆฌ๊ฐ€ ์ •๋ฆฌํ•˜๊ณ  ์žˆ๋Š” babel/proposals๋ฅผ ํ™•์ธํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ง€์› (@babel/preset-typescript)

์šฐ๋ฆฌ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒ€๊ณผ ํ˜‘๋ ฅํ•ด ๋ฐ”๋ฒจ์ด @babel/preset-typescript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ๊ตฌ๋ฌธ์„ ํŒŒ์‹ฑํ•˜๊ณ  ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค. @babel/preset-flow๋กœ ํ”Œ๋กœ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒ€์ด ์ž‘์„ฑํ•œ ๊ธ€์„ ํ™•์ธํ•˜๋ผ!

์ด์ „(ํƒ€์ž…์ด ์‚ฌ์šฉ๋จ):

interface Person {
  firstName: string;
  lastName: string;
}

function greeter(person : Person) {
  return "Hello, " + person.firstName + " " + person.lastName;
}

์ดํ›„(ํƒ€์ž…์ด ์ œ๊ฑฐ๋จ):

function greeter(person) {
  return "Hello, " + person.firstName + " " + person.lastName;
}

ํ”Œ๋กœ์šฐ์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ์ ์ง„์ ์ธ ํƒ€์ดํ•‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋ฉฐ, ๋ฐ”๋ฒจ์—์„œ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด์Šค๋ถ๊ณผ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ํŒ€๊ณผ ๊ฐ€๊น๊ฒŒ ์ผํ•  ๊ณ„ํš์ด๋‹ค.

์ด ํ†ตํ•ฉ์€ ์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡๋ช‡ ๊ตฌ๋ฌธ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์Šˆ๋ฅผ ๋ฆฌํฌํŒ…ํ•˜๊ฑฐ๋‚˜ PR์„ ๋‚ ๋ ค์ฃผ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ๋‹ค.

JSX ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง€์› (<>)

๋ฆฌ์•กํŠธ ๋ธ”๋กœ๊ทธ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, JSX ํ”„๋ ˆ๊ทธ๋จผํŠธ๋Š” beta.31๋ถ€ํ„ฐ ์ง€์›๋˜์—ˆ๋‹ค.

render() {
  return (
    <>
      <ChildA />
      <ChildB />
    </>
  );
}

// output ๐Ÿ‘‡

render() {
  return React.createElement(
    React.Fragment,
    null,
    React.createElement(ChildA, null),
    React.createElement(ChildB, null)
  );
}

๋ฐ”๋ฒจ ํ—ฌํผ ๋ณ€๊ฒฝ

babel-upgrade PR์€ ์ง„ํ–‰์ค‘์ด๋‹ค.

@babel/runtime์€ @babel/runtime๊ณผ @babel/runtime-corejs2๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค. (PR) @babel/runtime์€ ๋ฐ”๋ฒจ ํ—ฌํผ ํ•จ์ˆ˜๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, @babel/runtime-corejs2์€ ๋ฐ”๋ฒจ ํ—ฌํผ ํ•จ์ˆ˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Symbol, Promise์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํด๋ฆฌํ•„ ํ•จ์ˆ˜๋“ค๋„ ํฌํ•จํ•œ๋‹ค.

๋ฐ”๋ฒจ์€ ์žฌ์‚ฌ์šฉ ๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ฃผ์ž…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ๋ชจ๋“ˆ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ "ํ—ฌํผ ํ•จ์ˆ˜"๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ์ œ๋กœ class ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค. (loose ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)

๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋Š” new Person()๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, ํด๋ž˜์Šค๊ฐ€ ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ๋‚œ ํ›„์—๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ Person()์ด๋ผ๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Ÿฐํƒ€์ž„์— ์ด๋ฅผ ์œ„ํ•œ ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

class Person {}
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Person = function Person() {
  _classCallCheck(this, Person);
};

๋””ํŽœ๋˜์‹œ๋กœ์จ @babel/plugin-transform-runtime๊ณผ @babel/runtime์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ”๋ฒจ๋กœ ๊ฐœ๋ณ„ ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ชจ๋“ˆ์„ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

var _classCallCheck = require("@babel/runtime/helpers/classCallCheck");

var Person = function Person() {
  _classCallCheck(this, Person);
};

๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ external-helpers์™€ rollup-plugin-babel์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ž์œผ๋กœ ์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ๋‹ค. ์กฐ๋งŒ๊ฐ„ ๋ฐ”๋ฒจ ํ—ฌํผ์— ๋Œ€ํ•œ ๊ธ€์„ ์ฐพ์•„๋ณด์•„๋ผ.

์ž๋™ ํด๋ฆฌํ•„ํ™” (์‹คํ—˜์ ์ธ)

ํด๋ฆฌํ•„์€ Promise, Symbol๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋กœ์จ ๋ฐ”๋ฒจ(๊ตฌ๋ฌธ ๋ณ€ํ˜•)๊ณผ ํด๋ฆฌํ•„์ด ํ•˜๋Š” ์ผ(๋‚ด์žฅ๋œ ํ•จ์ˆ˜/๊ฐ์ฒด ๊ตฌํ˜„)์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค.

@babel/polyfill์„ ์‚ฌ์šฉํ•˜๋ฉด ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์‰ฝ๋‹ค.

import "@babel/polyfill";

์ด๊ฒƒ์€ ์ „์ฒด ํด๋ฆฌํ•„์„ ํฌํ•จํ•˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋ฏธ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ import ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด๋Š” @babel/preset-env๋กœ ๊ตฌ๋ฌธ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ด๋‹ค. useBuiltins: "entry" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ๋งŒ ๋ถ„ํ• ํ•ด์„œ import ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํด๋ฆฌํ•„๋งŒ import ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค. "useBuiltIns: "usage"๋Š” ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ฒซ ์‹œ๋„์ด๋‹ค. (๋ฌธ์„œ)

์ด ์˜ต์…˜์€ ๊ฐ ํŒŒ์ผ์„ ํ†ตํ•ด ์‹คํ–‰๋˜๋ฉฐ, ์ฝ”๋“œ์—์„œ "์‚ฌ์šฉ๋˜๋Š”" ๊ฒƒ๋งŒ ๊ฐ ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์—์„œ import๋กœ ์ฃผ์ž…๋œ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์ด๋‹ค.

import "core-js/modules/es6.promise";
var a = new Promise();

์•„๋ž˜ ์ถ”๋ก ์€ ์™„๋ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฑฐ์ง“์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•˜๋ผ.

import "core-js/modules/es7.array.includes";
a.includes // assume a is an []

์ด ๋ถ„์•ผ์˜ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋กœ๋Š”, ์„œ๋น„์Šค์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๋ฉด polyfill.io๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๋˜๋Š” Kent C. Dodds๊ฐ€ ์‚ฌ์šฉํ•œ ํŽ˜์ดํŒ”์—์„œ ํ˜ธ์ŠคํŒ… ๋œ ์„œ๋น„์Šค๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์–ด๋ณด๋ผ)

๊ธฐํƒ€

๋ฐ”๋ฒจ ๋งคํฌ๋กœ ๐ŸŽฃ

๋ฐ”๋ฒจ์˜ ์ข‹์€ ์ ์€ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ˆ˜๋…„์— ๊ฑธ์ณ, ๋ฐ”๋ฒจ์€ ์ฝ”๋“œ ๋ณ€ํ™˜ ํ”Œ๋žซํผ ์—์„œ "6to5" ์ปดํŒŒ์ผ๋Ÿฌ(์—ญ์ž์ฃผ: ES6 ์ฝ”๋“œ๋ฅผ ๋ฐ”๋‹๋ผ ES5 ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ)๊ฐ€ ๋˜์—ˆ๋‹ค. ์‚ฌ์šฉ์ž์™€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฉ‹์ง„ ์ตœ์ ํ™”๋ฅผ ํ•œ๋‹ค. ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ API ์„ฑ๋Šฅ ๋ฐ ํ˜ธํ™˜์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ๋ถ€ํ„ฐ ์ˆ˜๋งŽ์€ ๋ฐ”๋ฒจ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค. (์ผ๋ถ€ "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค"์€ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณ€ํ™˜๋˜์–ด ๋Ÿฐํƒ€์ž„์ด ์ „ํ˜€ ์—†๋‹ค)

๋ถˆํ–‰ํ•˜๊ฒŒ๋„, ์ฝ”๋“œ์ƒ์— ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์„ค์ • ๋ณ€๊ฒฝ์„ ํ•„์š”๋กœ ํ•œ๋‹ค(create-react-app๊ณผ ๊ฐ™์€ ์–ด๋–ค ํˆดํ‚ท๋“ค์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค). ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋ฒจ์ด ์‹คํ–‰๋˜๋ฉด์„œ ์ผ์–ด๋‚œ ์ผ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋Š” ๋” ๋ณต์žกํ•ด์ง„๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์€ Kent C. Dodds์˜ babel-plugin-macros๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋‹จ babel-plugin-macros๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„ค์ • ํŒŒ์ผ์— ์ถ”๊ฐ€(์ด๊ฒƒ์€ create-react-app ๋ฒ„์ „ 2๋ฅผ ํฌํ•จํ•œ๋‹ค)ํ•˜๋ฉด, ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •์„ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ถ”๊ฐ€๋กœ ์•ฑ์ด๋‚˜ ์ฝ”๋“œ ํŠน์ • ๋ถ€๋ถ„์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜์„ ์ž‘์„ฑํ•˜๊ธฐ์—๋„ ์‰ฝ๋‹ค.

"babel-plugin-macros์™€ ํ•จ๊ป˜ ํ™˜๊ฒฝ ์„ค์ • ์—†๋Š” ์ฝ”๋“œ ๋ณ€ํ™˜"์— ๋Œ€ํ•œ ์›๋ฌธ์—์„œ babel-plugin-macros์— ๋Œ€ํ•ด ๋” ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“ˆ ํƒ€๊ฒŸํŒ…

๋ฐ”๋ฒจ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž์—๊ฒŒ ์ œ๊ณต๋˜๋Š” ๋ณ€ํ™˜๊ณผ ํ˜ธํ™˜์„ฑ ์˜ํ–ฅ์„ ๊ท ํ˜•์žˆ๊ฒŒ ๋งž์ถ”๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”๋‹ค. ๋ฐ”๋ฒจ 7์—์„œ๋Š” ๋ชจ๋“ˆ/๋ชจ๋“ˆ ํŒจํ„ด์˜ ์ธ๊ธฐ๊ฐ€ ๋†’์•„์ง์— ๋”ฐ๋ผ ๋ฐ”๋ฒจ ์„ค์ •์ด ํ›จ์”ฌ ์‰ฌ์›Œ์กŒ๋‹ค.

ํŠนํžˆ ๋ฐ”๋ฒจ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์ธ๊ธฐ์žˆ๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ(1, 2) CLI ๋„๊ตฌ๋“ค์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์•ฝ 20% ์ •๋„ ๊ฐ์†Œ๋˜๋Š” ํšจ๊ณผ๋ฅผ ๋ณด์˜€๋‹ค.

๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์‹คํ–‰์ž์™€ ๋” ๋‚˜์€ ๊ธฐ๋ณธ ์„ค์ •

@babel/core์— caller ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด ํ”„๋ฆฌ์…‹/ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, babel-loader๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜์—ฌ preset-env๊ฐ€ ์ž๋™์œผ๋กœ ๋ชจ๋“ˆ ๋ณ€ํ™˜์„ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. (rollup๊ณผ ๋™์ผ)

babel.transform("code;", {
  filename,
  presets: ["@babel/preset-env"],
  caller: {
    name: "babel-loader",
    supportsStaticESM: true,
  },
});

์ด ์˜ต์…˜์€ ๊ธฐ๋ณธ ์„ค์ •์„ ์ข‹๊ฒŒ ๋งŒ๋“ค์–ด ์ถ”๊ฐ€ ์„ค์ •์„ ๋œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ํฅ๋ฏธ๋กญ๋‹ค. ๋•Œ๋ฌธ์— ์›นํŒฉ/๋กค์—…์˜ ๊ฒฝ์šฐ, ๋ฐ”๋ฒจ ๋Œ€์‹ ์— ์ž์ฒด ๋ชจ๋“ˆ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ž๋™์œผ๋กœ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. (import("a")์™€ ๋™์ผ) ๋ฏธ๋ž˜์— ์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํˆด๋ง์„ ๋” ๋งŽ์ด ์ฐพ์•„๋ณด๋ผ.

class C extends HTMLElement {}

๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ด์Šˆ๋Š” ์ œ๋ชฉ์— ์žˆ๋‹ค. (์ฐธ์กฐ)

๋ฐ”๋ฒจ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋‚ด์žฅ ๊ฐ์ฒด(Array, Error ๋“ฑ)์— ๋Œ€ํ•œ ํ™•์žฅ์„ ์ง€์›ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ํ•ญ์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ์—ˆ์œผ๋‚˜, ์ด์ œ๋Š” ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ฌธ์ œ๋“ค์„ ๊ฒช์—ˆ๋‹ค. ๐ŸŽ‰ Andrea์ฒ˜๋Ÿผ ์ถ•ํ•˜ํ•œ๋‹ค!

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํด๋ž˜์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ ์šฉ๋˜์—ˆ์œผ๋ฏ€๋กœ, preset-env์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ž๋™์œผ๋กœ ํ™œ์„ฑํšŒ๋˜์–ด์•ผ ํ•œ๋‹ค.

์›น์‚ฌ์ดํŠธ ๋ณ€๊ฒฝ ๐ŸŒ

์šฐ๋ฆฌ์˜ ์‚ฌ์ดํŠธ๋ฅผ Jekyll์—์„œ Docusaurus๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Crowdin์œผ๋กœ ๋ฒˆ์—ญ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฐ”๋ฒจ 7์€ ์ด๊ฒƒ์„ ํ•˜๊ธฐ์— ์ข‹๋‹ค.

REPL

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ REPL์„ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ, Ives์™€ ํ˜‘๋ ฅํ•ด CodeSandbox๋ฅผ ์ž˜ ํ†ตํ•ฉํ–ˆ๋‹ค. ์ด๊ฒƒ์€ REPL๋กœ npm์—์„œ ์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” ํ”„๋ฆฌ์…‹์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ CodeSandbox์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Rails Girls Summer of Code์— ๋‹ค์‹œ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋‹ค! Gyujin๊ณผ Sujin์€ Boopathi์˜ babel-time-travel์„ REPL์— ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค.

๋ฐ”๋ฒจ, ASTs ๋ฐ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์ด ์ž˜ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋‹ค.

๋…ธ๋ž˜๋ฅผ ๋ถ€๋ฅธ๋‹ค ๐ŸŽถ

ํ• ๋ ๋ฃจ์•ผ - ๋ฐ”๋ฒจ์˜ ์ฐฌ์†ก๊ฐ€

์–ด๋Š ๋‚  Angus๋Š” ๋†€๋ผ์šด ๋…ธ๋ž˜๋ฅผ ์šฐ๋ฆฌ์—๊ฒŒ ์„ ์‚ฌํ–ˆ๋Š”๋ฐ, ์–ด์ฐŒ "๊ณต์‹์ ์ธ" ๋…ธ๋ž˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์„์ˆ˜๊ฐ€ ์žˆ๊ฒ ๋Š”๊ฐ€? Shawn์€ ์—ฌ๊ธฐ์— ๋ฉ‹์ง„ ์ปค๋ฒ„๊ณก์„ ๋งŒ๋“ค์—ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์˜ SONG.md์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์ด ์ด๊ฒƒ์„ ๋”ฐ๋ผํ•ด๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค!

๋‹ค์Œ์€?

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

    • ๊ด€๋ จ : Nicolรฒ ๋•๋ถ„์— ๋ฐ”๋ฒจ์— ์ƒˆ๋กœ์šด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ œ์•ˆ์„ ๊ฑฐ์˜ ์™„์„ฑํ–ˆ๋‹ค. ์ƒˆ ์ œ์•ˆ์€ ์ด์ „์˜ ๊ฒƒ๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅด๋ฉฐ ํ›จ์”ฌ ๊ฐ•๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธด ์—ฌ์ •์ด ๋˜์—ˆ์ง€๋งŒ(1๋…„ ์ด์ƒ ๊ฑธ๋ ธ๋‹ค!) ๊ฑฐ์˜ ๋‹ค ์™”๋‹ค ๐ŸŽ‰. ๋‹ค์Œ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์ค‘ ํ•˜๋‚˜์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ๊ณผ ํ•จ๊ป˜ ์ด ์ œ์•ˆ์ด ํฌํ•จ๋˜์–ด ์ถœ์‹œ๋  ๊ฒƒ์ด๋‹ค.
  • Boopathi๋Š” ๊ณต์„ ๋“ค์—ฌ babel-minify๋ฅผ ๊ด€๋ฆฌํ•ด์™”๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๋‹ค์Œ์— 1.0 ๋ฒ„์ „์„ ์ค€๋น„ํ•  ๊ฒƒ์ด๋‹ค!
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์ •๋ ฌ, ๋” ๋‚˜์€ ์œ ํšจ์„ฑ/์—๋Ÿฌ ๊ฒ€์‚ฌ, ์†๋„, loose/์ŠคํŽ™ ์˜ต์…˜ ์žฌ์„ค๊ณ„, ์บ์‹ฑ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ”๋ฒจ ์‚ฌ์šฉ, CI๋กœ๋ถ€ํ„ฐ ์ž์ฒด ๊ตฌ์ถ•, ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ(smoke test), test262 ์‹คํ–‰ ๋“ฑ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์žˆ๋‹ค. ๋‹ค๋ฅธ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๋กœ๋“œ๋งต ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๋ผ!

์šฐ๋ฆฌ์—๊ฒŒ๋Š” ์ˆจ๊ฒจ์ง„ ๊ณ„ํš์ด ์—†๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ด‰์‚ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ๋‹ค.

์˜คํ”ˆ ์†Œ์Šค๋Š” ๊ฑฐ์šธ์ด๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ๋ชจ๋“  ์•„์ด๋””์–ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„๊ณผ ์ž์›์ด ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ ์ถœ์‹œ์—์„œ ๋ณด์—ฌ์ฃผ์—ˆ๋“ฏ์ด ์˜ˆ์ƒ๋ณด๋‹ค ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค!

์ด๋ฒˆ ์ถœ์‹œ๋Š” ์™œ ์ด๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ๊ฑธ๊นŒ? ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค ์ค‘์—์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ž˜ ์ •ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ธ๊ฐ€? ๋๊นŒ์ง€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์™€ ๋ˆˆ์•ž์˜ ๋ฌธ์ œ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ๊ณ ์ณ์„œ์ธ๊ฐ€? ๊นƒํ—™, ์Šฌ๋ž™, ํŠธ์œ„ํ„ฐ์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋„์™€์ฃผ๋Š๋ผ ์‚ฐ๋งŒํ•ด์ ธ์„œ์ธ๊ฐ€? ์‹œ๊ฐ„์„ ์˜ˆ์ธกํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์˜ ์–ด๋ ค์›€์„ ์ดํ•ดํ•˜๋ฉด์„œ ์ž์›๋ด‰์‚ฌ์ž๋กœ์„œ ๊ณผ๋‹คํ•œ ์ปค๋ฐ‹์„ ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ๊ฐ€?

์šฐ๋ฆฌ๋Š” ์ž์‹ ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜๋ฅผ ๋„ˆ๋ฌด ๋†’๊ฒŒ ์ฑ…์ •ํ•œ ๊ฑธ๊นŒ? ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ํ•„์š”์— ๋”ฐ๋ผ ์••๋ ฅ์„ ๊ฐ€ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ๋‚˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ด์œ ์™€ ๋™์‹œ์— ์™œ ์ถœ์‹œ๋˜์ง€ ์•Š๋Š”์ง€๋ฅผ ๋ฌป๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋ฉด ๋ฌด์„ญ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๊ธ‰ํžˆ ๋๋‚ด๊ณ  ์‹ถ์ง€๋งŒ ์ด๊ฒƒ์€ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•œ๋‹ค.

๋‚˜๋Š” ์ง€๋‚œ ์ฃผ React Rally์—์„œ ์ด๋Ÿฌํ•œ ์ƒ๊ฐ๋“ค๊ณผ ๊ณ ์ƒ๋“ค์„ ํ† ๋กœํ•˜๊ณ ์ž ํ–ˆ๋‹ค. (์˜คํ”ˆ ์†Œ์Šค) ์œ ๋ฆฌ์ž”์„ ๋ณด๋Š” ๊ฒƒ์„ ํ†ตํ•ด, ๋‹น์‹ ์ด ์ด๋Ÿฐ ๋‚ด์šฉ๋“ค์„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ž€๋‹ค. ๋‚ด ์ž์‹ ์—๊ฒŒ ๋ฌป๋Š” ์งˆ๋ฌธ์œผ๋กœ๋Š” ์œ ์ง€ ๋ณด์ˆ˜ ์ž‘์—… ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜๊ณ , ๋ถˆ์•ˆํ•ดํ•˜๊ณ , ๋น„ํ˜„์‹ค์ ์ธ ๊ธฐ๋Œ€์— ๋Œ€ํ•œ ํ”ผํ•  ์ˆ˜์—†๋Š” ์‚ฌ์ดํด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€์ด๋‹ค.

์‚ถ์˜ ๋งŽ์€ ๋ถ€๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ์€ ์„ฑ๊ฒฉ์„ ๋ฐ˜์˜ํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ํ–‰๋™์€ ๊ทธ ์ž์ฒด๋กœ ๋” ์ข‹๋“  ๋‚˜์˜๋“ ๊ฐ„์— ์šฐ๋ฆฌ๋ฅผ ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ผ์„ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ธ๋‹ค๋ฉด, ์šฐ๋ฆฌ ๋ฌธํ™”์— ์•„์ฃผ ๊นŠ์ˆ™์ด ๋ฐ•ํ˜€์žˆ๋Š” ์Šต๊ด€๋“ค์— ๋Œ€ํ•ด ์ฑ…์ž„๊ฐ์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค. ์ด ์Šต๊ด€๋“ค์€ ์ฆ‰๊ฐ์ ์ธ ํฌ์—ด, ์ง€ํ‘œ์ƒ์˜ ์„ฑ๊ณต, ๊ถŒ๋ฆฌ ๋ถ€์—ฌ vs ๊ฐ์‚ฌ, ๊ณผ์—…์— ๋Œ€ํ•œ ์ž๋ถ€์‹ฌ์ด๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ด๋ฒˆ ์ถœ์‹œ๋Š” ๊ฐ€์น˜์žˆ์—ˆ๋‹ค.

๊ฐ์‚ฌ ์ธ์‚ฌ

๋ฐ”๋ฒจ 7 ์ถœ์‹œ๋Š” ์ •๋ง๋กœ ํฅ๋ฏธ๋กœ์šด ์ผ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์„ฑ์ทจํ•˜๊ณ  ์‹คํ˜„ํ•œ ๊ฒƒ๋“ค์„ ๋˜๋Œ์•„๋ณผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž‘๋…„์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ํˆฌ์ž…ํ–ˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ผ์–ด๋‚œ ๊ธฐํšŒ์™€ ๊ฒฝํ—˜๋“ค์€ ๋ฏฟ๊ธฐ ์–ด๋ ค์šธ ์ •๋„๋‹ค. ์ „ ์„ธ๊ณ„์˜ ๊ธฐ์—…๋“ค๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉด์„œ ๋„์™€์ฃผ์—ˆ๊ณ , ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋„์‹œ์—์„œ ์นœ๊ตฌ๋“ค์„ ๋งŒ๋‚ฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฏฟ์„ ์ˆ˜ ์—†๋Š” ์—ฌ์ •์— ๋Œ€ํ•ด ์†”์งํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด์„œ ์šฐ๋ฆฌ๋Š” ํ•จ๊ป˜ ํ•ด์™”๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋งŽ์€ ์ •์‹ ์ ์ธ ์—๋„ˆ์ง€๋ฅผ ์Ÿ์•„๋ถ“์ง€ ์•Š์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์—ฌ์ •๊ณผ ํ•จ๊ป˜ ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•˜๋‹ค. ํŠนํžˆ Logan Smyth์™€ Brian Ng์—๊ฒŒ ์ •๋ง ๊ฐ์‚ฌํ•˜๋‹ค. Logan Smyth๋Š” ํ•ต์‹ฌ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ํ”„๋ฆฌ๋žœ์„œ๋กœ ์ผํ•˜๋Š” ๋™์•ˆ์—๋„ ๋ฉ”์‹ ์ €๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ๋„์›€์„ ์ฃผ์—ˆ๋‹ค. Brian Ng๋Š” ๋ฐ”๋ฒจ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์ด์•ผ๊ธฐ๋“ค์„ ๋ชจ๋‘ ๊ฒ€ํ† ํ•ด์ฃผ์—ˆ๋‹ค. Daniel Tschinder, Sven Sauleau, Nicolรฒ Ribaudo, ๊ทธ๋ฆฌ๊ณ  Justin Ridgewell ๋ชจ๋‘๊ฐ€ ์ด๋ฒˆ ์ถœ์‹œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ์ฆ๊ฒ๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ์—ˆ๋‹ค.

์Šฌ๋ž™, ํŠธ์œ„ํ„ฐ ๋ฐ ๊นƒํ—™์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์›๋“ค์—๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์™ธ์ณ๋ณธ๋‹ค. Behance/Adobe์˜ ์นœ๊ตฌ๋“ค์—๊ฒŒ ๊ฐ์‚ฌ์˜ ๋ง์„ ์ „ํ•œ๋‹ค. ๊ทธ๋“ค์€ ๋‚ด๊ฐ€ ๋ฐ”๋ฒจ์—์„œ ํ’€ ํƒ€์ž„์œผ๋กœ ์ผํ•˜๊ธฐ ์ „ ํ•˜ํ”„ ํƒ€์ž„์œผ๋กœ ์ผํ•  ๋•Œ ๊ฑฐ์˜ 1๋…„ ๋™์•ˆ ํ›„์›ํ•ด์ฃผ์—ˆ๋‹ค(๋˜ํ•œ Babel 7์„ ์ƒ์‚ฐ ์ „๋ฐ˜์— ๊ฑธ์ณ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ์—ˆ๋‹ค). Open Collective์˜ ์Šคํฐ์„œ๋“ค, ํŠนํžˆ Trivago์™€ Handshake์—๊ฒŒ๋„ ๊ฐ์‚ฌํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์นœ๊ตฌ์™€ ๊ฐ€์กฑ ๊ทธ๋“ค์˜ ์‚ฌ๋ž‘๊ณผ ์ง€์›์— ๊ฐ์‚ฌ๋“œ๋ฆฐ๋‹ค.

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋งŽ์ด ์ง€์ณค์œผ๋‚˜, ์ด๋ ‡๊ฒŒ ๋ด‰์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์ง„์ •์œผ๋กœ ์˜๊ด‘์ด๋ฉฐ ํŠน๊ถŒ์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด ์ด๋ฒˆ ์ถœ์‹œ์— ๋Œ€ํ•ด ๊ฐ์‚ฌํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค!