๐ ์๋ฐ์คํฌ๋ฆฝํธ ํธ๋์คํ์ผ๋ฌ์ ๋ํ์: 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์ ์๋ ๊ณผ์ ์ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ๋๋ ์ ์์ด์:
- ํ์ฑ(Parsing): ์์ค ์ฝ๋๋ฅผ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST)๋ก ๋ณํ
- ๋ณํ(Transformation): AST๋ฅผ ์กฐ์ํ์ฌ ์ฝ๋ ๋ณํ
- ์์ฑ(Generation): ๋ณํ๋ AST๋ฅผ ์๋ก์ด ์ฝ๋๋ก ์์ฑ
์ด๊ฒ ๋ฌด์จ ๋ง์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค๊ณ ์? ๊ฑฑ์ ๋ง์ธ์. ํ๋์ฉ ์์ธํ ์ค๋ช ํด๋๋ฆด๊ฒ์! ๐ค
3.1. ํ์ฑ(Parsing) ๋จ๊ณ
ํ์ฑ์ ์์ค ์ฝ๋๋ฅผ ์ฝ์ด์ ์๋ฏธ ์๋ ์กฐ๊ฐ์ผ๋ก ๋ถํดํ๋ ๊ณผ์ ์ด์์. ๋ง์น ๋ฌธ์ฅ์ ๋จ์ด๋ก ๋๋๋ ๊ฒ์ฒ๋ผ์.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ํด๋ณผ๊น์?
const greeting = (name) => `Hello, ${name}!`;
Babel์ ์ด ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ํ์ฑํด์:
์ฐ์~ ๋ณต์กํด ๋ณด์ด์ฃ ? ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ์ด๊ฑด ๊ทธ๋ฅ ์ฝ๋๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ํํํ ๊ฑฐ์์. ์ด๋ ๊ฒ ํ๋ฉด Babel์ด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์กฐ์ํ ์ ์๋ต๋๋ค.
3.2. ๋ณํ(Transformation) ๋จ๊ณ
์ด์ ํ์ฑ๋ AST๋ฅผ ๊ฐ์ง๊ณ ์ค์ ๋ณํ ์์ ์ ์ํํด์. ์ด ๋จ๊ณ์์ Babel ํ๋ฌ๊ทธ์ธ๋ค์ด ํ์ฝํ์ฃ !
๊ฐ ํ๋ฌ๊ทธ์ธ์ AST๋ฅผ ์ํํ๋ฉด์ ํน์ ๋ ธ๋๋ฅผ ์ฐพ์ ๋ณํํด์.
์๋ฅผ ๋ค์ด, ํ์ดํ ํจ์๋ฅผ ์ผ๋ฐ ํจ์๋ก ๋ฐ๊พธ๋ ํ๋ฌ๊ทธ์ธ์ด ์๋ค๋ฉด, ArrowFunctionExpression ๋ ธ๋๋ฅผ ์ฐพ์์ FunctionExpression ๋ ธ๋๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฑฐ์ฃ .์ฐ๋ฆฌ์ ์์ ์ฝ๋๋ฅผ ES5๋ก ๋ณํํ๋ค๋ฉด ์ด๋ ๊ฒ ๋ ๊ฑฐ์์:
var greeting = function(name) {
return "Hello, " + name + "!";
};
์ด ๊ณผ์ ์ AST๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์์:
๋ณด์ด์๋์? 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์ ๋ฏธ๋์ ์ ๋ง ๐ฎ
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ