์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ฉํ์ฌ ๋์ ๋ชจ๋ ๊ตฌ์ฑ์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ํ๊ณ , ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์: ๋์ ๋ชจ๋ ๊ตฌ์ฑ
ํ๋ ์น ๊ฐ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. Webpack์ด๋ Parcel๊ณผ ๊ฐ์ ์ ํต์ ์ธ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํ์ง๋ง, ์ข ์ข ๋น๋ ๋จ๊ณ๋ฅผ ๋์ ํ๊ณ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต(import maps)์ ํ๊ฒฝ ๋ณ์(environment variables)์ ๊ฒฐํฉํ์ฌ ๋์ ๋ชจ๋ ๊ตฌ์ฑ์ ์ํ ๊ฐ๋ ฅํ ๋์์ ์ ๊ณตํ๋ฉฐ, ์ฌ๋น๋ ์์ด ๋ฐํ์์ ๋ชจ๋ ํด์์ ๋ง์ถค ์ค์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ค์ํ ๋ฐฐํฌ ๋จ๊ณ๋ ๊ณ ๊ฐ๋ณ ์ค์ ๊ณผ ๊ฐ์ด ๊ตฌ์ฑ์ด ์์ฃผ ๋ณ๊ฒฝ๋๋ ํ๊ฒฝ์์ ํนํ ์ ์ฉํฉ๋๋ค.
์ํฌํธ ๋งต ์ดํดํ๊ธฐ
์ํฌํธ ๋งต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ด ์ด๋ป๊ฒ ํด์๋๋์ง๋ฅผ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์
๋๋ค(์ค๋๋ ๋ธ๋ผ์ฐ์ ์ Node.js๋ฅผ ์ํด ํด๋ฆฌํ๋ ๊ฐ๋ฅํฉ๋๋ค). ์ด๋ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ์ง์ ์(import ๋ฌธ์์ ์ฌ์ฉ๋๋ ๋ฌธ์์ด)๋ฅผ ํน์ URL์ ๋งคํํ๋ ์กฐํ ํ
์ด๋ธ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ฐธ์กฐ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๋ฒ์ ๊ด๋ฆฌ: ๋จ์ํ ์ํฌํธ ๋งต์ ์ ๋ฐ์ดํธํ๋ ๊ฒ๋ง์ผ๋ก ๋ชจ๋์ ๋ค๋ฅธ ๋ฒ์ ๊ฐ์ ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
- CDN ํตํฉ: ์ต์ ํ๋ ๋ก๋ฉ ๋ฐ ์บ์ฑ์ ์ํด ๋ชจ๋ ์ง์ ์๋ฅผ CDN์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ/ํ๋ก๋์ ์ ํ: ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ตฌํ(์: ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ชจ์ ๋ฐ์ดํฐ, ํ๋ก๋์ ํ๊ฒฝ์ ์ค์ API ํธ์ถ)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ๋ณ์นญ: ๊ธธ๊ณ ์ฅํฉํ URL ๋์ ๋ ์งง๊ณ ์ค๋ช ์ ์ธ ๋ชจ๋ ์ง์ ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ํฌํธ ๋งต์ <script> ํ๊ทธ์ "importmap" ํ์
์ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค:
<script type="importmap">
{
"imports": {
"my-module": "/modules/my-module.js",
"lodash": "https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"
}
}
</script>
์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ ์ ์๋ ์ง์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
import myModule from 'my-module';
import _ from 'lodash';
myModule.doSomething();
console.log(_.VERSION);
ํ๊ฒฝ ๋ณ์ ํ์ฉํ๊ธฐ
ํ๊ฒฝ ๋ณ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์ธ๋ถ์์ ์ค์ ํ ์ ์๋ ๋์ ๊ฐ์ ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ๊ฒฝ(์: ๊ฐ๋ฐ, ์คํ ์ด์ง, ํ๋ก๋์ )์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ๋ณด์์์ ์ด์ ๋ก ์ค์ ํ๊ฒฝ ๋ณ์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ํ๋ก์ธ์ค๋ ๋น๋ ์ ๋์ฒด๋ฅผ ํตํด ํ์ด์ง์ ์ฃผ์ ํจ์ผ๋ก์จ ๊ทธ ๋์์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, Node.js ์๋ฒ์์ ํ๊ฒฝ ๋ณ์๋ฅผ HTML์ ํฌํจ์ํฌ ์ ์์ต๋๋ค:
// Node.js ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์์
const express = require('express');
const app = express();
app.get('/', (req, res) => {
const apiUrl = process.env.API_URL || 'http://localhost:3000/api';
const html = `
<!DOCTYPE html>
<html>
<head>
<title>Dynamic Module Configuration</title>
<script>
window.env = {
API_URL: '${apiUrl}'
};
</script>
</head>
<body>
<div id="root"></div>
<script src="/bundle.js"></script>
</body>
</html>
`;
res.send(html);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
์ด์ API_URL ํ๊ฒฝ ๋ณ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ window.env.API_URL์ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.
์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ฅผ ์ด์ฉํ ๋์ ๋ชจ๋ ๊ตฌ์ฑ
์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ฅผ ๊ฒฐํฉํ ๋ ์ง์ ํ ํ์ด ๋ฐํ๋ฉ๋๋ค. ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ํ๊ฒฝ์ ๋ฐ๋ผ ์ํฌํธ ๋งต์ ๋ชจ๋ URL์ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋น๋ํ์ง ์๊ณ ๋ ๋ค๋ฅธ ๋ชจ๋ ๋ฒ์ , API ์๋ํฌ์ธํธ ๋๋ ์ ์ฒด ๋ชจ๋ ๊ตฌํ ๊ฐ์ ์ ํํ ์ ์์ต๋๋ค.
๋ค์์ ์์์ ๋๋ค:
<script type="importmap">
{
"imports": {
"api-client": "${window.env.API_CLIENT_MODULE || '/modules/api-client.js'}"
}
}
</script>
์ด ์์์ api-client ๋ชจ๋์ API_CLIENT_MODULE ํ๊ฒฝ ๋ณ์์ ์ง์ ๋ URL๋ก ํด์๋ฉ๋๋ค. ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ(์: ๊ฐ๋ฐ ํ๊ฒฝ), ๊ธฐ๋ณธ๊ฐ์ธ /modules/api-client.js๋ก ์ค์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ
์คํธ์ฉ ๋ชจ์ API ํด๋ผ์ด์ธํธ๋ ์ค์ ๋ฐฑ์๋์ ์ฐ๊ฒฐ๋๋ ํ๋ก๋์
API ํด๋ผ์ด์ธํธ์ ๊ฐ์ด ๋ค๋ฅธ ํ๊ฒฝ์์ ๋ค๋ฅธ API ํด๋ผ์ด์ธํธ ๊ตฌํ์ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.
์ด ์ํฌํธ ๋งต์ ๋์ ์ผ๋ก ์์ฑํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ ์ฌ์ด๋ ํ
ํ๋ฆฟ ์ธ์ด๋ ๋น๋ ์ ๋์ฒด ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํต์ฌ์ HTML ์์ฑ ๊ณผ์ ์์ ํ๋ ์ด์คํ๋(${window.env.API_CLIENT_MODULE})๋ฅผ ํ๊ฒฝ ๋ณ์์ ์ค์ ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์
๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
1. API ์๋ํฌ์ธํธ ๊ตฌ์ฑ
๋ค๋ฅธ ํ๊ฒฝ์ ์ข ์ข ๋ค๋ฅธ API ์๋ํฌ์ธํธ๋ฅผ ํ์๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ก์ปฌ API ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ํ๋ก๋์ ํ๊ฒฝ์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ API ํด๋ผ์ด์ธํธ๊ฐ ์ฌ๋ฐ๋ฅธ ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋๋ก ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
<script type="importmap">
{
"imports": {
"api-client": "/modules/api-client.js"
}
}
</script>
<script>
import apiClient from 'api-client';
apiClient.setBaseUrl(window.env.API_URL || 'http://localhost:3000/api');
</script>
์ด ์์์ api-client ๋ชจ๋์ ๊ฐ์ ธ์ค๊ณ , ๊ทธ setBaseUrl ๋ฉ์๋๋ฅผ API_URL ํ๊ฒฝ ๋ณ์ ๊ฐ์ผ๋ก ํธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐํ์์ API ์๋ํฌ์ธํธ๋ฅผ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
2. ๊ธฐ๋ฅ ํ๋๊ทธ
๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๊ฒฝ์ด๋ ์ฌ์ฉ์์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ธฐ๋ฅ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ ์ ์์ต๋๋ค. ์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ ํ๋๊ทธ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋ ๊ตฌํ์ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์ต๋๋ค.
<script type="importmap">
{
"imports": {
"feature-module": "${window.env.FEATURE_ENABLED ? '/modules/feature-module-enabled.js' : '/modules/feature-module-disabled.js'}"
}
}
</script>
<script>
import featureModule from 'feature-module';
featureModule.run();
</script>
์ด ์์์ FEATURE_ENABLED ํ๊ฒฝ ๋ณ์๊ฐ true๋ก ์ค์ ๋๋ฉด feature-module-enabled.js ๋ชจ๋์ด ๋ก๋๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด feature-module-disabled.js ๋ชจ๋์ด ๋ก๋๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
3. ํ ๋ง ๋ฐ ํ์งํ
์ฌ๋ฌ ํ ๋ง๋ ํ์งํ ์ง์์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ํฌํธ ๋งต์ ์ฌ์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ ์ฌ์ฉ์ ์ ํธ๋์ ๋ฐ๋ผ ์ ์ ํ ํ ๋ง ๋๋ ํ์งํ ํ์ผ์ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๊ตญ์ด ์น์ฌ์ดํธ์์๋ ํ์ฌ ๋ก์ผ์ผ์ ๋ํ๋ด๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ํฌํธ ๋งต์ ์ฌ๋ฐ๋ฅธ ๋ฒ์ญ ํ์ผ์ ๋์ ์ผ๋ก ๊ฐ๋ฆฌํต๋๋ค. ๋ค๋ฅธ ํตํ์ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ญ์์ค. ์ํฌํธ ๋งต์ ์๋ฒ ์ธก์์ ๊ฒฐ์ ๋๊ณ ํ๊ฒฝ ๋ณ์๋ก ์ฃผ์ ๋ ์ฌ์ฉ์์ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํตํ ํฌ๋งทํฐ๋ ์ธ์ด ํฉ์ ํด์ํ ์ ์์ต๋๋ค.
4. A/B ํ ์คํธ
์ํฌํธ ๋งต์ A/B ํ
์คํธ์ ๊ฐ๋ ฅํ ์ ์์ต๋๋ค. ํ๊ฒฝ ๋ณ์(A/B ํ
์คํธ ํ๋ซํผ์ ์ํด ์ค์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์)์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฒ์ ์ ๋ชจ๋์ ์กฐ๊ฑด๋ถ๋ก ๋ก๋ํจ์ผ๋ก์จ ๋ค๋ฅธ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ์ํด ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ์ฌ์ดํธ์์ ๋ค๋ฅธ ๊ฒฐ์ ํ๋ฆ์ ํ
์คํธํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ญ์์ค. checkout ๋ชจ๋์ ๋ ๊ฐ์ง ๋ฒ์ ์ด ์กด์ฌํ ์ ์์ผ๋ฉฐ, ์ํฌํธ ๋งต์ ์ฌ์ฉ์์ A/B ํ
์คํธ ๊ทธ๋ฃน์ ๋ฐ๋ผ ์ฌ๋ฐ๋ฅธ ๋ฒ์ ์ผ๋ก ๋์ ์ผ๋ก ํด์๋์ด ์ฌ๋ฐฐํฌ ์์ด ์ ํ์จ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ ๋ณํ์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋๊ท๋ชจ ๋ฐฐํฌ์ ํนํ ์ ์ฉํฉ๋๋ค.
๋์ ๋ชจ๋ ๊ตฌ์ฑ์ ์ด์
- ์ ์ฐ์ฑ: ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ํ๊ฒฝ์ ์ฝ๊ฒ ์ ์์ํฌ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ: ๋ค๋ฅธ ๊ณ ๊ฐ์ด๋ ๋ฐฐํฌ ๋จ๊ณ๋ฅผ ์ํ ๋ค์ํ ๊ตฌ์ฑ์ ์ง์ํฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ: ๋น๋ ํ๋ก์ธ์ค์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ์ ํฉ๋๋ค.
- ๋น๋ ์๊ฐ ๋จ์ถ: ๋ชจ๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ๋ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋น๋ํ ํ์๊ฐ ์์ต๋๋ค.
- ๋จ์ํ๋ ๋ฐฐํฌ: ๋์ผํ ์ฝ๋๋ฅผ ๋ค๋ฅธ ๊ตฌ์ฑ์ผ๋ก ์ฌ๋ฌ ํ๊ฒฝ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ณด์: ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ ธ์ถํ์ง ์๋๋ก ์ฃผ์ํ์ญ์์ค. ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ์์ ํ ๊ตฌ์ฑ ๊ด๋ฆฌ ์์คํ ์ ์ ์ฅํ์ญ์์ค.
- ๋ณต์ก์ฑ: ๋์ ๋ชจ๋ ๊ตฌ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ ๋ํ ์ ์์ต๋๋ค. ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ๊ตฌ์ฑ ์ ๋ต์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ: ์ํฌํธ ๋งต์ ๋น๊ต์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค. ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด ํด๋ฆฌํ์ ์ฌ์ฉํ์ญ์์ค. ๋ ๋์ ์ง์์ ์ํด es-module-shims์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ํ ์คํ : ์ง์๋๋ ๋ชจ๋ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ๋์ ๊ตฌ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
- ์ฑ๋ฅ: ๋์ ๋ชจ๋ ํด์์ ์ฝ๊ฐ์ ์ฑ๋ฅ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ํ์์ ๋ฐ๋ผ ์ต์ ํํ์ญ์์ค.
- ๋์ฒด ๋ฉ์ปค๋์ฆ: ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋๋ก ํญ์ ํ๊ฒฝ ๋ณ์์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ์ญ์์ค.
- ์ ํจ์ฑ ๊ฒ์ฌ: ํ๊ฒฝ ๋ณ์์ ํ์๊ณผ ๊ฐ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ์ฌ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ญ์์ค. ์ด๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ค์ ์ง์ค์ ๊ตฌ์ฑ: ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ํ๊ฒฝ ๋ณ์ ์ ์๋ฅผ ํฉ์ด๋์ง ๋ง์ญ์์ค. ์ค์ ์ง์ค์ ๊ตฌ์ฑ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ๊ฒฝ ๋ณ์์ ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ๊ด๋ฆฌํ์ญ์์ค.
Node.js ํธํ์ฑ
์ํฌํธ ๋งต์ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ด์ง๋ง, es-module-shims์ ๊ฐ์ ํจํค์ง์ ๋์์ผ๋ก Node.js์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ธก๊ณผ ์๋ฒ ์ธก ์ฝ๋ ๋ชจ๋์์ ์ผ๊ด๋ ๋ชจ๋ ํด์ ์ ๋ต์ ์ ์งํ์ฌ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ด์งํ๊ณ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค.
// es-module-shims๋ฅผ ์ฌ์ฉํ Node.js ์์
const esmsInit = require('es-module-shims').init;
esmsInit();
// ์ ์ญ ์ค์ฝํ์ ์ํฌํธ ๋งต ์ถ๊ฐ
global.esmsDefine = globalThis.esmsDefine;
global.esmsDefine({
imports: {
'my-module': './my-module.js'
}
});
// ์ด์ ํ์์ฒ๋ผ import ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค
import('my-module')
.then(module => {
module.default.doSomething();
})
.catch(err => {
console.error(err);
});
๋ชจ๋ ๊ตฌ์ฑ์ ๋ฏธ๋
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ ๋ ์ ์ฐํ๊ณ ๋์ ์ธ ๋ชจ๋ ๊ตฌ์ฑ์ ํฅํ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ด ์ฑ์ํ๊ณ ๋ ๋๋ฆฌ ์ฑํ๋จ์ ๋ฐ๋ผ, ํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ ๋ ์ค์ํ ๋ถ๋ถ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ด์ ์ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ๋๊ตฌ์ ๋ฐ์ ์ ๊ณ์ ์ฃผ๋ชฉํ์ญ์์ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต๊ณผ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋์ ๋ชจ๋ ๊ตฌ์ฑ์ ๋ฐํ์์ ๋ชจ๋ ํด์์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ๊ฒฐํฉํจ์ผ๋ก์จ ๋ค๋ฅธ ํ๊ฒฝ์ ์ฝ๊ฒ ์ ์ํ ์ ์๋ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ๊ณ ๋ ค ์ฌํญ์ด ์์ง๋ง, ์ด ์ ๊ทผ ๋ฐฉ์์ ์ด์ ์ ํ๋ ์น ๊ฐ๋ฐ์์๊ฒ ๊ท์คํ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ์ฑํํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์ ๋ ํฐ ์ ์ฐ์ฑ์ ํ๋ณดํ๊ณ , ๋น๋ฒํ ์ฌ๋น๋์ ์ค๋ฒํค๋ ์์ด ์ํํ ๋ฐฐํฌ, A/B ํ ์คํธ ๋ฐ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ํ์ฑํํ์ญ์์ค. ์๊ท๋ชจ ํ๋ก์ ํธ์์ ์์ ํ๋ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๋ , ๋์ ๋ชจ๋ ๊ตฌ์ฑ์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํ๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ฐ๋ ์ ์คํํ๊ณ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์กฐ์ ํ๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๊ด๋ฆฌ์ ๋ฏธ๋๋ฅผ ๋ฐ์๋ค์ด์ญ์์ค.