ํจ์จ์ ์ธ ์น ๊ฐ๋ฐ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ง ์ ๋ต, ์ฅ์ , ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ๋ฏธ์น๋ ์ํฅ์ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ง ์ ๋ต: ์ฝ๋ ๊ตฌ์ฑ์ ์ํ ๊ฐ์ด๋
ํ๋ ์น ๊ฐ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ง์ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๊ณ ์ต์ ํํ๋ ํ์์ ์ธ ๊ดํ์ด ๋์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ํจ์จ์ ์ธ ์ฝ๋ ์ ๋ฌ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ง ์ ๋ต, ๊ทธ ์ด์ , ๊ทธ๋ฆฌ๊ณ ๋ ๋์ ์ฝ๋ ๊ตฌ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฐ ์ฑ๋ฅ์ ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํฉ๋๋ค.
๋ชจ๋ ๋ฒ๋ค๋ง์ด๋ ๋ฌด์์ธ๊ฐ?
๋ชจ๋ ๋ฒ๋ค๋ง์ ์ฌ๋ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๊ณผ ๊ทธ ์์กด์ฑ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํจ์จ์ ์ผ๋ก ๋ก๋ํ ์ ์๋ ๋จ์ผ ํ์ผ ๋๋ ํ์ผ ์งํฉ(๋ฒ๋ค)์ผ๋ก ๊ฒฐํฉํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ณผ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค:
- ์์กด์ฑ ๊ด๋ฆฌ: ๋ชจ๋ ํ์ ๋ชจ๋์ด ์ฌ๋ฐ๋ฅธ ์์๋ก ๋ก๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- HTTP ์์ฒญ: ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํ๋ ๋ฐ ํ์ํ HTTP ์์ฒญ ์๋ฅผ ์ค์ ๋๋ค.
- ์ฝ๋ ๊ตฌ์ฑ: ์ฝ๋๋ฒ ์ด์ค ๋ด์์ ๋ชจ๋์ฑ๊ณผ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ์ถ์(minification), ์ฝ๋ ์คํ๋ฆฌํ , ํธ๋ฆฌ ์์ดํน๊ณผ ๊ฐ์ ๋ค์ํ ์ต์ ํ๋ฅผ ์ ์ฉํฉ๋๋ค.
์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์น ๊ฐ๋ฐ ํ๋ก์ ํธ์ ๋ค์๊ณผ ๊ฐ์ ์๋ง์ ์ด์ ์ด ์์ต๋๋ค:
- ์ฑ๋ฅ ํฅ์: HTTP ์์ฒญ ์๋ฅผ ์ค์ด๊ณ ์ฝ๋ ์ ๋ฌ์ ์ต์ ํํจ์ผ๋ก์จ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์น์ฌ์ดํธ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
- ํฅ์๋ ์ฝ๋ ๊ตฌ์ฑ: ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ๋ชจ๋์ฑ์ ์ด์งํ์ฌ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ: ๋ฒ๋ค๋ฌ๋ ์์กด์ฑ ํด๊ฒฐ์ ์ฒ๋ฆฌํ์ฌ ๋ชจ๋ ํ์ ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ก๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ฝ๋ ์ต์ ํ: ๋ฒ๋ค๋ฌ๋ ์ต์ข ๋ฒ๋ค์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ถ์, ์ฝ๋ ์คํ๋ฆฌํ , ํธ๋ฆฌ ์์ดํน๊ณผ ๊ฐ์ ์ต์ ํ๋ฅผ ์ ์ฉํฉ๋๋ค.
- ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ์ฑ: ๋ฒ๋ค๋ฌ๋ ์ข ์ข ํธ๋์คํ์ผ๋ง์ ํตํด ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ชจ๋ ๋ฒ๋ค๋ง ์ ๋ต ๋ฐ ๋๊ตฌ
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ง์ ์ํ ์ฌ๋ฌ ๋๊ตฌ๊ฐ ์์ผ๋ฉฐ, ๊ฐ ๋๊ตฌ๋ ๊ณ ์ ํ ์ฅ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ์นํฉ(Webpack)
์นํฉ(Webpack)์ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ์ ํ์ ์์๊ฐ ๋ ๋งค์ฐ ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. CommonJS, AMD, ES ๋ชจ๋์ ํฌํจํ ๋ค์ํ ๋ชจ๋ ํ์์ ์ง์ํ๋ฉฐ, ํ๋ฌ๊ทธ์ธ๊ณผ ๋ก๋๋ฅผ ํตํด ๊ด๋ฒ์ํ ์ฌ์ฉ์ ์ ์ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
์นํฉ์ ์ฃผ์ ๊ธฐ๋ฅ:
- ์ฝ๋ ์คํ๋ฆฌํ : ์นํฉ์ ์ฝ๋๋ฅผ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ๋ ์์ ์ฒญํฌ๋ก ๋ถํ ํ์ฌ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๋ก๋(Loaders): ๋ก๋๋ ๋ค์ํ ์ ํ์ ํ์ผ(์: CSS, ์ด๋ฏธ์ง, ๊ธ๊ผด)์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๋ก ๋ณํํ ์ ์๊ฒ ํด์ค๋๋ค.
- ํ๋ฌ๊ทธ์ธ(Plugins): ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉ์ ์ ์ ๋น๋ ํ๋ก์ธ์ค ๋ฐ ์ต์ ํ๋ฅผ ์ถ๊ฐํ์ฌ ์นํฉ์ ๊ธฐ๋ฅ์ ํ์ฅํฉ๋๋ค.
- ํซ ๋ชจ๋ ๊ต์ฒด(HMR): HMR์ ์ ์ฒด ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์น ํ์ ์์ด ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํ์ฌ ๊ฐ๋ฐ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
์นํฉ ๊ตฌ์ฑ ์์:
๋ค์์ ์นํฉ ๊ตฌ์ฑ ํ์ผ(webpack.config.js)์ ๊ธฐ๋ณธ ์์์
๋๋ค:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
mode: 'development', // or 'production'
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
],
},
};
์ด ๊ตฌ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์
์ (./src/index.js), ์ถ๋ ฅ ํ์ผ(bundle.js), ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ๊ธฐ ์ํ ๋ฐ๋ฒจ(Babel) ์ฌ์ฉ์ ์ง์ ํฉ๋๋ค.
์นํฉ ์ฌ์ฉ ์๋๋ฆฌ์ค ์์:
๋๊ท๋ชจ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๊ตฌ์ถํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์นํฉ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฒญํฌ๋ก ๋ถํ ํ ์ ์์ต๋๋ค: * ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ๋ค: ์ฌ์ดํธ์ ํต์ฌ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค. * ์ ํ ๋ชฉ๋ก ๋ฒ๋ค: ์ฌ์ฉ์๊ฐ ์ ํ ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋ํ ๋๋ง ๋ก๋๋ฉ๋๋ค. * ๊ฒฐ์ ๋ฒ๋ค: ๊ฒฐ์ ํ๋ก์ธ์ค ์ค์๋ง ๋ก๋๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฉ์ธ ํ์ด์ง๋ฅผ ํ์ํ๋ ์ฌ์ฉ์์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ต์ ํํ๊ณ , ํ์ํ ๋๋ง ์ ๋ฌธ ๋ชจ๋์ ๋ก๋ฉ์ ์ง์ฐ์ํต๋๋ค. ์๋ง์กด, ํ๋ฆฝ์นดํธ, ๋๋ ์๋ฆฌ๋ฐ๋ฐ๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ด๋ฌํ ์น์ฌ์ดํธ๋ค๋ ์ ์ฌํ ์ ๋ต์ ํ์ฉํฉ๋๋ค.
2. ํ์ฌ(Parcel)
ํ์ฌ(Parcel)์ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ์ ๋ก ๊ตฌ์ฑ(zero-configuration) ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ์๋ ๊ตฌ์ฑ ์์ด ๋ชจ๋ ์์กด์ฑ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ฒ๋ค๋งํฉ๋๋ค.
ํ์ฌ์ ์ฃผ์ ๊ธฐ๋ฅ:
- ์ ๋ก ๊ตฌ์ฑ: ํ์ฌ์ ์ต์ํ์ ๊ตฌ์ฑ๋ง ํ์๋ก ํ๋ฏ๋ก ๋ชจ๋ ๋ฒ๋ค๋ง์ ์ฝ๊ฒ ์์ํ ์ ์์ต๋๋ค.
- ์๋ ์์กด์ฑ ํด๊ฒฐ: ํ์ฌ์ ์๋ ๊ตฌ์ฑ ์์ด ๋ชจ๋ ์์กด์ฑ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ฒ๋ค๋งํฉ๋๋ค.
- ์ธ๊ธฐ ๊ธฐ์ ๋ด์ฅ ์ง์: ํ์ฌ์ ์๋ฐ์คํฌ๋ฆฝํธ, CSS, HTML, ์ด๋ฏธ์ง์ ๊ฐ์ ์ธ๊ธฐ ๊ธฐ์ ์ ๋ํ ๋ด์ฅ ์ง์์ ํฌํจํฉ๋๋ค.
- ๋น ๋ฅธ ๋น๋ ์๊ฐ: ํ์ฌ์ ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ๋น ๋ฅธ ๋น๋ ์๊ฐ์ ์ํด ์ค๊ณ๋์์ต๋๋ค.
ํ์ฌ ์ฌ์ฉ ์์:
ํ์ฌ์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค๋งํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
parcel src/index.html
ํ์ฌ์ ๋ชจ๋ ์์กด์ฑ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ฒ๋ค๋งํ์ฌ dist ๋๋ ํฐ๋ฆฌ์ ํ๋ก๋์
์ค๋น๊ฐ ๋ ๋ฒ๋ค์ ์์ฑํฉ๋๋ค.
ํ์ฌ ์ฌ์ฉ ์๋๋ฆฌ์ค ์์:
๋ฒ ๋ฅผ๋ฆฐ์ ํ ์คํํธ์ ์ ์ํด ์ค์ ๊ท๋ชจ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ฒ ํ๋กํ ํ์ดํํ๋ค๊ณ ์๊ฐํด ๋ณด์ธ์. ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ๋ฐ๋ณตํด์ผ ํ๊ณ ๋ณต์กํ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค. ํ์ฌ์ ์ ๋ก ๊ตฌ์ฑ ์ ๊ทผ ๋ฐฉ์์ ๋น๋ ๊ตฌ์ฑ๋ณด๋ค๋ ๊ฐ๋ฐ์ ์ง์คํ๋ฉด์ ๊ฑฐ์ ์ฆ์ ๋ชจ๋ ๋ฒ๋ค๋ง์ ์์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฌํ ์ ์ํ ๋ฐฐํฌ๋ ํฌ์์๋ ์ฒซ ๊ณ ๊ฐ์๊ฒ MVP๋ฅผ ์์ฐํด์ผ ํ๋ ์ด๊ธฐ ๋จ๊ณ์ ์คํํธ์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
3. ๋กค์ (Rollup)
๋กค์ (Rollup)์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ณ ๋๋ก ์ต์ ํ๋ ๋ฒ๋ค์ ์์ฑํ๋ ๋ฐ ์ค์ ์ ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ํนํ ES ๋ชจ๋์ ๋ฒ๋ค๋งํ๋ ๋ฐ ์ ํฉํ๋ฉฐ, ๋ฐ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ํธ๋ฆฌ ์์ดํน์ ์ง์ํฉ๋๋ค.
๋กค์ ์ ์ฃผ์ ๊ธฐ๋ฅ:
- ํธ๋ฆฌ ์์ดํน: ๋กค์ ์ ์ต์ข ๋ฒ๋ค์์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋(๋ฐ๋ ์ฝ๋)๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ ๊ฑฐํ์ฌ ๋ ์๊ณ ํจ์จ์ ์ธ ๋ฒ๋ค์ ๋ง๋ญ๋๋ค.
- ES ๋ชจ๋ ์ง์: ๋กค์ ์ ES ๋ชจ๋์ ๋ฒ๋ค๋งํ๋๋ก ์ค๊ณ๋์ด ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ์ด์์ ์ ๋๋ค.
- ํ๋ฌ๊ทธ์ธ ์ํ๊ณ: ๋กค์ ์ ๋ฒ๋ค๋ง ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ํ๋ถํ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋กค์ ๊ตฌ์ฑ ์์:
๋ค์์ ๋กค์
๊ตฌ์ฑ ํ์ผ(rollup.config.js)์ ๊ธฐ๋ณธ ์์์
๋๋ค:
import babel from '@rollup/plugin-babel';
import { nodeResolve } from '@rollup/plugin-node-resolve';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
},
plugins: [
nodeResolve(),
babel({
exclude: 'node_modules/**', // only transpile our source code
}),
],
};
์ด ๊ตฌ์ฑ์ ์
๋ ฅ ํ์ผ(src/index.js), ์ถ๋ ฅ ํ์ผ(dist/bundle.js), ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ๊ธฐ ์ํ ๋ฐ๋ฒจ ์ฌ์ฉ์ ์ง์ ํฉ๋๋ค. `nodeResolve` ํ๋ฌ๊ทธ์ธ์ `node_modules`์์ ๋ชจ๋์ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋กค์ ์ฌ์ฉ ์๋๋ฆฌ์ค ์์:
๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ์ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ฌ๋ฌ๋ถ์ ๋ชฉํ๋ ๋ค์ํ ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉ๋ ์ ์๋ ๊ฐ๋ณ๊ณ ํจ์จ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋กค์ ์ ํธ๋ฆฌ ์์ดํน ๊ธฐ๋ฅ์ ์ต์ข ๋ฒ๋ค์ ํ์ํ ์ฝ๋๋ง ํฌํจ๋๋๋ก ๋ณด์ฅํ์ฌ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ด๋ D3.js ๋ชจ๋์ด๋ ๋ ์์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์ฆ๋์๋ฏ์ด, ๋กค์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์ ํ์ํ ์ ํ์ผ๋ก ๋ง๋ญ๋๋ค.
4. ๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด(Browserify)
๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด(Browserify)๋ ์ด๊ธฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ ์ค ํ๋๋ก, ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ์์ Node.js ์คํ์ผ์ `require()` ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์์ฆ ์๋ก์ด ํ๋ก์ ํธ์๋ ๋ ์ฌ์ฉ๋์ง๋ง, ์ฌ์ ํ ๊ฒฌ๊ณ ํ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๋ฅผ ์ง์ํ๋ฉฐ ์ค๋๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ๊ฑฐ๋ ํ๋ํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด์ ์ฃผ์ ๊ธฐ๋ฅ:
- Node.js ์คํ์ผ ๋ชจ๋: ๋ธ๋ผ์ฐ์ ์์ `require()`๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ํ๋ฌ๊ทธ์ธ ์ํ๊ณ: ๋ณํ ๋ฐ ์ต์ ํ๋ฅผ ์ํ ๋ค์ํ ํ๋ฌ๊ทธ์ธ์ ์ง์ํฉ๋๋ค.
- ๋จ์์ฑ: ๊ธฐ๋ณธ ๋ฒ๋ค๋ง์ ์ํด ์ค์ ํ๊ณ ์ฌ์ฉํ๊ธฐ๊ฐ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด ์ฌ์ฉ ์์:
๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค๋งํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์คํํฉ๋๋ค:
browserify src/index.js -o dist/bundle.js
๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด ์ฌ์ฉ ์๋๋ฆฌ์ค ์์:
์ด๊ธฐ์ ์๋ฒ ์ธก์์ Node.js ์คํ์ผ ๋ชจ๋์ ์ฌ์ฉํ๋๋ก ์์ฑ๋ ๋ ๊ฑฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์ธ์. ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ ์ ์ํด ์ด ์ฝ๋์ ์ผ๋ถ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ๋ฆฌํ์ด๋ก ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋๋์ ์ธ ์ฌ์์ฑ ์์ด ์ต์ํ `require()` ๊ตฌ๋ฌธ์ ์ฌ์ฌ์ฉํ์ฌ ์ํ์ ์ค์ด๊ณ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง๋ณด์๋ ๊ธฐ๋ณธ ์ํคํ ์ฒ์ ํฐ ๋ณํ๋ฅผ ์ฃผ์ง ์๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋นํ ์ด์ ์ ์ป๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ชจ๋ ํ์: CommonJS, AMD, UMD, ES ๋ชจ๋
๋ค๋ฅธ ๋ชจ๋ ํ์์ ์ดํดํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํ๊ณ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
1. CommonJS
CommonJS๋ ์ฃผ๋ก Node.js ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ํ์์
๋๋ค. require() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ณ module.exports ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ด๋ณด๋
๋๋ค.
// math.js
function add(a, b) {
return a + b;
}
module.exports = {
add: add,
};
// app.js
const math = require('./math');
console.log(math.add(2, 3)); // Output: 5
2. ๋น๋๊ธฐ ๋ชจ๋ ์ ์(AMD)
AMD๋ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ธฐ ์ํด ์ค๊ณ๋ ๋ชจ๋ ํ์์
๋๋ค. define() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ์ ์ํ๊ณ require() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค.
// math.js
define(function() {
function add(a, b) {
return a + b;
}
return {
add: add,
};
});
// app.js
require(['./math'], function(math) {
console.log(math.add(2, 3)); // Output: 5
});
3. ๋ฒ์ฉ ๋ชจ๋ ์ ์(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 {
// Browser globals (root is window)
factory(root.myModule = {});
}
}(typeof self !== 'undefined' ? self : this, function (exports) {
exports.add = function (a, b) {
return a + b;
};
}));
4. ES ๋ชจ๋ (ECMAScript ๋ชจ๋)
ES ๋ชจ๋์ ECMAScript 2015(ES6)์์ ๋์
๋ ํ์ค ๋ชจ๋ ํ์์
๋๋ค. import์ export ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ณ ๋ด๋ณด๋
๋๋ค.
// math.js
export function add(a, b) {
return a + b;
}
// app.js
import { add } from './math';
console.log(add(2, 3)); // Output: 5
์ฝ๋ ์คํ๋ฆฌํ : ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ฑ๋ฅ ํฅ์ํ๊ธฐ
์ฝ๋ ์คํ๋ฆฌํ ์ ์ฝ๋๋ฅผ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์ด๊ธฐ์ ๋ค์ด๋ก๋ํ๊ณ ํ์ฑํด์ผ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ ์ค์ฌ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์นํฉ์ด๋ ํ์ฌ๊ณผ ๊ฐ์ ๋๋ถ๋ถ์ ์ต์ ๋ฒ๋ค๋ฌ๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ๋ด์ฅ ์ง์ํฉ๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ ์ ์ข ๋ฅ:
- ์ง์ ์ ๋ถํ : ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ์ง์ ์ ์ ๋ณ๋์ ๋ฒ๋ค๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- ๋์ ์ํฌํธ: ๋์
import()๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํ์์ ๋ฐ๋ผ ๋ชจ๋์ ๋ก๋ํฉ๋๋ค. - ๋ฒค๋ ๋ถํ : ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์บ์๋ ์ ์๋ ๋ณ๋์ ๋ฒ๋ค๋ก ๋ถ๋ฆฌํฉ๋๋ค.
๋์ ์ํฌํธ ์์:
async function loadModule() {
const module = await import('./my-module');
module.doSomething();
}
button.addEventListener('click', loadModule);
์ด ์์์์๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋๋ง my-module ๋ชจ๋์ด ๋ก๋๋๋ฏ๋ก ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด ๊ฐ์ ๋ฉ๋๋ค.
ํธ๋ฆฌ ์์ดํน: ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐํ๊ธฐ
ํธ๋ฆฌ ์์ดํน์ ์ต์ข ๋ฒ๋ค์์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋(๋ฐ๋ ์ฝ๋)๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ๋ฒ๋ค์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํธ๋ฆฌ ์์ดํน์ ํนํ ES ๋ชจ๋์ ์ฌ์ฉํ ๋ ํจ๊ณผ์ ์ธ๋ฐ, ES ๋ชจ๋์ ๋ฒ๋ค๋ฌ๊ฐ ์ฝ๋๋ฅผ ์ ์ ์ผ๋ก ๋ถ์ํ์ฌ ์ฌ์ฉ๋์ง ์๋ exports๋ฅผ ์๋ณํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํธ๋ฆฌ ์์ดํน์ ์๋ ๋ฐฉ์:
- ๋ฒ๋ค๋ฌ๊ฐ ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๊ฐ ๋ชจ๋์ ๋ชจ๋ exports๋ฅผ ์๋ณํฉ๋๋ค.
- ๋ฒ๋ค๋ฌ๊ฐ import ๊ตฌ๋ฌธ์ ์ถ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ ๋ก ์ฌ์ฉ๋๋ exports๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ฒ๋ค๋ฌ๊ฐ ์ต์ข ๋ฒ๋ค์์ ์ฌ์ฉ๋์ง ์๋ ๋ชจ๋ exports๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
ํธ๋ฆฌ ์์ดํน ์์:
// utils.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
// app.js
import { add } from './utils';
console.log(add(2, 3)); // Output: 5
์ด ์์์์ subtract ํจ์๋ app.js ๋ชจ๋์์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ํธ๋ฆฌ ์์ดํน์ ์ต์ข
๋ฒ๋ค์์ subtract ํจ์๋ฅผ ์ ๊ฑฐํ์ฌ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ค์ผ ๊ฒ์
๋๋ค.
๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ ์ฝ๋ ๊ตฌ์ฑ ๋ชจ๋ฒ ์ฌ๋ก
ํจ๊ณผ์ ์ธ ์ฝ๋ ๊ตฌ์ฑ์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํ์์ ์ ๋๋ค. ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ชจ๋์ ์ํคํ ์ฒ ๋ฐ๋ฅด๊ธฐ: ์ฝ๋๋ฅผ ๋ช ํํ ์ฑ ์์ ๊ฐ์ง ์๊ณ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ก ๋๋๋๋ค.
- ES ๋ชจ๋ ์ฌ์ฉํ๊ธฐ: ES ๋ชจ๋์ ํธ๋ฆฌ ์์ดํน ๋ฐ ๊ธฐํ ์ต์ ํ์ ๊ฐ์ฅ ์ข์ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- ๊ธฐ๋ฅ๋ณ๋ก ๋ชจ๋ ๊ตฌ์ฑํ๊ธฐ: ๊ด๋ จ๋ ๋ชจ๋์ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋๋ ํฐ๋ฆฌ์ ํจ๊ป ๊ทธ๋ฃนํํฉ๋๋ค.
- ์ค๋ช ์ ์ธ ๋ชจ๋ ์ด๋ฆ ์ฌ์ฉํ๊ธฐ: ๋ชฉ์ ์ ๋ช ํํ๊ฒ ๋ํ๋ด๋ ๋ชจ๋ ์ด๋ฆ์ ์ ํํฉ๋๋ค.
- ์ํ ์์กด์ฑ ํผํ๊ธฐ: ์ํ ์์กด์ฑ์ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ๊ณ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ ์ฌ์ฉํ๊ธฐ: ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฆ ๋๋ค. ESLint๋ Prettier์ ๊ฐ์ ๋๊ตฌ๊ฐ ์ด ํ๋ก์ธ์ค๋ฅผ ์๋ํํ ์ ์์ต๋๋ค.
- ๋จ์ ํ ์คํธ ์์ฑํ๊ธฐ: ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ํ๊ท๋ฅผ ๋ฐฉ์งํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฝ๋ ๋ฌธ์ํํ๊ธฐ: ๋ค๋ฅธ ์ฌ๋(๊ทธ๋ฆฌ๊ณ ์์ )์ด ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๋ฌธ์ํํฉ๋๋ค.
- ์ฝ๋ ์คํ๋ฆฌํ ํ์ฉํ๊ธฐ: ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฝ๋ ์คํ๋ฆฌํ ์ ์ฌ์ฉํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ์์ฐ ์ต์ ํํ๊ธฐ: ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ์ ์ต์ ํํ์ฌ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ImageOptim์ macOS๋ฅผ ์ํ ํ๋ฅญํ ๋ฌด๋ฃ ๋๊ตฌ์ด๋ฉฐ, Cloudinary์ ๊ฐ์ ์๋น์ค๋ ํฌ๊ด์ ์ธ ์์ฐ ๊ด๋ฆฌ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ์ ์ ํฉํ ๋ชจ๋ ๋ฒ๋ค๋ฌ ์ ํํ๊ธฐ
๋ชจ๋ ๋ฒ๋ค๋ฌ์ ์ ํ์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ํ๋ก์ ํธ ๊ท๋ชจ ๋ฐ ๋ณต์ก์ฑ: ์ค์ ๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋จ์์ฑ๊ณผ ์ ๋ก ๊ตฌ์ฑ ์ ๊ทผ ๋ฐฉ์ ๋๋ฌธ์ ํ์ฌ์ด ์ข์ ์ ํ์ผ ์ ์์ต๋๋ค. ๋ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์นํฉ์ด ๋ ๋ง์ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฉ์ ์ ์ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ฑ๋ฅ ์๊ตฌ ์ฌํญ: ์ฑ๋ฅ์ด ์ค์ํ ๊ด์ฌ์ฌ๋ผ๋ฉด ๋กค์ ์ ํธ๋ฆฌ ์์ดํน ๊ธฐ๋ฅ์ด ์ ์ฉํ ์ ์์ต๋๋ค.
- ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค: ํน์ ๋ชจ๋ ํ์(์: CommonJS)์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ํ์์ ์ง์ํ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํด์ผ ํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ๊ฒฝํ: ๊ฐ ๋ฒ๋ค๋ฌ๊ฐ ์ ๊ณตํ๋ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ณ ๋ คํ์ญ์์ค. ์ผ๋ถ ๋ฒ๋ค๋ฌ๋ ๋ค๋ฅธ ๋ฒ๋ค๋ฌ๋ณด๋ค ๊ตฌ์ฑํ๊ณ ์ฌ์ฉํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ๊ฐ๋ ฅํ ์ปค๋ฎค๋ํฐ์ ํ๋ถํ ๋ฌธ์๋ฅผ ๊ฐ์ถ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํ์ญ์์ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ง์ ํ๋ ์น ๊ฐ๋ฐ์ ํ์์ ์ธ ๊ดํ์ ๋๋ค. ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ์ ํ๊ณ , ์์กด์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ ํฉํ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํ๊ณ , ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฝ๋ ๊ตฌ์ฑ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค. ์์ ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ๋ ๋๊ท๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ , ๋ชจ๋ ๋ฒ๋ค๋ง์ ์ฝ๋์ ํ์ง๊ณผ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ชจ๋ ๋ฒ๋ค๋ง, ์ฝ๋ ์คํ๋ฆฌํ , ํธ๋ฆฌ ์์ดํน์ ๋ค์ํ ์ธก๋ฉด์ ๊ณ ๋ คํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ ํจ์จ์ ์ด๊ณ , ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ, ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.