์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋์ ๋์ ์ํฌํธ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋. ์ญ์ฌ, ์ด์ , ๊ตฌํ ๋ฐ ์ต์ ์น ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋: ๋์ ์ํฌํธ ์์คํ ๋ง์คํฐํ๊ธฐ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์, ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ ํจ์จ์ ์ธ ๋ชจ๋ ๋ก๋ฉ์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋์ ์ธ๊ณ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด, ํนํ ๋์ ์ํฌํธ ์์คํ ๊ณผ ๊ทธ๊ฒ์ด ํ๋ ์น ๊ฐ๋ฐ ๊ดํ์ ๋ฏธ์น๋ ์ํฅ์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์์กด์ฑ์ ํด๊ฒฐํ๊ณ ๋ก๋ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ค์ดํฐ๋ธ ๋ชจ๋ ์ง์์ด ๋ฑ์ฅํ๊ธฐ ์ , ๊ฐ๋ฐ์๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋๋ก ๊ตฌ์กฐํํ๊ณ ๊ทธ๋ค ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค์ํ ๋ชจ๋ ๋ก๋ ๊ตฌํ์ ์์กดํ์ต๋๋ค.
๊ทธ๋ค์ด ํด๊ฒฐํ๋ ๋ฌธ์
์๋ง์ ํ์ผ๊ณผ ์์กด์ฑ์ ๊ฐ์ง ๋๊ท๋ชจ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ธ์. ๋ชจ๋ ๋ก๋๊ฐ ์๋ค๋ฉด ์ด๋ฌํ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ณต์กํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์์ ์ด ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ค์ ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋๋๋ ์์๋ฅผ ์๋์ผ๋ก ์ถ์ ํ์ฌ ํ์ํ ๋ ์์กด์ฑ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฒ๊ฑฐ๋ก์ธ ๋ฟ๋ง ์๋๋ผ ์ ์ฌ์ ์ธ ์ด๋ฆ ์ถฉ๋ ๋ฐ ์ ์ญ ์ค์ฝํ ์ค์ผ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
CommonJS
์ฃผ๋ก Node.js ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ CommonJS๋ ๋ชจ๋์ ์ ์ํ๊ณ ๊ฐ์ ธ์ค๊ธฐ ์ํ require()
๋ฐ module.exports
๊ตฌ๋ฌธ์ ๋์
ํ์ต๋๋ค. ์ด๋ ํ์ผ ์์คํ
์ ๊ทผ์ด ์ฉ์ดํ ์๋ฒ์ฌ์ด๋ ํ๊ฒฝ์ ์ ํฉํ ๋๊ธฐ์ ๋ชจ๋ ๋ก๋ฉ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ์ต๋๋ค.
์์ :
// math.js
module.exports.add = (a, b) => a + b;
// app.js
const math = require('./math');
console.log(math.add(2, 3)); // ์ถ๋ ฅ: 5
๋น๋๊ธฐ ๋ชจ๋ ์ ์ (AMD)
AMD๋ ๋น๋๊ธฐ์ ๋ชจ๋ ๋ก๋ฉ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ CommonJS์ ํ๊ณ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. RequireJS๋ AMD ๋ช ์ธ์ ์ธ๊ธฐ ์๋ ๊ตฌํ์ฒด์ ๋๋ค.
์์ :
// math.js
define(function () {
return {
add: function (a, b) {
return a + b;
}
};
});
// app.js
require(['./math'], function (math) {
console.log(math.add(2, 3)); // ์ถ๋ ฅ: 5
});
๋ฒ์ฉ ๋ชจ๋ ์ ์ (UMD)
UMD๋ CommonJS์ AMD ํ๊ฒฝ ๋ชจ๋์ ํธํ๋๋ ๋ชจ๋ ์ ์ ํ์์ ์ ๊ณตํ์ฌ, ๋ชจ๋์ด ์์ ์์ด ๋ค์ํ ์ปจํ ์คํธ์์ ์ฌ์ฉ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ต๋๋ค.
์์ (๊ฐ์ํ):
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['exports'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS
factory(exports);
} else {
// ๋ธ๋ผ์ฐ์ ์ ์ญ
factory(root.myModule = {});
}
}(typeof self !== 'undefined' ? self : this, function (exports) {
exports.add = function (a, b) {
return a + b;
};
}));
ES ๋ชจ๋ (ESM)์ ๋ถ์
ECMAScript 2015 (ES6)์์ ES ๋ชจ๋ (ESM)์ด ํ์คํ๋๋ฉด์, ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค์ดํฐ๋ธ ๋ชจ๋ ์ง์์ ๊ฐ๊ฒ ๋์์ต๋๋ค. ESM์ ๋ชจ๋์ ์ ์ํ๊ณ ๊ฐ์ ธ์ค๊ธฐ ์ํ import
์ export
ํค์๋๋ฅผ ๋์
ํ์ฌ, ๋ชจ๋ ๋ก๋ฉ์ ๋ํ ๋ณด๋ค ํ์คํ๋๊ณ ํจ์จ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ์ต๋๋ค.
์์ :
// math.js
export const add = (a, b) => a + b;
// app.js
import { add } from './math.js';
console.log(add(2, 3)); // ์ถ๋ ฅ: 5
ES ๋ชจ๋์ ์ด์
- ํ์คํ: ESM์ ํ์คํ๋ ๋ชจ๋ ํ์์ ์ ๊ณตํ์ฌ, ์ปค์คํ ๋ชจ๋ ๋ก๋ ๊ตฌํ์ ํ์์ฑ์ ์์ ์ค๋๋ค.
- ์ ์ ๋ถ์: ESM์ ๋ชจ๋ ์์กด์ฑ์ ๋ํ ์ ์ ๋ถ์์ ํ์ฉํ์ฌ, ํธ๋ฆฌ ์์ดํน ๋ฐ ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ์ ๊ฐ์ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋น๋๊ธฐ ๋ก๋ฉ: ESM์ ๋ชจ๋์ ๋น๋๊ธฐ ๋ก๋ฉ์ ์ง์ํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ฌ์ค๋๋ค.
๋์ ์ํฌํธ: ์ฃผ๋ฌธํ ๋ชจ๋ ๋ก๋ฉ
ES2020์ ๋์
๋ ๋์ ์ํฌํธ๋ ํ์ํ ๋ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ ์ ์ํฌํธ(import ... from ...
)์ ๋ฌ๋ฆฌ, ๋์ ์ํฌํธ๋ ํจ์์ฒ๋ผ ํธ์ถ๋๋ฉฐ ๋ชจ๋์ export์ ํจ๊ป resolve๋๋ ํ๋ก๋ฏธ์ค(promise)๋ฅผ ๋ฐํํฉ๋๋ค.
๊ตฌ๋ฌธ:
import('./my-module.js')
.then(module => {
// ๋ชจ๋ ์ฌ์ฉ
module.myFunction();
})
.catch(error => {
// ์ค๋ฅ ์ฒ๋ฆฌ
console.error('๋ชจ๋ ๋ก๋ ์คํจ:', error);
});
๋์ ์ํฌํธ์ ์ฌ์ฉ ์ฌ๋ก
- ์ฝ๋ ์คํ๋ฆฌํ : ๋์ ์ํฌํธ๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ๋ฐ๋ผ ๋ก๋๋๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ์กฐ๊ฑด๋ถ ๋ก๋ฉ: ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ํธ์์ฉ์ด๋ ๊ธฐ๊ธฐ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ชจ๋์ ๋ก๋ํ ์ ์์ต๋๋ค.
- ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ก๋ฉ: ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์์ ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ฒฝ๋ก์ ๊ด๋ จ๋ ๋ชจ๋์ ๋ก๋ํจ์ผ๋ก์จ ์ด๊ธฐ ๋ก๋ ์๊ฐ๊ณผ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ํ๋ฌ๊ทธ์ธ ์์คํ : ๋์ ์ํฌํธ๋ ์ฌ์ฉ์ ์ค์ ์ด๋ ์ธ๋ถ ์์ธ์ ๋ฐ๋ผ ๋ชจ๋์ด ๋์ ์ผ๋ก ๋ก๋๋๋ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ๊ตฌํํ๋ ๋ฐ ์ด์์ ์ ๋๋ค.
์์ : ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ ์ฝ๋ ์คํ๋ฆฌํ
ํน์ ํ์ด์ง์์๋ง ์ฌ์ฉ๋๋ ๋๊ท๋ชจ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๊ธฐ ๋ฒ๋ค์ ํฌํจํ๋ ๋์ , ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ํด๋น ํ์ด์ง๋ก ์ด๋ํ ๋๋ง ๋ก๋ํ ์ ์์ต๋๋ค.
// charts.js (๋๊ท๋ชจ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
export function createChart(data) {
// ... ์ฐจํธ ์์ฑ ๋ก์ง ...
console.log('๋ฐ์ดํฐ๋ก ์ฐจํธ ์์ฑ๋จ:', data);
}
// app.js
const chartButton = document.getElementById('showChartButton');
chartButton.addEventListener('click', () => {
import('./charts.js')
.then(module => {
const chartData = [10, 20, 30, 40, 50];
module.createChart(chartData);
})
.catch(error => {
console.error('์ฐจํธ ๋ชจ๋ ๋ก๋ ์คํจ:', error);
});
});
์ด ์์ ์์ charts.js
๋ชจ๋์ ์ฌ์ฉ์๊ฐ "์ฐจํธ ๋ณด๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ ๋๋ง ๋ก๋๋ฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
์์ : ์ฌ์ฉ์ ๋ก์ผ์ผ์ ๊ธฐ๋ฐํ ์กฐ๊ฑด๋ถ ๋ก๋ฉ
์๋ก ๋ค๋ฅธ ๋ก์ผ์ผ(์: ๋ ์ง ๋ฐ ํตํ ํ์ ์ง์ )์ ๋ํด ์๋ก ๋ค๋ฅธ ํ์ ์ง์ ํจ์๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ฌ์ฉ์๊ฐ ์ ํํ ์ธ์ด์ ๋ฐ๋ผ ์ ์ ํ ํ์ ์ง์ ๋ชจ๋์ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
// en-US-formatter.js
export function formatDate(date) {
return date.toLocaleDateString('en-US');
}
export function formatCurrency(amount) {
return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(amount);
}
// de-DE-formatter.js
export function formatDate(date) {
return date.toLocaleDateString('de-DE');
}
export function formatCurrency(amount) {
return new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(amount);
}
// app.js
const userLocale = getUserLocale(); // ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๊ฒฐ์ ํ๋ ํจ์
import(`./${userLocale}-formatter.js`)
.then(formatter => {
const today = new Date();
const price = 1234.56;
console.log('ํ์ํ๋ ๋ ์ง:', formatter.formatDate(today));
console.log('ํ์ํ๋ ํตํ:', formatter.formatCurrency(price));
})
.catch(error => {
console.error('๋ก์ผ์ผ ํฌ๋งทํฐ ๋ก๋ ์คํจ:', error);
});
๋ชจ๋ ๋ฒ๋ค๋ฌ: Webpack, Rollup, Parcel
๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์ฌ๋ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๊ณผ ๊ทธ ์์กด์ฑ์ ๋ธ๋ผ์ฐ์ ์์ ํจ์จ์ ์ผ๋ก ๋ก๋ํ ์ ์๋ ๋จ์ผ ํ์ผ ๋๋ ํ์ผ ์งํฉ(๋ฒ๋ค)์ผ๋ก ๊ฒฐํฉํ๋ ๋๊ตฌ์ ๋๋ค. ์ด๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฐฐํฌ๋ฅผ ๋จ์ํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
Webpack
Webpack์ CommonJS, AMD, ES ๋ชจ๋์ ํฌํจํ ๋ค์ํ ๋ชจ๋ ํ์์ ์ง์ํ๋ ๊ฐ๋ ฅํ๊ณ ๊ณ ๋๋ก ์ค์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ์ฝ๋ ์คํ๋ฆฌํ , ํธ๋ฆฌ ์์ดํน, ํซ ๋ชจ๋ ๊ต์ฒด(HMR)์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Webpack ์ค์ ์์ (webpack.config.js
):
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
mode: 'development',
devtool: 'inline-source-map',
devServer: {
static: './dist',
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
};
Webpack์ด ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ๋๋ก ๋ง๋๋ ์ฃผ์ ๊ธฐ๋ฅ์ ๋์ ์ค์ ๊ฐ๋ฅ์ฑ, ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ ์ง์, ๊ทธ๋ฆฌ๊ณ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ์ ๋๋ค.
Rollup
Rollup์ ์ต์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ์ต์ข ๋ฒ๋ค์์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ํธ๋ฆฌ ์์ดํน์ ๋ฐ์ด๋๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ์๊ณ ํจ์จ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ญ๋๋ค.
Rollup ์ค์ ์์ (rollup.config.js
):
import babel from '@rollup/plugin-babel';
import { nodeResolve } from '@rollup/plugin-node-resolve';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
nodeResolve(),
babel({
babelHelpers: 'bundled',
exclude: 'node_modules/**'
})
]
};
Rollup์ ํธ๋ฆฌ ์์ดํน๊ณผ ES ๋ชจ๋ ์ถ๋ ฅ์ ์ค์ ์ ๋๊ธฐ ๋๋ฌธ์ Webpack์ ๋นํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๋ ์์ ๋ฒ๋ค์ ์์ฑํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
Parcel
Parcel์ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ์ ๋ก ๊ตฌ์ฑ(zero-configuration) ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ๋ชจ๋ ์์กด์ฑ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ฒ๋ค๋งํ์ฌ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
Parcel์ ์ต์ํ์ ์ค์ ๋ง ํ์ํฉ๋๋ค. ์ง์ ์ HTML ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด ๋๋จธ์ง๋ ์์์ ์ฒ๋ฆฌํฉ๋๋ค:
parcel index.html
Parcel์ ์ธ๋ฐํ ์ ์ด๋ณด๋ค ๋น ๋ฅธ ๊ฐ๋ฐ์ด ์ฐ์ ์๋๋ ์๊ท๋ชจ ํ๋ก์ ํธ๋ ํ๋กํ ํ์ ์ ์ข ์ข ์ ํธ๋ฉ๋๋ค.
๋์ ์ํฌํธ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ค๋ฅ ์ฒ๋ฆฌ: ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ๋ก๋์ ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ก๋ฉ ํ์๊ธฐ: ๋ชจ๋์ด ๋ก๋๋๋ ๋์ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค์ธ์.
- ์บ์ฑ: ๋ธ๋ผ์ฐ์ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ์ฌ ๋์ ์ผ๋ก ๋ก๋๋ ๋ชจ๋์ ์บ์ํ๊ณ ํ์ ๋ก๋ ์๊ฐ์ ์ค์ด์ธ์.
- ์ฌ์ ๋ก๋ฉ(Preloading): ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํํ๊ธฐ ์ํด ๊ณง ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋์ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. HTML์์
<link rel="preload" as="script" href="module.js">
ํ๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋ณด์: ํนํ ์ธ๋ถ ์์ค์์ ๋ชจ๋์ ๋์ ์ผ๋ก ๋ก๋ํ ๋์ ๋ณด์ ์ํฅ์ ์ผ๋์ ๋์ธ์. ๋์ ์ผ๋ก ๋ก๋๋ ๋ชจ๋์์ ๋ฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ ์ด๊ท (sanitize)ํ์ธ์.
- ์ฌ๋ฐ๋ฅธ ๋ฒ๋ค๋ฌ ์ ํ: ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ๊ณผ ๋ณต์ก์ฑ์ ๋ง๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํ์ธ์. Webpack์ ๊ด๋ฒ์ํ ์ค์ ์ต์ ์ ์ ๊ณตํ๊ณ , Rollup์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ํ๋์ด ์์ผ๋ฉฐ, Parcel์ ์ ๋ก ๊ตฌ์ฑ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
์์ : ๋ก๋ฉ ํ์๊ธฐ ๊ตฌํ
// ๋ก๋ฉ ํ์๊ธฐ ํ์ ํจ์
function showLoadingIndicator() {
const loadingElement = document.createElement('div');
loadingElement.id = 'loadingIndicator';
loadingElement.textContent = '๋ก๋ฉ ์ค...';
document.body.appendChild(loadingElement);
}
// ๋ก๋ฉ ํ์๊ธฐ ์จ๊ธฐ๊ธฐ ํจ์
function hideLoadingIndicator() {
const loadingElement = document.getElementById('loadingIndicator');
if (loadingElement) {
loadingElement.remove();
}
}
// ๋ก๋ฉ ํ์๊ธฐ์ ํจ๊ป ๋์ ์ํฌํธ ์ฌ์ฉ
showLoadingIndicator();
import('./my-module.js')
.then(module => {
hideLoadingIndicator();
module.myFunction();
})
.catch(error => {
hideLoadingIndicator();
console.error('๋ชจ๋ ๋ก๋ ์คํจ:', error);
});
์ค์ ์ฌ๋ก ๋ฐ ์ผ์ด์ค ์คํฐ๋
- ์ ์์๊ฑฐ๋ ํ๋ซํผ: ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ข ์ข ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ์์ธ ์ ๋ณด, ๊ด๋ จ ์ ํ ๋ฐ ๊ธฐํ ๊ตฌ์ฑ ์์๋ฅผ ํ์์ ๋ฐ๋ผ ๋ก๋ํ์ฌ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋จ์ถํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
- ์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ : ์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ ์ํฌํธ๋ฅผ ํ์ฉํ์ฌ ๋๊ธ ์์คํ , ๋ฏธ๋์ด ๋ทฐ์ด, ์ค์๊ฐ ์ ๋ฐ์ดํธ์ ๊ฐ์ ์ํธ์์ฉ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๊ธฐ๋ฐํ์ฌ ๋ก๋ํฉ๋๋ค.
- ์จ๋ผ์ธ ํ์ต ํ๋ซํผ: ์จ๋ผ์ธ ํ์ต ํ๋ซํผ์ ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณผ์ ๋ชจ๋, ๋ํํ ์ฐ์ต ๋ฌธ์ , ํ๊ฐ ๋ฑ์ ํ์์ ๋ฐ๋ผ ๋ก๋ํ์ฌ ๊ฐ์ธํ๋๊ณ ๋งค๋ ฅ์ ์ธ ํ์ต ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS): CMS ํ๋ซํผ์ ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฌ๊ทธ์ธ, ํ ๋ง ๋ฐ ๊ธฐํ ํ์ฅ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ๋ก๋ํ์ฌ ์ฌ์ฉ์๊ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์น์ฌ์ดํธ๋ฅผ ๋ง์ถค ์ค์ ํ ์ ์๋๋ก ํฉ๋๋ค.
์ผ์ด์ค ์คํฐ๋: ๋์ ์ํฌํธ๋ก ๋๊ท๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ต์ ํํ๊ธฐ
ํ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ธ ๋ฒ๋ค์ ์๋ง์ ๋ชจ๋์ด ํฌํจ๋์ด ์ด๊ธฐ ๋ก๋ ์๊ฐ์ด ๋๋ฆฐ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์์ต๋๋ค. ๊ฐ๋ฐํ์ ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ตฌํํจ์ผ๋ก์จ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ 60% ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํธ์์ฉ๊น์ง์ ์๊ฐ(TTI)์ 40% ๊ฐ์ ํ ์ ์์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ฐธ์ฌ๋์ ์ ๋ฐ์ ์ธ ๋ง์กฑ๋๋ฅผ ํฌ๊ฒ ํฅ์์ํค๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
๋ชจ๋ ๋ก๋์ ๋ฏธ๋
๋ชจ๋ ๋ก๋์ ๋ฏธ๋๋ ์น ํ์ค ๋ฐ ๋๊ตฌ์ ์ง์์ ์ธ ๋ฐ์ ์ ์ํด ํ์ฑ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ํธ๋ ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- HTTP/3 ๋ฐ QUIC: ์ด ์ฐจ์ธ๋ ํ๋กํ ์ฝ๋ค์ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ฐ๊ฒฐ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ์ฌ ๋ชจ๋ ๋ก๋ฉ ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํํ ๊ฒ์ ์ฝ์ํฉ๋๋ค.
- ์น์ด์ ๋ธ๋ฆฌ ๋ชจ๋: ์น์ด์ ๋ธ๋ฆฌ(Wasm) ๋ชจ๋์ ์ฑ๋ฅ์ด ์ค์ํ ์์ ์ ์ ์ ๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๋ชจ๋ ๋ก๋๋ Wasm ๋ชจ๋์ ์ํํ๊ฒ ์ง์ํ๋๋ก ์ ์ํด์ผ ํ ๊ฒ์ ๋๋ค.
- ์๋ฒ๋ฆฌ์ค ํจ์: ์๋ฒ๋ฆฌ์ค ํจ์๋ ์ผ๋ฐ์ ์ธ ๋ฐฐํฌ ํจํด์ด ๋๊ณ ์์ต๋๋ค. ๋ชจ๋ ๋ก๋๋ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ ๋ง๊ฒ ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํด์ผ ํ ๊ฒ์ ๋๋ค.
- ์ฃ์ง ์ปดํจํ : ์ฃ์ง ์ปดํจํ ์ ์ฐ์ฐ์ ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น์ด ๊ฐ์ ธ๊ฐ๊ณ ์์ต๋๋ค. ๋ชจ๋ ๋ก๋๋ ๋์ญํญ์ด ์ ํ๋๊ณ ์ง์ฐ ์๊ฐ์ด ๊ธด ์ฃ์ง ํ๊ฒฝ์ ๋ง๊ฒ ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํด์ผ ํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ก๋์ ๋์ ์ํฌํธ ์์คํ ์ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ๋ชจ๋ ๋ก๋ฉ์ ์ญ์ฌ, ์ด์ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋์ ์ํฌํธ๋ฅผ ์์ฉํ๊ณ Webpack, Rollup, Parcel๊ณผ ๊ฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ ์ค์ํ ๋จ๊ณ์ ๋๋ค.
์น์ด ๊ณ์ํด์ ์งํํจ์ ๋ฐ๋ผ, ์ ์ธ๊ณ ์ฌ์ฉ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ์ต์ฒจ๋จ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ ๋ชจ๋ ๋ก๋ฉ ๊ธฐ์ ์ ์ต์ ๋ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ณ์ ํ์ ํ๋ ๊ฒ์ด ํ์์ ์ผ ๊ฒ์ ๋๋ค.