๐Ÿš€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์˜ ๋ํŒ์™•: Babel ์™„์ „ ์ •๋ณต! ๐ŸŽ‰

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์˜ ๋ํŒ์™•: Babel ์™„์ „ ์ •๋ณต! ๐ŸŽ‰

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋”ฉ ๋•ํ›„ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ธ๊ณ„์—์„œ ์—†์–ด์„œ๋Š” ์•ˆ ๋  ์ดˆ๊ฐ•๋ ฅ ๋„๊ตฌ, Babel์— ๋Œ€ํ•ด ๊นŠ~๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ๐Ÿ•ต๏ธโ€โ™€๏ธ ์—ฌ๋Ÿฌ๋ถ„, ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ใ…Žใ…Ž

์ž ๊น! Babel์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ด ๊ธ€์„ ๋‹ค ์ฝ๊ณ  ๋‚˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„๋„ Babel ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”. ์‹ฌ์ง€์–ด ์žฌ๋Šฅ๋„ท์—์„œ Babel ๊ด€๋ จ ๊ฐ•์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ์š”! ๐Ÿ˜‰

1. Babel์ด ๋ญ๊ธธ๋ž˜? ๐Ÿค”

์ž, ์—ฌ๋Ÿฌ๋ถ„! Babel์ด ๋ญ”์ง€ ์•„์‹œ๋‚˜์š”? ๋ชจ๋ฅด์…”๋„ ๊ดœ์ฐฎ์•„์š”. ์ง€๊ธˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”.

Babel์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์˜ˆ์š”.

๊ทผ๋ฐ ์ž ๊น, ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๊ณ ์š”? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด ์•„๋‹Œ๊ฐ€์š”? ๋งž์•„์š”, ํ•˜์ง€๋งŒ Babel์€ ์กฐ๊ธˆ ํŠน๋ณ„ํ•ด์š”.

Babel์€ ์ตœ์‹  ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ES6+ ์ฝ”๋“œ๋ฅผ ES5๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๋…€์„์ด์ฃ ! ๐Ÿ˜Ž

์™œ ์ด๋Ÿฐ ๊ฒŒ ํ•„์š”ํ• ๊นŒ์š”? ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์ด์—์š”! ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๊ฑฐ๋“ ์š”. Babel์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ์ฝ”๋”ฉํ•˜๋ฉด์„œ๋„ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ž˜ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.

์žฌ๋Šฅ๋„ท์—์„œ ์›น ๊ฐœ๋ฐœ ๊ฐ•์˜๋ฅผ ๋“ค์–ด๋ณด์‹  ๋ถ„๋“ค์€ ์•„์‹œ๊ฒ ์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์€ ์ •๋ง ์ค‘์š”ํ•œ ์ด์Šˆ์˜ˆ์š”. Babel์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์Šˆํผ ํžˆ์–ด๋กœ ๊ฐ™์€ ์กด์žฌ๋ž๋‹ˆ๋‹ค! ๐Ÿฆธโ€โ™‚๏ธ

Babel์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ES6+) โ†’ ๊ตฌ๋ฒ„์ „ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ES5) ๋ณ€ํ™˜
  • JSX โ†’ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€ํ™˜
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ โ†’ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€ํ™˜
  • ๊ธฐํƒ€ ์‹คํ—˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ ์ง€์›

์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ Babel์ด ์–ผ๋งˆ๋‚˜ ๋Œ€๋‹จํ•œ ๋…€์„์ธ์ง€ ์•„์‹œ๊ฒ ์ฃ ? ใ…‹ใ…‹ใ…‹

2. Babel์˜ ์—ญ์‚ฌ: ์˜›๋‚  ์˜›์ ์—... ๐Ÿฐ

Babel์˜ ์—ญ์‚ฌ๋Š” ๊ฝค๋‚˜ ์žฌ๋ฏธ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์˜ ์„ฑ์žฅ ์Šคํ† ๋ฆฌ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜„

2014๋…„, Sebastian McKenzie๋ผ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ "6to5"๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์–ด์š”. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ES6 ์ฝ”๋“œ๋ฅผ ES5๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜€์ฃ .

2015๋…„, ์ด ํ”„๋กœ์ ํŠธ๋Š” "Babel"๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ๋Œ€๋Œ€์ ์ธ ๋ณ€์‹ ์„ ํ–ˆ์–ด์š”.

Babel์ด๋ผ๋Š” ์ด๋ฆ„์€ ์„ฑ๊ฒฝ์— ๋‚˜์˜ค๋Š” ๋ฐ”๋ฒจํƒ‘์—์„œ ๋”ฐ์™”๋Œ€์š”. ์–ธ์–ด์˜ ํ˜ผ๋ž€์„ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ์š”. ์„ผ์Šค ์žˆ์ฃ ? ๐Ÿ‘

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Babel์˜ ๋กœ๊ณ ๋Š” ์šฐ์ฃผ ์ •๊ฑฐ์žฅ ๋ชจ์–‘์ด์—์š”. ์ด๋Š” Babel์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ '์šฐ์ฃผ'๋ฅผ ํƒํ—˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Œ€์š”. ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”?

Babel์€ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ–ˆ๊ณ , ํ˜„์žฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ณ„์—์„œ ์—†์–ด์„œ๋Š” ์•ˆ ๋  ์ค‘์š”ํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ์–ด์š”. React, Vue, Angular ๊ฐ™์€ ์œ ๋ช…ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค๋„ Babel์„ ์‚ฌ์šฉํ•œ๋‹ต๋‹ˆ๋‹ค!

Babel์˜ ์ฃผ์š” ์—ฐํ˜

  • 2014๋…„: 6to5 ํ”„๋กœ์ ํŠธ ์‹œ์ž‘
  • 2015๋…„: Babel๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ
  • 2016๋…„: Babel 6 ์ถœ์‹œ (ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ ๋„์ž…)
  • 2018๋…„: Babel 7 ์ถœ์‹œ (์„ฑ๋Šฅ ๊ฐœ์„ , ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ง€์› ๊ฐ•ํ™”)
  • 2020๋…„: Babel 7.9 ์ถœ์‹œ (์ž๋™ ์ˆœ์ˆ˜ ์ฃผ์„ ์ง€์›)
  • 2021๋…„: Babel 7.14 ์ถœ์‹œ (ES2021 ์™„์ „ ์ง€์›)

์™€~ Babel์˜ ์—ญ์‚ฌ๋ฅผ ๋ณด๋‹ˆ ์ •๋ง ๋Œ€๋‹จํ•˜์ฃ ? ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์ด ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๋ชจ์•„ ์„ฑ์žฅํ•ด์˜จ ๊ฒƒ์ฒ˜๋Ÿผ, Babel๋„ ๋Š์ž„์—†์ด ๋ฐœ์ „ํ•ด์™”์–ด์š”. ๐Ÿ‘

3. Babel์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ? ๐Ÿ”ง

์ž, ์ด์ œ Babel์˜ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณผ ์‹œ๊ฐ„์ด์—์š”! ์ค€๋น„๋˜์…จ๋‚˜์š”? ๐Ÿ˜Ž

Babel์˜ ์ž‘๋™ ๊ณผ์ •์€ ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”:

  1. ํŒŒ์‹ฑ(Parsing): ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST)๋กœ ๋ณ€ํ™˜
  2. ๋ณ€ํ™˜(Transformation): AST๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€ํ™˜
  3. ์ƒ์„ฑ(Generation): ๋ณ€ํ™˜๋œ AST๋ฅผ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋กœ ์ƒ์„ฑ

์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”. ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿค“

3.1. ํŒŒ์‹ฑ(Parsing) ๋‹จ๊ณ„

ํŒŒ์‹ฑ์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ ์˜๋ฏธ ์žˆ๋Š” ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๊ณผ์ •์ด์—์š”. ๋งˆ์น˜ ๋ฌธ์žฅ์„ ๋‹จ์–ด๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณผ๊นŒ์š”?

const greeting = (name) => `Hello, ${name}!`;

Babel์€ ์ด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ํŒŒ์‹ฑํ•ด์š”:

Babel ํŒŒ์‹ฑ ๊ณผ์ • AST (์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ) Program VariableDeclaration ArrowFunctionExpression Identifier Identifier TemplateLiteral

์šฐ์™€~ ๋ณต์žกํ•ด ๋ณด์ด์ฃ ? ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์ด๊ฑด ๊ทธ๋ƒฅ ์ฝ”๋“œ๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•œ ๊ฑฐ์˜ˆ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Babel์ด ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

3.2. ๋ณ€ํ™˜(Transformation) ๋‹จ๊ณ„

์ด์ œ ํŒŒ์‹ฑ๋œ AST๋ฅผ ๊ฐ€์ง€๊ณ  ์‹ค์ œ ๋ณ€ํ™˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”. ์ด ๋‹จ๊ณ„์—์„œ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ํ™œ์•ฝํ•˜์ฃ !

๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ AST๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ํŠน์ • ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๋ณ€ํ™˜ํ•ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค๋ฉด, ArrowFunctionExpression ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ FunctionExpression ๋…ธ๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฑฐ์ฃ .

์šฐ๋ฆฌ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ES5๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”:

var greeting = function(name) {
  return "Hello, " + name + "!";
};

์ด ๊ณผ์ •์„ AST๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

Babel ๋ณ€ํ™˜ ๊ณผ์ • ๋ณ€ํ™˜๋œ AST Program VariableDeclaration FunctionExpression Identifier Identifier BlockStatement ReturnStatement BinaryExpression

๋ณด์ด์‹œ๋‚˜์š”? ArrowFunctionExpression์ด FunctionExpression์œผ๋กœ ๋ฐ”๋€Œ๊ณ , TemplateLiteral์ด BinaryExpression์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ Babel์˜ ๋งˆ๋ฒ•์ด์—์š”! โœจ

3.3. ์ƒ์„ฑ(Generation) ๋‹จ๊ณ„

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ณ€ํ™˜๋œ AST๋ฅผ ๋‹ค์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด์—์š”. ์ด ๊ณผ์ •์€ ๊ฝค ๋‹จ์ˆœํ•ด์š”. AST๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋˜๊ฑฐ๋“ ์š”.

์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ES5 ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋ผ์š”!

๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์ด ๋ฉ‹์ง„ ๊ฒฐ๊ณผ๋ฌผ๋กœ ํƒ„์ƒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ . ๐Ÿ˜‰

ํŒ: Babel์˜ ์ด๋Ÿฐ ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ฉด, ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ๋•Œ ํฐ ๋„์›€์ด ๋ผ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ ๊ธ‰ ๊ณผ์ •์„ ๊ฐ€๋ฅด์น˜์‹ ๋‹ค๋ฉด, ์ด๋Ÿฐ ๋‚ด์šฉ์„ ๊ผญ ํฌํ•จ์‹œ์ผœ๋ณด์„ธ์š”!

4. Babel ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ๐Ÿ› ๏ธ

์ž, ์ด์ œ Babel์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณผ ์‹œ๊ฐ„์ด์—์š”! ์—ฌ๋Ÿฌ๋ถ„๋„ Babel ๋งˆ์Šคํ„ฐ๊ฐ€ ๋  ์ค€๋น„ ๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ˜Ž

4.1. Babel ์„ค์น˜ํ•˜๊ธฐ

Babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ์„ค์น˜ํ•ด์•ผ ํ•ด์š”. Node.js์™€ npm์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‹œ์ž‘ํ• ๊ฒŒ์š”.

ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npm install --save-dev @babel/core @babel/cli @babel/preset-env

์ด ๋ช…๋ น์–ด๋กœ ์„ค์น˜๋˜๋Š” ํŒจํ‚ค์ง€๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

  • @babel/core: Babel์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋‹ด๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€
  • @babel/cli: ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ Babel์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ
  • @babel/preset-env: ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ์Šค๋งˆํŠธํ•œ ํ”„๋ฆฌ์…‹

์ด๋ ‡๊ฒŒ ์„ค์น˜ํ•˜๋ฉด Babel์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์–ด์š”! ์‰ฝ์ฃ ?

๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”. ๐Ÿ˜„

4.2. Babel ์„ค์ •ํ•˜๊ธฐ

Babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ค์ • ํŒŒ์ผ์ด ํ•„์š”ํ•ด์š”. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— babel.config.json ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

{
  "presets": ["@babel/preset-env"]
}

์ด ์„ค์ •์€ @babel/preset-env๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์˜ˆ์š”. ์ด ํ”„๋ฆฌ์…‹์€ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ง€์›ํ•ด์ค˜์„œ ์ •๋ง ํŽธ๋ฆฌํ•˜๋‹ต๋‹ˆ๋‹ค!

4.3. Babel ์‹คํ–‰ํ•˜๊ธฐ

์ด์ œ Babel์„ ์‹คํ–‰ํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ์˜ˆ์ œ ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? example.js๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

const greet = (name) => `Hello, ${name}!`;

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2);

console.log(greet("Babel"));
console.log(doubled);

์ด์ œ ์ด ํŒŒ์ผ์„ Babel๋กœ ๋ณ€ํ™˜ํ•ด๋ณผ๊ฒŒ์š”. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”:

npx babel example.js --out-file compiled.js

์งœ์ž”~ compiled.js ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฑฐ์˜ˆ์š”. ํ•œ๋ฒˆ ์—ด์–ด๋ณผ๊นŒ์š”?

"use strict";

var greet = function greet(name) {
  return "Hello, ".concat(name, "!");
};

var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map(function (n) {
  return n * 2;
});

console.log(greet("Babel"));
console.log(doubled);

์šฐ์™€~ ์ฝ”๋“œ๊ฐ€ ES5 ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋˜์—ˆ์–ด์š”! ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๋€Œ๊ณ , ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด๋„ concat ๋ฉ”์„œ๋“œ๋กœ ๋ณ€ํ™˜๋˜์—ˆ๋„ค์š”. ๐Ÿ˜ฎ

์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉ๊ธˆ Babel์„ ์‚ฌ์šฉํ•ด์„œ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ–ˆ์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ Babel ๋งˆ์Šคํ„ฐ! ๐ŸŽ‰

์žฌ๋Šฅ๋„ท์—์„œ ์›น ๊ฐœ๋ฐœ ๊ฐ•์˜๋ฅผ ํ•˜์‹ ๋‹ค๋ฉด, ์ด๋Ÿฐ ์‹ค์Šต์„ ๊ผญ ํฌํ•จ์‹œ์ผœ๋ณด์„ธ์š”. ํ•™์ƒ๋“ค์ด ์ง์ ‘ ํ•ด๋ณด๋ฉด์„œ ๋ฐฐ์šฐ๋ฉด ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

5. Babel์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค ์‚ดํŽด๋ณด๊ธฐ ๐Ÿ”

์ž, ์ด์ œ Babel์˜ ๋” ๊นŠ์€ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? Babel์€ ์ •๋ง ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

5.1. ํ”„๋ฆฌ์…‹(Presets)

ํ”„๋ฆฌ์…‹์€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์˜ ๋ชจ์Œ์ด์—์š”. ํŠน์ • ์šฉ๋„๋‚˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”.

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ฆฌ์…‹์€ @babel/preset-env์˜ˆ์š”.

์ด ํ”„๋ฆฌ์…‹์€ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ๋„, ํƒ€๊ฒŸ ํ™˜๊ฒฝ์— ๋งž์ถฐ ํ•„์š”ํ•œ ๋ณ€ํ™˜๋งŒ ์ˆ˜ํ–‰ํ•ด์š”. ๋˜‘๋˜‘ํ•˜์ฃ ?

๋‹ค๋ฅธ ์œ ๋ช…ํ•œ ํ”„๋ฆฌ์…‹๋“ค๋„ ์žˆ์–ด์š”:

  • @babel/preset-react: React ์ฝ”๋“œ ๋ณ€ํ™˜์„ ์œ„ํ•œ ํ”„๋ฆฌ์…‹
  • @babel/preset-typescript: TypeScript ์ฝ”๋“œ ๋ณ€ํ™˜์„ ์œ„ํ•œ ํ”„๋ฆฌ์…‹
  • @babel/preset-flow: Flow ์ฝ”๋“œ ๋ณ€ํ™˜์„ ์œ„ํ•œ ํ”„๋ฆฌ์…‹

ํ”„๋ฆฌ์…‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด babel.config.json ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ผ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด:

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ]
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ React ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์žฌ๋Šฅ๋„ท์—์„œ React ๊ฐ•์˜๋ฅผ ํ•˜์‹ ๋‹ค๋ฉด, ์ด๋Ÿฐ ์„ค์ •์ด ํ•„์ˆ˜๊ฒ ์ฃ ? ๐Ÿ˜‰

5.2. ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugins)

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Babel์˜ ํ•ต์‹ฌ์ด์—์š”. ๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํŠน์ • ๋ฌธ๋ฒ•์ด๋‚˜ ๊ธฐ๋Šฅ์„ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์š”.

ํ”„๋ฆฌ์…‹์€ ์—ฌ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ชจ์•„๋†“์€ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”.

ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ํ•„์š”ํ•  ๋•Œ๋„ ์žˆ์ฃ .

๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • @babel/plugin-transform-arrow-functions: ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜
  • @babel/plugin-transform-block-scoping: let๊ณผ const๋ฅผ var๋กœ ๋ณ€ํ™˜
  • @babel/plugin-transform-classes: ES6+ ํด๋ž˜์Šค๋ฅผ ES5 ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜
  • @babel/plugin-transform-destructuring: ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ๋ณ€ํ™˜

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์š”:

{
  "plugins": [
    "@babel/plugin-transform-arrow-functions",
    "@babel/plugin-transform-block-scoping"
  ]
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ ๋ธ”๋ก ์Šค์ฝ”ํ•‘(let, const)๋งŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ, ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ? ๐Ÿ‘

5.3. ํด๋ฆฌํ•„(Polyfill)

ํด๋ฆฌํ•„์€ ์ข€ ํŠน๋ณ„ํ•ด์š”. ๋ฌธ๋ฒ• ๋ณ€ํ™˜๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ผ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, Promise๋‚˜ Array.from() ๊ฐ™์€ ์ƒˆ๋กœ์šด ์ „์—ญ ๊ฐ์ฒด๋‚˜ ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ๋ฒ•์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์–ด์š”.

์ด๋Ÿด ๋•Œ ํด๋ฆฌํ•„์ด ํ•„์š”ํ•œ ๊ฑฐ์ฃ !

Babel 7.4.0๋ถ€ํ„ฐ๋Š” @babel/polyfill์ด deprecated๋˜์—ˆ๊ณ , core-js์™€ regenerator-runtime์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ด์š”.

ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ์„ค์น˜ํ•ด์•ผ ํ•ด์š”:

npm install core-js regenerator-runtime

๊ทธ๋ฆฌ๊ณ  ์—”ํŠธ๋ฆฌ ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”:

import "core-js/stable";
import "regenerator-runtime/runtime";

๋˜๋Š” webpack์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด entry ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”:

module.exports = {
  entry: ["core-js/stable", "regenerator-runtime/runtime", "./src/  index.js"],
  // ... ๋‚˜๋จธ์ง€ ์„ค์ •
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ํƒ€์ž„๋จธ์‹ ์„ ํƒ€๊ณ  ๋ฏธ๋ž˜์˜ ๊ธฐ์ˆ ์„ ๊ณผ๊ฑฐ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๊ฐ™์ฃ ? ๐Ÿ˜„

5.4. ์„ค์ • ์˜ต์…˜

Babel์€ ์ •๋ง ๋‹ค์–‘ํ•œ ์„ค์ • ์˜ต์…˜์„ ์ œ๊ณตํ•ด์š”. ์ด๋ฅผ ํ†ตํ•ด Babel์˜ ๋™์ž‘์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ฃ . ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์˜ต์…˜๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • targets: ์ง€์›ํ•˜๋ ค๋Š” ํ™˜๊ฒฝ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์ด๋‚˜ Node.js ๋ฒ„์ „์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์ฃ .
  • useBuiltIns: ํด๋ฆฌํ•„์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•ด์š”. "usage", "entry", false ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • loose: ๋” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋ช…์„ธ์™€ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์š”.
  • modules: ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ• ์ง€ ์ง€์ •ํ•ด์š”. "amd", "umd", "systemjs", "commonjs", "cjs", "auto", false ์ค‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฐ ์˜ต์…˜๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์— ๋”ฑ ๋งž๋Š” Babel ์„ค์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ฃ :

{
  "presets": [
    ["@babel/preset-env", {
      "targets": "> 0.25%, not dead",
      "useBuiltIns": "usage",
      "corejs": 3,
      "loose": true,
      "modules": false
    }]
  ]
}

์ด ์„ค์ •์€ ์ „ ์„ธ๊ณ„ ๋ธŒ๋ผ์šฐ์ € ์ ์œ ์œจ 0.25% ์ด์ƒ์ด๋ฉด์„œ ์•„์ง ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ , ํ•„์š”ํ•œ ํด๋ฆฌํ•„๋งŒ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ๋” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ชจ๋“ˆ ๋ณ€ํ™˜์€ ํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.

ํ”„๋กœ ํŒ: Babel ์„ค์ •์„ ์ตœ์ ํ™”ํ•˜๋ฉด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ•์˜๋ฅผ ํ•˜์‹ ๋‹ค๋ฉด, ์ด๋Ÿฐ ๋‚ด์šฉ์„ ๊ผญ ํฌํ•จ์‹œ์ผœ๋ณด์„ธ์š”!

6. Babel๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๋„๊ตฌ๋“ค ๐Ÿ› ๏ธ

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

6.1. Webpack

Webpack์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ˆ์š”. Babel๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ์„ ๋ฒˆ๋“ค๋งํ•˜๋ฉด์„œ ๋™์‹œ์— ๊ตฌ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.

Webpack์—์„œ Babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด babel-loader๋ฅผ ์„ค์น˜ํ•˜๊ณ  webpack.config.js ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์„ธ์š”:

module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader'
        }
      }
    ]
  }
  // ...
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Webpack์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋งํ•  ๋•Œ Babel์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•ด์ค˜์š”. ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ?

6.2. ESLint

ESLint๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”. Babel๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฆฐํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

ESLint์™€ Babel์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด babel-eslint ํŒŒ์„œ๋ฅผ ์„ค์น˜ํ•˜๊ณ  .eslintrc ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์„ธ์š”:

{
  "parser": "@babel/eslint-parser",
  "parserOptions": {
    "sourceType": "module",
    "allowImportExportEverywhere": true
  }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ESLint๊ฐ€ Babel์„ ํ†ตํ•ด ํŒŒ์‹ฑ๋œ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฆฐํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜์ฃ !

6.3. Jest

Jest๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”. Babel๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.

Jest์—์„œ Babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด babel-jest๋ฅผ ์„ค์น˜ํ•˜๊ณ  jest.config.js ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์„ธ์š”:

module.exports = {
  transform: {
    '^.+\\.js$': 'babel-jest',
  },
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Jest๊ฐ€ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— Babel์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•ด์ค˜์š”. ์ตœ์‹  ๋ฌธ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ !

์•Œ์•„๋‘์„ธ์š”: ์ด๋Ÿฐ ๋„๊ตฌ๋“ค๊ณผ Babel์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ด๊ณ  ๊ฐ•๋ ฅํ•ด์ ธ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์›น ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ ์ตœ์ ํ™” ๊ฐ•์˜๋ฅผ ๊ณ„ํš ์ค‘์ด๋ผ๋ฉด, ์ด๋Ÿฐ ๋‚ด์šฉ์„ ๊ผญ ํฌํ•จ์‹œ์ผœ๋ณด์„ธ์š”!

7. Babel์˜ ๋ฏธ๋ž˜์™€ ์ „๋ง ๐Ÿ”ฎ