ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] Babel๊ณผ Webpack์ ์ด์ฉํ ES6+/ES.NEXT ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 8. 22. 16:42ํฌ๋กฌ, ์ฌํ๋ฆฌ, ํ์ด์ดํญ์ค, ์ฃ์ง ๊ฐ์ ์๋ฒ๊ทธ๋ฆฐ ๋ธ๋ผ์ฐ์ ์ ES6 ์ง์์จ์ ์ฝ 98%๋ก ๊ฑฐ์ ๋๋ถ๋ถ ES6 ์ฌ์์ ์ง์ํฉ๋๋ค.
ํ์ง๋ง IE 11์ ES6 ์ง์์จ์ ์ฝ 11%์ด๊ณ . ES6 ์ด์์ ๋ฒ์ (ES6+)๊ณผ ์ ์ ๋จ๊ณ์ ์๋ ES ์ ์ ์ฌ์(ES.NEXT)์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ์ง์์จ์ด ๋ค๋ฅธ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ES6+์ ES.NEXT์ ์ต์ ESCMAScript ์ฌ์์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ค๋ฉด ์ต์ ์ฌ์์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๊ฒฝ์ฐ์ ๋ฐ๋ผ IE๋ฅผ ํฌํจํ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ๋ฌธ์ ์์ด ๋์์ํค๊ธฐ ์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
๋ํ ๋๋ถ๋ถ์ ํ๋ก์ ํธ๊ฐ ๋ชจ๋์ ์ฌ์ฉํ๋ฏ๋ก ES6 ๋ชจ๋(ESM)์ธ์ ๋ณ๋์ ๋ชจ๋ ๋ก๋๋ ํ์ํฉ๋๋ค.
- IE๋ฅผ ํฌํจํ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ESM์ ์ง์X
- ESM์ ์ฌ์ฉํ๋๋ผ๋ ํธ๋์คํ์ผ๋ง์ด๋ ๋ฒ๋ค๋ง์ด ํ์ํจ
- ESM์ด ์์ง ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ(bare import ๋ฑ)์ด ์๊ณ ์ ์ฐจ ํด๊ฒฐ๋๊ณ ์์ง๋ง ์์ง ๋ช ๊ฐ์ง ์ด์๊ฐ ์กด์ฌ
ํธ๋์คํ์ผ๋ฌ์ธ Bable๊ณผ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ธ Webpack์ ์ด์ฉํ๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
Babel
Babel์ ES6+/ES.NEXT๋ก ๊ตฌํ๋ ์ต์ ์ฌ์์ ์์ค์ฝ๋๋ฅผ IE ๊ฐ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ํ๋ ES5 ์ฌ์์ ์์ค์ฝ๋๋ก ๋ณํ(ํธ๋์คํ์ผ๋ง)ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ES6์ ํ์ดํ ํจ์์ ES7์ ์ง์ ์ฐ์ฐ์๋ฅผ Babel์ ํตํด ES5 ์ฌ์์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
// ES6+
[1, 2, 3].map(n => n ** n);
// ES5
"use strict";
[1, 2, 3].map(function (n) {
return Math.pow(n, n);
});
์ด์ฒ๋ผ ํธ๋์คํ์ผ๋ง์ ์ํ Babel์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํด๋ณด๊ฒ ์ต๋๋ค.
Babel ์ค์น
npm์ ์ฌ์ฉํ์ฌ ํฐ๋ฏธ๋์์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด Babel์ ์ค์นํฉ๋๋ค.
# ํ๋ก์ ํธ ํด๋ ์์ฑ
$ mkdir esnext-project
$ cd esnext-project
# package.json ์์ฑ
$ npm init -y
# babel-core, babel-cli ์ค์น
$ npm install --save-dev @babel/core @babel/cli
์ค์น๊ฐ ์๋ฃ๋ ์ดํ package.json ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Babel ํ๋ฆฌ์ ์ค์น์ babel.config.json ์ค์ ํ์ผ ์์ฑ
Babel์ ์ฌ์ฉํ๋ ค๋ฉด @babel/preset-env๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
@bebel/preser-env๋ ํจ๊ป ์ฌ์ฉ๋์ด์ผ ํ๋ Babel ํ๋ฌ๊ทธ์ธ์ ๋ชจ์ ๋ ๊ฒ์ผ๋ก Babel ํ๋ฆฌ์ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ Bebel์ด ์ ๊ณตํ๋ ๊ณต์ Babel ํ๋ฆฌ์ (official preset)์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- babel/preset-env
- babel/preset-flow
- babel/preset-react
- babel/preset-typescript
์ด๋ฌํ @bebel/preset-env๋ ํ์ํ ํ๋ฌ๊ทธ์ธ๋ค์ ํ๋ก์ ํธ ์ง์ ํ๊ฒฝ์ ๋ง์ถฐ ๋์ ์ผ๋ก ๊ฒฐ์ ํด ์ค๋๋ค. ํ๋ก์ ํธ ์ง์ ํ๊ฒฝ์ Browserslist ํ์์ผ๋ก .browserslistrc ํ์ผ์ ์์ธํ ์ค์ ํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ์๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๊ธฐ๋ณธ ์ค์ ์ ๋ชจ๋ ES6+/ES.NEXT ์ฌ์์ ์์ค์ฝ๋๋ฅผ ๋ณํํฉ๋๋ค.
$npm install --save-dev @babel/preset-env
์ค์น๊ฐ ์๋ฃ๋ ์ดํ pakage.json ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ค์น๊ฐ ์๋ฃ๋๋ฉด ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ babel.config.json ์ค์ ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด @babel/preset-env๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
{
"presets": ["@babel/preset-env"]
}
ํธ๋์คํ์ผ๋ง
Babel์ ์ฌ์ฉํ์ฌ ES6+/ES.NEXT ์ฌ์์ ์์ค์ฝ๋๋ฅผ ES5 ์ฌ์์ ์์ค์ฝ๋๋ก ํธ๋์คํ์ผ๋งํ๊ธฐ ์ํด์ Babel CLI ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋งค๋ฒ Babel CLI ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก npm scripts์ Babel CLI ๋ช ๋ น์ด๋ฅผ ๋ฑ๋กํด์ ์ฌ์ฉํฉ๋๋ค.
package.json ํ์ผ์ scripts๋ฅผ ์ถ๊ฐํ ํ ์์ฑ๋ package.json ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ npm scripts์ build๋ src/js ํด๋(ํ๊น ํด๋)์ ์๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ค์ ํธ๋์คํ์ผ๋ฆฐํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ dist/js ํด๋์ ์ ์ฅํฉ๋๋ค. ์ฌ์ฉํ ์ต์ ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- -w : ํ๊น ํด๋์ ์๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ค์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ ์๋์ผ๋ก ํธ๋์คํ์ผ. (--watch ์ต์ ์ ์ถ์ฝํ)
- -d : ํธ๋์คํ์ผ๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์ด ์ ์ฅ๋ ํด๋๋ฅผ ์ง์ . ๋ง์ฝ ์ง์ ๋ ํด๋๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ ์์ฑ (--out-dir ์ต์
์
์ถ์ฝํ)
๋ค์์ ํธ๋์คํ์ผ๋ง์ ํ ์คํธํ๊ธฐ ์ํด ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ src/js ํด๋๋ฅผ ์์ฑํ ํ lib.js์ main.js๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
// src/js/lib.js
export const pi = Math.PI; // ES6 ๋ชจ๋
export function power(x, y) {
return x ** y; // ES7: ์ง์ ์ฐ์ฐ์
}
// ES6 ํด๋์ค
export class Foo {
#private = 10; // stage 3: ํด๋์ค ํ๋ ์ ์ ์ ์
foo() {
// stage 4: ๊ฐ์ฒด Rest/Spread ํ๋กํผํฐ ์ ์
const { a, b, ...x } = { ...{ a: 1, b: 2 }, c: 3, d: 4 };
return { a, b, x };
}
bar() {
return this.#private;
}
}
// src/js/main.js
import { pi, power, Foo } from './lib';
console.log(pi);
console.log(power(pi, pi));
const f = new Foo();
console.log(f.foo());
console.log(f.bar());
ํฐ๋ฏธ๋์์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ํธ๋์คํ์ผ๋ง์ ์คํํ ์ ์์ต๋๋ค.
$npm run build
ํธ๋์คํ์ผ๋ง์ ์ฑ๊ณตํ๋ฉด ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ dist/js ํด๋๊ฐ ์๋์ผ๋ก ์์ฑ๋๊ณ ํธ๋์คํ์ผ๋ง๋ main.js์ lib.js๊ฐ ์ ์ฅ๋ฉ๋๋ค. ํธ๋์คํ์ผ๋ง๋ main.js๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ง์ฝ ์ถ๊ฐ ์ค์น๊ฐ ํ์ํ ํ๋ฌ๊ทธ์ธ์ Babel ํํ์ด์ง ์๋จ ๋ฉ๋ด์ Search๋์ ์ ์ ์ฌ์์ ์ด๋ฆ์ ์ ๋ ฅํ๋ฉด ํด๋น ํ๋ฌ๊ทธ์ธ์ ๊ฒ์ํ์ฌ ์ค์นํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ๋ก๋ฉ ํ ์คํธ
์์์ ์ดํด๋ณธ ์์ ์ ๋ชจ๋ ๊ธฐ๋ฅ์ Node.js ํ๊ฒฝ์์ ๋์ํ ๊ฒ์ด๊ณ Babel์ด ๋ชจ๋์ ํธ๋์คํ์ผ๋งํ ๊ฒ๋ Node.js๊ฐ ๊ธฐ๋ณธ ์ง์ํ๋ CommonJS ๋ฐฉ์์ ๋ชจ๋ ๋ก๋ฉ ์์คํ ์ ๋ฐ๋ฅธ ๊ฒ์ ๋๋ค. ๋ค์์ src/js/main.js๊ฐ Babel์ ์ํด ํธ๋์คํ์ผ๋ง๋ ๊ฒฐ๊ณผ์ ๋๋ค.
// dist/js/main.js
"use strict";
var _lib = require("./lib");
// src/js/main.js
console.log(_lib.pi);
console.log((0, _lib.power)(_lib.pi, _lib.pi));
var f = new _lib.Foo();
console.log(f.foo());
console.log(f.bar());
๋ธ๋ผ์ฐ์ ๋ CommonJS ๋ฐฉ์์ requrie ํจ์๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์์์ ํธ๋์คํ์ผ๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ ๋ค์๊ณผ ๊ฐ์ด index.html์ ์์ฑํ์ฌ HTML ํ์ผ์ ๋ธ๋ผ์ฐ์ ์์ ์คํํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
<!DOCTYPE html>
<html>
<body>
<script src="dist/js/lib.js"></script>
<script src="dist/js/main.js"></script>
</body>
</html>
์ด๋ฌํ ๋ฌธ์ ๋ Webpack์ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค.
Webpack
Webpack์ ์์กด ๊ด๊ณ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ, CSS, ์ด๋ฏธ์ง ๋ฑ์ ๋ฆฌ์์ค๋ค์ ํ๋(๋๋ ์ฌ๋ฌ ๊ฐ)์ ํ์ผ๋ก ๋ฒ๋ค๋งํ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. Webpack์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
- ์์กด ๋ชจ๋์ด ํ๋์ ํ์ผ๋ก ๋ฒ๋ค๋ง๋๋ฏ๋ก ๋ณ๋์ ๋ชจ๋ ๋ก๋๊ฐ ํ์ ์์
- ์ฌ๋ฌ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋๋ก ๋ฒ๋ค๋งํ๋ฏ๋ก HTML ํ์ผ์์ script ํ๊ทธ๋ก ์ฌ๋ฌ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์ฌ๋ผ์ง
Webpack๊ณผ Babel์ ์ด์ฉํ์ฌ ES6+/ES.NEXT ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํด ๋ณด๊ฒ ์ต๋๋ค.
Webpack ์ค์น
ํฐ๋ฏธ๋์์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ Webpack์ ์ค์นํฉ๋๋ค.
$npm install --save-dev webpack webpack-cli
์ค์น๊ฐ ์๋ฃ๋ ์ดํ package.js ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
babel-loader ์ค์น
Webpack์ด ๋ชจ๋์ ๋ฒ๋ค๋งํ ๋ Babel์ ์ฌ์ฉํ์ฌ ES6+/ES.NEXT ์ฌ์์ ์์ค์ฝ๋๋ฅผ ES5 ์ฌ์์ ์์ค์ฝ๋๋ก ํธ๋์คํ์ผ๋งํ๋๋ก babel-loader์ ์ค์นํฉ๋๋ค.
$npm install --save-dev babel-loader
npm scripts๋ฅผ ๋ณ๊ฒฝํ์ฌ Babel ๋์ Webpack์ ์คํํ๋๋ก ์์ ํ๋ฉด package.json ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
webpack.config.js ์ค์ ํ์ผ ์์ฑ
webpack.config.js๋ Webpack์ด ์คํ๋ ๋ ์ฐธ์กฐํ๋ ์ค์ ํ์ผ์ ๋๋ค. ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ webpack.config.js ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
const path = require('path');
module.exports = {
// entry file
// https://webpack.js.org/configuration/entry-context/#entry
entry: './src/js/main.js',
// ๋ฒ๋ค๋ง๋ js ํ์ผ์ ์ด๋ฆ(filename)๊ณผ ์ ์ฅ๋ ๊ฒฝ๋ก(path)๋ฅผ ์ง์
// https://webpack.js.org/configuration/output/#outputpath
// https://webpack.js.org/configuration/output/#outputfilename
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/bundle.js'
},
// https://webpack.js.org/configuration/module
module: {
rules: [
{
test: /\.js$/,
include: [
path.resolve(__dirname, 'src/js')
],
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
},
devtool: 'source-map',
// https://webpack.js.org/configuration/mode
mode: 'development'
};
๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด Babel์ด ํธ๋์คํ์ผ๋ง์ ์ํํ๊ณ Webpack์ด ๋ฒ๋ค๋ง์ ์ํํฉ๋๋ค.
Webpack์ ์คํํ ๊ฒฐ๊ณผ, dist/js ํด๋์ bundle.js๊ฐ ์์ฑ๋๊ณ ์ด ํ์ผ์ main.js, lib.js ๋ชจ๋์ด ํ๋๋ก ๋ฒ๋ค๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋๋ค. index.html์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ์คํํ๋ฉด ๋ฌธ์ ์์ด ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
<!DOCTYPE html>
<html>
<body>
<script src="./dist/js/bundle.js"></script>
</body>
</html>
babel-polyfill ์ค์น
Babel์ ์ฌ์ฉํ์ฌ ES6+/ES.NEXT ์ฌ์์ ์์ค์ฝ๋๋ฅผ ES5 ์ฌ์์ ์์ค์ฝ๋๋ก ํธ๋์คํ์ผ๋งํด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๋ ์ฝ๋๊ฐ ๋จ์ ์์ ์ ์์ต๋๋ค.
- ES6์์ ์ถ๊ฐ๋ Promise, Object.assign, Array.from ๋ฑ์ ES5 ์ฌ์์ ๋์ฒดํ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ํธ๋์คํ์ผ๋ง๋์ง ๋ชปํ๊ณ ๊ทธ๋๋ ๋จ์
๋ฐ๋ผ์ IE ๊ฐ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ Promise, Object.assign, Array.from ๋ฑ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ @babel/polyfill์ ์ค์นํด์ผ ํฉ๋๋ค.
$npm install @babel/polyfill
์ค์น๊ฐ ์๋ฃ๋ ์ดํ package.json ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@babel/polyfill์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ค์ ์ด์ ํ๊ฒฝ์์๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์ฉ ์์กด์ฑ(devDependencies)์ผ๋ก ์ค์นํ๋ --save-dev ์ต์ ์ ์ง์ ํ์ง ์์ต๋๋ค.
ES6์ inport์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ง์ ์ ์ ์ ๋์์ ๋จผ์ ํด๋ฆฌํ์ ๋ก๋ํ๋๋ก ํฉ๋๋ค.
// src/js/main.js
import "@babel/polyfill";
import { pi, power, Foo } from './lib';
...
Webpack์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ ๋ฐฉ๋ฒ ๋์ webpack.config.js ํ์ผ์ entry ๋ฐฐ์ด์ ํด๋ฆฌํ์ ์ถ๊ฐํฉ๋๋ค.
const path = require('path');
module.exports = {
// entry file
// https://webpack.js.org/configuration/entry-context/#entry
entry: ['@babel/polyfill', './src/js/main.js'],
...
์์ ๊ฐ์ด webpack.config.js ํ์ผ์ ์์ ํ์ฌ ํด๋ฆฌํ์ ๋ฐ์ํ์ฌ Webpack์ ์คํํ๋ฉด dist/js/bundle.js์ ๋ค์๊ณผ ๊ฐ์ด ํด๋ฆฌํ์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ๋ชจ๋ (1) | 2022.08.20 |
---|---|
[JavaScript] ์๋ฌ ์ฒ๋ฆฌ (0) | 2022.08.19 |
[JavaScript] ์ ๋๋ ์ดํฐ์ async/await (0) | 2022.08.17 |
[JavaScript] ํ๋ก๋ฏธ์ค(Promise) (0) | 2022.08.17 |
[JavaScript] REST API (0) | 2022.08.16 |
- Total
- Today
- Yesterday
- Baekjoon
- ์ด๋ถํ์
- ์ ์ญ ๋ณ์
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- map
- ์ด์์ฒด์
- ์ฝ๋ฉํ ์คํธ
- JavaScript
- ํ๋กํผํฐ
- ํ๋กํ ์ฝ
- ํ๋ก๊ทธ๋๋จธ์ค
- fp
- ์๋ฐ
- ๋ฐฑ์ค node.js
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- ๋ฐฑ์ค
- ๋ฐฑ์ค javascript
- ๋ ์์ปฌ ํ๊ฒฝ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ๋์์ธ ํจํด
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- TDD
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- git
- ๋คํธ์ํฌ
- ์นด์นด์ค ์ธํด
- ์๊ณ ๋ฆฌ์ฆ
- http
- ํฌํฌ์ธํฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |