๐ ๋ชจ๋ ๋ฒ๋ค๋ง์ ๋ชจ๋ ๊ฒ: ์นํฉ 5 ์๋ฒฝ ๊ฐ์ด๋ ๐

์๋ , ์น๊ตฌ๋ค! ์ค๋์ ์น ๊ฐ๋ฐ์ ํต์ฌ ๋๊ตฌ์ธ ์นํฉ 5์ ๋ํด ๊น์ด ์๊ฒ ํํค์ณ๋ณผ ๊ฑฐ์ผ. ์นํฉ์ด ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋ค๊ณ ? ๊ฑฑ์ ๋ง! ์ด ๊ฐ์ด๋๋ฅผ ๋ฐ๋ผ์ค๋ค ๋ณด๋ฉด ๋๋ ์ด๋์ ์นํฉ ๋ง์คํฐ๊ฐ ๋์ด ์์ ๊ฑฐ์ผ. ๐
์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์น์ฌ์ดํธ๋ ์ฑ์ ์ ์ ๋ ๋ณต์กํด์ง๊ณ ์์ด. ์๋ง์ JavaScript ํ์ผ, CSS, ์ด๋ฏธ์ง ๋ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ต์ ํํ๋ ๊ฒ ์ค์ํด์ก์ง. ๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ ๋ฐ๋ก ๋ชจ๋ ๋ฒ๋ค๋ฌ์ผ. ๊ทธ์ค์์๋ ์นํฉ์ ๊ฐ์ฅ ์ธ๊ธฐ ์๊ณ ๊ฐ๋ ฅํ ๋๊ตฌ ์ค ํ๋์ง.
์ด ๊ธ์์๋ ์นํฉ 5์ A๋ถํฐ Z๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ฃฐ ๊ฑฐ์ผ. ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ์ค์ ๊น์ง, ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ ์ ์๋ ์ค์ฉ์ ์ธ ํ๋ค๋ก ๊ฐ๋ ์ฑ์ ์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ๋ ธํ์ฐ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ!
์, ์ด์ ์นํฉ์ ์ธ๊ณ๋ก ํจ๊ป ๋ ๋๋ณผ๊น? ๐
๐ฆ ์นํฉ, ๊ทธ๊ฒ ๋ญ์ผ?
์นํฉ(Webpack)์ ํ๋ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ผ. ์... ๋ญ ์๋ฆฌ๋๊ณ ? ์ฝ๊ฒ ์ค๋ช ํด์ค๊ฒ!
imagine ์ฐ๋ฆฌ๊ฐ ๋ ๊ณ ๋ก ๊ฑฐ๋ํ ์ฑ์ ๋ง๋ ๋ค๊ณ ์๊ฐํด๋ด. ๋ ๊ณ ๋ธ๋ก ํ๋ํ๋๊ฐ ๋ฐ๋ก ์ฐ๋ฆฌ ํ๋ก์ ํธ์ JavaScript ํ์ผ, CSS ํ์ผ, ์ด๋ฏธ์ง ํ์ผ ๋ฑ์ด์ผ. ์ด ๋ชจ๋ ๋ธ๋ก์ ํจ์จ์ ์ผ๋ก ์กฐ๋ฆฝํด์ ๋ฉ์ง ์ฑ(์ฐ๋ฆฌ์ ์น ์ ํ๋ฆฌ์ผ์ด์ )์ ๋ง๋๋ ๋๊ตฌ๊ฐ ๋ฐ๋ก ์นํฉ์ด์ผ.
๐ ์นํฉ์ ์ฃผ์ ๊ธฐ๋ฅ:
- ์ฌ๋ฌ ํ์ผ์ ํ๋๋ก ๋ฒ๋ค๋ง (๋ฌถ๊ธฐ)
- ์ฝ๋ ์ต์ ํ ๋ฐ ์์ถ
- ๊ฐ๋ฐ ์๋ฒ ์ ๊ณต
- ๋ค์ํ ํ์์ ํ์ผ ์ฒ๋ฆฌ (CSS, ์ด๋ฏธ์ง ๋ฑ)
- ์ฝ๋ ๋ถํ (Code Splitting)
์นํฉ์ ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฐ์ง ์ฌ๋๋ค์ด ๋ชจ์ฌ ํ๋์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ, ์ฌ๋ฌ ๋ชจ๋์ ์กฐํฉํด ํ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ด๋ ๊ฑฐ์ผ.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์นํฉ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํ๋์ ์ ์ ์์ง? ์ฌ๋ฌ ํ์ผ๋ค์ด ์นํฉ์ด๋ผ๋ '๋ง๋ฒ์ ์์'๋ฅผ ํต๊ณผํ๋ฉด ํ๋์ ์ต์ ํ๋ ๋ฒ๋ค ํ์ผ๋ก ๋์ค๋ ๊ฑฐ์ผ. ์ด๋ ๊ฒ ํ๋ฉด ์น์ฌ์ดํธ์ ๋ก๋ฉ ์๋๋ ๋นจ๋ผ์ง๊ณ , ๊ด๋ฆฌํ๊ธฐ๋ ํจ์ฌ ์ฌ์์ ธ.
๊ทธ๋ผ ์ด์ ์นํฉ์ ํต์ฌ ๊ฐ๋ ๋ค์ ํ๋์ฉ ์ดํด๋ณผ๊น? ์ค๋น๋์ด? Let's go! ๐
๐งฉ ์นํฉ์ ํต์ฌ ๊ฐ๋
์, ์ด์ ์นํฉ์ ํต์ฌ ๊ฐ๋ ๋ค์ ํ๋์ฉ ํํค์ณ๋ณผ ๊ฑฐ์ผ. ์ด ๊ฐ๋ ๋ค์ ์ดํดํ๋ฉด ์นํฉ ๋ง์คํฐ๋ก ๊ฐ๋ ๊ธธ์ด ํจ์ฌ ์์ํด์ง ๊ฑฐ์ผ!
1. ์ํธ๋ฆฌ(Entry) ๐
์ํธ๋ฆฌ๋ ์นํฉ์ด ๋ด๋ถ์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํด์ผ ํ๋ ๋ชจ๋์ด์ผ. ์ฝ๊ฒ ๋งํด, ์นํฉ์ด ๋ฒ๋ค๋ง์ ์์ํ๋ ์ง์ ์ด์ง. ๋ณดํต ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ด ๋๋ JavaScript ํ์ผ์ ์ง์ ํด.
๐ ์ํธ๋ฆฌ ์ค์ ์์:
module.exports = {
entry: './src/index.js',
};
์ด๋ ๊ฒ ํ๋ฉด ์นํฉ์ src/index.js
ํ์ผ๋ถํฐ ์์ํด์ ๋ชจ๋ ์์กด์ฑ์ ์ถ์ ํ๊ณ ๋ฒ๋ค๋งํ๊ธฐ ์์ํด.
2. ์์ํ(Output) ๐ค
์์ํ์ ์นํฉ์ด ์์ฑํ ๋ฒ๋ค์ ์ด๋์ ๋ด๋ณด๋ผ์ง ์ง์ ํ๋ ๊ฑฐ์ผ. ํ์ผ ์ด๋ฆ๊ณผ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ์ ์์ด.
๐ ์์ํ ์ค์ ์์:
const path = require('path');
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
};
์ด ์ค์ ์ ๋ฒ๋ค๋ง๋ ํ์ผ์ dist
ํด๋์ bundle.js
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ผ๊ณ ์นํฉ์๊ฒ ์๋ ค์ฃผ๋ ๊ฑฐ์ผ.
3. ๋ก๋(Loaders) ๐ง
์นํฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก JavaScript์ JSON ํ์ผ๋ง ์ดํดํด. ํ์ง๋ง ์ฐ๋ฆฌ๋ CSS, ์ด๋ฏธ์ง, ํฐํธ ๋ฑ ๋ค์ํ ํ์ผ์ ์ฌ์ฉํ์์? ์ด๋ ํ์ํ ๊ฒ ๋ฐ๋ก ๋ก๋์ผ. ๋ก๋๋ ๋ค๋ฅธ ์ ํ์ ํ์ผ์ ์นํฉ์ด ์ดํดํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ ๋ชจ๋๋ก ๋ณํ์์ผ์ค.
๐ ๋ก๋ ์ค์ ์์ (CSS ํ์ผ ์ฒ๋ฆฌ):
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
};
์ด ์ค์ ์ .css
ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ์ ๋ง๋๋ฉด css-loader
๋ก ๋จผ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๋ค์ style-loader
๋ก ์ฒ๋ฆฌํ๋ผ๊ณ ์นํฉ์๊ฒ ์ง์ํ๋ ๊ฑฐ์ผ.
4. ํ๋ฌ๊ทธ์ธ(Plugins) ๐
ํ๋ฌ๊ทธ์ธ์ ์นํฉ์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋๊ตฌ์ผ. ๋ก๋๊ฐ ํน์ ์ ํ์ ๋ชจ๋์ ์ฒ๋ฆฌํ๋ค๋ฉด, ํ๋ฌ๊ทธ์ธ์ ๋ฒ๋ค ์ต์ ํ, ์์ ๊ด๋ฆฌ, ํ๊ฒฝ ๋ณ์ ์ฃผ์ ๋ฑ ๊ด๋ฒ์ํ ์์ ์ ์ํํ ์ ์์ด.
๐ ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ ์์ (HTML ํ์ผ ์์ฑ):
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
],
};
์ด ์ค์ ์ HtmlWebpackPlugin
์ ์ฌ์ฉํด์ HTML ํ์ผ์ ์๋์ผ๋ก ์์ฑํ๊ณ , ๋ฒ๋ค๋ง๋ JavaScript ํ์ผ์ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ค.
5. ๋ชจ๋(Mode) ๐
์นํฉ 4๋ถํฐ ๋์ ๋ ๊ฐ๋ ์ผ๋ก, ์นํฉ์ ๋ด์ฅ ์ต์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํด. 'development', 'production', 'none' ์ธ ๊ฐ์ง ๋ชจ๋๊ฐ ์์ด.
๐ ๋ชจ๋ ์ค์ ์์:
module.exports = {
mode: 'production',
};
'production' ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ์์ถ, ์ต์ ํ ๋ฑ์ด ์๋์ผ๋ก ์ ์ฉ๋ผ์ ๋ฐฐํฌ์ ์ ํฉํ ๋ฒ๋ค์ ์์ฑํ ์ ์์ด.
์ด๋ ๊ฒ ์นํฉ์ ํต์ฌ ๊ฐ๋ 5๊ฐ์ง๋ฅผ ์ดํด๋ดค์ด. ์ด ๊ฐ๋ ๋ค์ ์ ์ดํดํ๊ณ ์์ผ๋ฉด ์นํฉ ์ค์ ์ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ๋ ๊ฑฐ์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ์กฐํฉํด ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ! ๐
์, ์ด์ ์ด ๊ฐ๋ ๋ค์ ๋ฐํ์ผ๋ก ์ค์ ์นํฉ ์ค์ ์ ์ด๋ป๊ฒ ํ๋์ง ์์ธํ ์์๋ณผ๊น? ์ค๋น๋์ด? Let's dive deeper! ๐โโ๏ธ
๐ ๏ธ ์นํฉ 5 ์ค์ ํ๊ธฐ
์, ์ด์ ์ค์ ๋ก ์นํฉ 5๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ๊ฑฐ์ผ. ๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ถํฐ ์์ํด์ ์ ์ ๋ ๋ณต์กํ ์ค์ ๊น์ง ๋จ๊ณ๋ณ๋ก ์ดํด๋ณผ ๊ฑฐ๋๊น ์ฒ์ฒํ ๋ฐ๋ผ์๋ด!
1. ๊ธฐ๋ณธ ์ค์ ์์ํ๊ธฐ ๐
๋จผ์ , ํ๋ก์ ํธ์ ์นํฉ์ ์ค์นํด์ผ ํด. ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ด:
npm init -y
npm install webpack webpack-cli --save-dev
์ด์ ํ๋ก์ ํธ ๋ฃจํธ์ webpack.config.js
ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ ์ค์ ์ ์์ฑํด๋ณผ๊ฒ:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
mode: 'development',
};
์ด ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ ธ:
entry
: ์นํฉ์ด ๋ฒ๋ค๋ง์ ์์ํ ํ์ผ์ ์ง์ ํด. ์ฌ๊ธฐ์๋src/index.js
์ผ.output
: ๋ฒ๋ค๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋์ ์ ์ฅํ ์ง ์ง์ ํด. ์ฌ๊ธฐ์๋dist
ํด๋์bundle.js
ํ์ผ์ด์ผ.mode
: ๊ฐ๋ฐ ๋ชจ๋๋ก ์ค์ ํ์ด. ๋ฐฐํฌํ ๋๋ 'production'์ผ๋ก ๋ฐ๊พธ๋ฉด ๋ผ.
2. ๋ก๋ ์ค์ ํ๊ธฐ ๐ง
์ด์ CSS ํ์ผ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ก๋๋ฅผ ์ค์ ํด๋ณผ๊ฒ. ๋จผ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด:
npm install style-loader css-loader --save-dev
๊ทธ๋ฆฌ๊ณ webpack.config.js
ํ์ผ์ ๋ค์ ์ค์ ์ ์ถ๊ฐํด:
module.exports = {
// ... ๊ธฐ์กด ์ค์ ...
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
};
์ด์ CSS ํ์ผ์ import ํด์ ์ฌ์ฉํ ์ ์์ด!
3. ํ๋ฌ๊ทธ์ธ ์ฌ์ฉํ๊ธฐ ๐
HTML ํ์ผ์ ์๋์ผ๋ก ์์ฑํ๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด๋ณผ๊ฒ. ๋จผ์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด:
npm install html-webpack-plugin --save-dev
๊ทธ๋ฆฌ๊ณ webpack.config.js
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํด:
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// ... ๊ธฐ์กด ์ค์ ...
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
],
};
์ด์ ์นํฉ์ด ๋ฒ๋ค๋งํ ๋๋ง๋ค HTML ํ์ผ๋ ์๋์ผ๋ก ์์ฑ๋๊ณ , ๋ฒ๋ค๋ JS ํ์ผ๋ ์๋์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฑฐ์ผ.
4. ๊ฐ๋ฐ ์๋ฒ ์ค์ ํ๊ธฐ ๐ฅ๏ธ
๊ฐ๋ฐํ ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์ค์ ํด๋ณผ๊ฒ. ๋จผ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด:
npm install webpack-dev-server --save-dev
๊ทธ๋ฆฌ๊ณ webpack.config.js
ํ์ผ์ ๋ค์ ์ค์ ์ ์ถ๊ฐํด:
module.exports = {
// ... ๊ธฐ์กด ์ค์ ...
devServer: {
contentBase: './dist',
open: true,
hot: true,
},
};
์ด์ package.json
ํ์ผ์ scripts ๋ถ๋ถ์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ถ๊ฐํด:
"scripts": {
"start": "webpack serve --mode development",
"build": "webpack --mode production"
}
์ด์ npm start
๋ช
๋ น์ด๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ ์ ์๊ณ , npm run build
๋ช
๋ น์ด๋ก ํ๋ก๋์
์ฉ ๋น๋๋ฅผ ํ ์ ์์ด!
5. ์ฝ๋ ๋ถํ ํ๊ธฐ (Code Splitting) ๐งฉ
๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ฝ๋๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ฒ๋ค๋ก ๋๋๋ ๊ฒ์ด ์ข์. ์ด๋ฅผ ์ฝ๋ ๋ถํ ์ด๋ผ๊ณ ํด. ์นํฉ 5์์๋ ์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ด:
module.exports = {
// ... ๊ธฐ์กด ์ค์ ...
optimization: {
splitChunks: {
chunks: 'all',
},
},
};
์ด ์ค์ ์ ์ถ๊ฐํ๋ฉด ์นํฉ์ด ์๋์ผ๋ก ์ฝ๋๋ฅผ ๋ถ์ํด์ ๊ณตํต ๋ชจ๋์ ๋ณ๋์ ์ฒญํฌ๋ก ๋ถ๋ฆฌํด์ค.
6. ํ๊ฒฝ ๋ณ์ ์ฌ์ฉํ๊ธฐ ๐
๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ํ๋ก๋์
ํ๊ฒฝ์์ ๋ค๋ฅธ ์ค์ ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ฉํ ์ ์์ด. webpack.config.js
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด๋ด:
module.exports = (env) => {
return {
mode: env.production ? 'production' : 'development',
// ... ๋ค๋ฅธ ์ค์ ๋ค ...
};
};
์ด์ ๋ช ๋ น์ด๋ฅผ ์คํํ ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์์ด:
"scripts": {
"start": "webpack serve --env development",
"build": "webpack --env production"
}
์ฌ๊ธฐ๊น์ง ์นํฉ 5์ ๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ฐฉ๋ฒ์ ์์๋ดค์ด. ์ด ์ ๋๋ง ์์๋ ๋๋ถ๋ถ์ ํ๋ก์ ํธ์์ ์นํฉ์ ํ์ฉํ ์ ์์ ๊ฑฐ์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ์กฐํฉํด ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ฒ๋ผ, ์นํฉ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์กฐํฉํด ์ต์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด!
๋ค์ ์น์ ์์๋ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณผ ๊ฑฐ์ผ. ์ค๋น๋์ด? Let's level up! ๐
๐ฌ ์นํฉ 5์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค
์, ์ด์ ์นํฉ 5์ ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณผ ๊ฑฐ์ผ. ์ด ๊ธฐ๋ฅ๋ค์ ๋ง์คํฐํ๋ฉด ๋์ ์น ๊ฐ๋ฐ ์ค๋ ฅ์ด ํ์ธต ๋ ์ ๊ทธ๋ ์ด๋๋ ๊ฑฐ์ผ! ๐
1. Tree Shaking ๐ณ
Tree Shaking์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ด์ผ. ์นํฉ 5์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ง๋ง, ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ช ๊ฐ์ง ์ค์ ์ด ํ์ํด.
module.exports = {
mode: 'production',
optimization: {
usedExports: true,
minimize: true,
},
};
์ด ์ค์ ์ ์ถ๊ฐํ๋ฉด ์นํฉ์ด ๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํด์ค. ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐ ํฐ ๋์์ด ๋ผ!
2. ๋์ ์ํฌํธ (Dynamic Imports) ๐
๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ํ ์์ ์ ๋ชจ๋์ ๋ก๋ํ ์ ์์ด. ์ด๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ด๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์ด์ผ.
// ๋์ ์ํฌํธ ์์
button.addEventListener('click', async () => {
const module = await import('./module.js');
module.doSomething();
});
์นํฉ 5๋ ์ด๋ฐ ๋์ ์ํฌํธ๋ฅผ ์๋์ผ๋ก ์ธ์ํ๊ณ ๋ณ๋์ ์ฒญํฌ๋ก ๋ถ๋ฆฌํด์ค. ๋ณ๋์ ์ค์ ์ด ํ์ ์์ด!
3. Module Federation ๐ค
Module Federation์ ์นํฉ 5์ ๊ฐ์ฅ ํ์ ์ ์ธ ๊ธฐ๋ฅ ์ค ํ๋์ผ. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐํ์์ ์๋ก ๊ณต์ ๋ ์ ์์ด.
const ModuleFederationPlugin = require('webpack').container.ModuleFederationPlugin;
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'app1',
filename: 'remoteEntry.js',
exposes: {
'./Button': './src/Button',
},
shared: ['react', 'react-dom'],
}),
],
};
์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด ์ฑ์ Button ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ด. ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํ ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ด์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ๋ฌ ์ ๋ฌธ๊ฐ๋ค์ ์ฌ๋ฅ์ ํ๋์ ํ๋ก์ ํธ์ ์กฐํฉํ๋ ๊ฒ์ฒ๋ผ, ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ณต์ ํ๊ณ ์กฐํฉํ ์ ์์ด!
4. ์น ์ด์ ๋ธ๋ฆฌ ์ง์ ๐
์นํฉ 5๋ ์น ์ด์ ๋ธ๋ฆฌ(WebAssembly) ๋ชจ๋์ ์ง์ ์ํฌํธํ ์ ์๋๋ก ์ง์ํด. ์ด๋ฅผ ํตํด ๊ณ ์ฑ๋ฅ ์ปดํจํ ์ด ํ์ํ ์์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํํ ์ ์์ด.
// WebAssembly ๋ชจ๋ ์ํฌํธ ์์
import * as wasm from './module.wasm';
wasm.init();
์นํฉ 5๋ ์ด๋ฐ .wasm ํ์ผ์ ์๋์ผ๋ก ์ธ์ํ๊ณ ์ฒ๋ฆฌํด์ค. ๋ณ๋์ ๋ก๋ ์ค์ ์ด ํ์ ์์ด!
5. ์์ ๋ชจ๋ (Asset Modules) ๐ผ๏ธ
์นํฉ 5์์๋ ํ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ก์ด ๋ชจ๋ ํ์ ์ธ ์์ ๋ชจ๋์ ๋์ ํ์ด. ์ด๋ฅผ ํตํด ์ด๋ฏธ์ง, ํฐํธ ๋ฑ์ ํ์ผ์ ๋ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ด.
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/i,
type: 'asset/resource'
}
]
}
};
์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง ํ์ผ์ ๋ณ๋์ ํ์ผ๋ก ์์ฑํ๊ณ , ํด๋น ํ์ผ์ URL์ ๋ฐํํด. ๊ธฐ์กด์ file-loader๋ฅผ ๋์ฒดํ ์ ์์ด!
6. ์บ์ ์ต์ ํ โก
์นํฉ 5๋ ๋น๋ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ์๋ก์ด ์บ์ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํด. ์ด๋ฅผ ํตํด ๋ฐ๋ณต๋๋ ๋น๋ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถ์ํฌ ์ ์์ด.
module.exports = {
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename]
}
}
};
์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด ์นํฉ์ด ๋น๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ ์์คํ ์ ์บ์ํ๊ณ , ๋ค์ ๋น๋ ์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ค์ ๋น๋ํด. ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋ผ!
7. ์คํ์ ๊ธฐ๋ฅ ํ์ฉํ๊ธฐ ๐งช
์นํฉ 5๋ ์ฌ๋ฌ ์คํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด. ์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ๋ฉด ์ต์ ์น ๊ฐ๋ฐ ํธ๋ ๋๋ฅผ ์ ๋ํ ์ ์์ด!
module.exports = {
experiments: {
topLevelAwait: true,
asyncWebAssembly: true,
}
};
์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด top-level await๋ ๋น๋๊ธฐ WebAssembly ๊ฐ์ ์คํ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด. ๋ฌผ๋ก ํ๋ก๋์ ์์ ์ฌ์ฉํ ๋๋ ์ฃผ์๊ฐ ํ์ํด!
์ด๋ ๊ฒ ์นํฉ 5์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ดค์ด. ์ด ๊ธฐ๋ฅ๋ค์ ์ ํ์ฉํ๋ฉด ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ณ ๊ธ ๊ธฐ์ ์ ๊ฐ์ง ์ ๋ฌธ๊ฐ๋ค์ ๋์์ ๋ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ! ๐
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ๋ง๋ฌด๋ฆฌํด๋ณผ๊น? ์ค๋น๋์ด? Let's wrap it up! ๐
๐ ์ ๋ฆฌ ๋ฐ ๋ง๋ฌด๋ฆฌ
์ฐ์, ์ ๋ง ๊ธด ์ฌ์ ์ด์์ด! ์นํฉ 5์ ๊ธฐ๋ณธ๋ถํฐ ๊ณ ๊ธ ๊ธฐ๋ฅ๊น์ง ๋ชจ๋ ์ดํด๋ดค์ง. ์ด์ ๋๋ ์นํฉ ๋ง์คํฐ๊ฐ ๋ ๊ฒ ๊ฐ์! ๐
์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณผ๊ฒ:
- ์นํฉ์ ๊ธฐ๋ณธ ๊ฐ๋ : ์ํธ๋ฆฌ, ์์ํ, ๋ก๋, ํ๋ฌ๊ทธ์ธ, ๋ชจ๋
- ๊ธฐ๋ณธ ์ค์ ๋ฐฉ๋ฒ: webpack.config.js ํ์ผ ์์ฑ, ๋ก๋์ ํ๋ฌ๊ทธ์ธ ์ค์
- ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ : ๊ฐ๋ฐ ์๋ฒ ์ค์ , ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
- ์ฝ๋ ์ต์ ํ: Tree Shaking, ์ฝ๋ ๋ถํ
- ๊ณ ๊ธ ๊ธฐ๋ฅ: Module Federation, ์น ์ด์ ๋ธ๋ฆฌ ์ง์, ์์ ๋ชจ๋
- ์ฑ๋ฅ ์ต์ ํ: ์บ์ ์ต์ ํ, ์คํ์ ๊ธฐ๋ฅ ํ์ฉ
์ด ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๋ฐ๋ ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฑฐ์ผ. ํ์ง๋ง ๊ฑฑ์ ํ์ง ๋ง! ์น ๊ฐ๋ฐ๋, ์นํฉ ์ฌ์ฉ๋ ๋ชจ๋ ์ฐ์ต์ด ํ์ํ ๊ธฐ์ ์ด์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ํ๋ก์ ํธ๋ฅผ ๊ฒฝํํ๋ฉฐ ์ค๋ ฅ์ ์์๊ฐ๋ ๊ฒ์ฒ๋ผ, ๋๋ ๋ค์ํ ํ๋ก์ ํธ์ ์นํฉ์ ์ ์ฉํด๋ณด๋ฉด์ ์ค๋ ฅ์ ํค์๋๊ฐ ์ ์์ ๊ฑฐ์ผ.
์นํฉ์ ์ฌ์ฉํ๋ฉด์ ๊ธฐ์ตํด์ผ ํ ์ค์ํ ํฌ์ธํธ๋ค์ด์ผ:
- ํญ์ ์ต์ ๋ฒ์ ์ ์นํฉ๊ณผ ๊ด๋ จ ํจํค์ง๋ค์ ์ฌ์ฉํ๋ ค๊ณ ๋ ธ๋ ฅํด. ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ์ฑ๋ฅ ๊ฐ์ ์ด ๊ณ์ํด์ ์ด๋ค์ง๊ณ ์๊ฑฐ๋ .
- ํ๋ก์ ํธ์ ๊ท๋ชจ์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์นํฉ ์ค์ ์ ์กฐ์ ํด. ์์ ํ๋ก์ ํธ์๋ ๊ฐ๋จํ ์ค์ ์ผ๋ก ์ถฉ๋ถํ ์ ์์ด.
- ์ฑ๋ฅ ์ต์ ํ๋ ์ค์ํ์ง๋ง, ๊ณผ๋ํ ์ต์ ํ๋ ์คํ๋ ค ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์์ด. ๊ท ํ์ ์ ๋ง์ถ๋ ๊ฒ ์ค์ํด.
- ์นํฉ ๊ณต์ ๋ฌธ์๋ฅผ ์์ฃผ ์ฐธ๊ณ ํด. ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋๋ง๋ค ์ ๋ฐ์ดํธ๋๊ฑฐ๋ .
- ์ปค๋ฎค๋ํฐ์ ๋์์ ๋ฐ๋ ๊ฒ๋ ์ข์. Stack Overflow๋ GitHub ์ด์ ํ์ด์ง์์ ๋ง์ ๋์์ ๋ฐ์ ์ ์์ด.
๋ง์ง๋ง์ผ๋ก, ์นํฉ์ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง ๋ง๋ฅ ํด๊ฒฐ์ฑ ์ ์๋์ผ. ๋๋ก๋ ๋ค๋ฅธ ๋๊ตฌ๋ ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ ํฉํ ์ ์์ด. ํญ์ ์ด๋ฆฐ ๋ง์์ผ๋ก ์๋ก์ด ๊ธฐ์ ์ ํ๊ตฌํ๊ณ , ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ ์ค์ํด.
์, ์ด์ ๋์ ์นํฉ ๋ง์คํฐ ์ฌ์ ์ด ์์๋์ด! ์ด ๊ฐ์ด๋๊ฐ ๋์ ์น ๊ฐ๋ฐ ์ค๋ ฅ ํฅ์์ ๋์์ด ๋๊ธธ ๋ฐ๋ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ์ ์๋ก์ด ๊ธฐ์ ์ ์ต๋ํ๋ ๊ฒ์ฒ๋ผ, ์ด ๊ฐ์ด๋๊ฐ ๋์ ๋ ๋ ํ ์กฐ๋ ฅ์๊ฐ ๋์๊ธธ ๋ฐ๋ผ!
์นํฉ๊ณผ ํจ๊ปํ๋ ๋์ ์น ๊ฐ๋ฐ ์ฌ์ ์ ํ์ด์ด ํจ๊ปํ๊ธฐ๋ฅผ! ํ์ดํ ! ๐๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ