์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํํ์์ ๊ฐ๋ ฅํ ๋์ ๋ชจ๋ ์์ฑ ๊ธฐ๋ฅ์ ์์๋ณด์ธ์. ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ํ ์ค์ฉ์ ์ธ ๊ธฐ์ , ๊ณ ๊ธ ํจํด ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐฐ์๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํํ์: ๋์ ๋ชจ๋ ์์ฑ ๋ง์คํฐํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์์ ๋๋ค. ๋ชจ๋์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ, ๊ทธ๋ฆฌ๊ณ ์ฒด๊ณ์ ์ธ ๊ตฌ์ฑ์ ์ด์งํฉ๋๋ค. ํ์ค ES ๋ชจ๋์ด ์ ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ๋ชจ๋ ํํ์์ ๋ชจ๋์ ๋์ ์ผ๋ก ์ ์ํ๊ณ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํํ์์ ์ธ๊ณ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ๊ธฐ๋ฅ, ์ฌ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํฉ๋๋ค. ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ํจํด๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ์ด ๋์ ๋ชจ๋ ์์ฑ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ ์ ์๋๋ก ๋์๋๋ฆฝ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํํ์์ด๋ ๋ฌด์์ธ๊ฐ์?
๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ํํ์์ ๋ชจ๋๋ก ํ๊ฐ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์
๋๋ค. import
์ export
๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์๋๋ ์ ์ ES ๋ชจ๋๊ณผ ๋ฌ๋ฆฌ, ๋ชจ๋ ํํ์์ ๋ฐํ์์ ์์ฑ๋๊ณ ์คํ๋ฉ๋๋ค. ์ด๋ฌํ ๋์ ํน์ฑ์ ๋ ์ ์ฐํ๊ณ ์ ์์ฑ ์๋ ๋ชจ๋ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ๋ชจ๋ ์์กด์ฑ์ด๋ ๊ตฌ์ฑ์ด ๋ฐํ์๊น์ง ์๋ ค์ง์ง ์๋ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค.
์ฌ์ฉ์ ์ ํธ๋๋ ์๋ฒ ์ธก ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋์ ๋ก๋ํด์ผ ํ๋ ์ํฉ์ ์๊ฐํด๋ณด์ธ์. ๋ชจ๋ ํํ์์ ์ด๋ฌํ ๋์ ๋ก๋ฉ๊ณผ ์ธ์คํด์คํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ๋ชจ๋ ํํ์์ ์ฌ์ฉํด์ผ ํ ๊น์?
๋ชจ๋ ํํ์์ ๊ธฐ์กด์ ์ ์ ๋ชจ๋์ ๋นํด ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค:
- ๋์ ๋ชจ๋ ๋ก๋ฉ: ๋ฐํ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ชจ๋์ ์์ฑํ๊ณ ๋ก๋ํ ์ ์์ด ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์กฐ๊ฑด๋ถ ๋ชจ๋ ์์ฑ: ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ชจ๋์ ์์ฑํ๊ฑฐ๋ ๊ฑด๋๋ธ ์ ์์ด ๋ฆฌ์์ค ์ฌ์ฉ์ ์ต์ ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ์์กด์ฑ ์ฃผ์ : ๋ชจ๋์ด ๋์ ์ผ๋ก ์์กด์ฑ์ ๋ฐ์ ์ ์์ด ๋์จํ ๊ฒฐํฉ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ ์ด์งํฉ๋๋ค.
- ๊ตฌ์ฑ ๊ธฐ๋ฐ ๋ชจ๋ ์์ฑ: ๋ชจ๋ ๊ตฌ์ฑ์ ์ธ๋ถํํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์ฐ๊ฒฐํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด๋ณด์ธ์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ด๋นํ๋ ํน์ ๋ชจ๋์ ์ฌ์ฉ์์ ์ง์ญ์ด๋ ๊ตฌ๋ ์์ค์ ๋ฐ๋ผ ๋ฐํ์์ ๊ฒฐ์ ๋ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก
๋ชจ๋ ํํ์์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์๋๋ฆฌ์ค์์ ํ์ฉ๋ฉ๋๋ค:
- ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ: ์ฌ์ฉ์ ๊ตฌ์ฑ์ด๋ ์์คํ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ํ๋ฌ๊ทธ์ธ์ ๋์ ์ผ๋ก ๋ก๋ํ๊ณ ๋ฑ๋กํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS)์ ์ฌ์ฉ์์ ์ญํ ๊ณผ ํธ์ง ์ค์ธ ์ฝํ ์ธ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฝํ ์ธ ํธ์ง ํ๋ฌ๊ทธ์ธ์ ๋ก๋ํ๊ธฐ ์ํด ๋ชจ๋ ํํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ฅ ํ ๊ธ: ํต์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์์ ํ์ง ์๊ณ ๋ฐํ์์ ํน์ ๊ธฐ๋ฅ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค. A/B ํ ์คํธ ํ๋ซํผ์ ์ข ์ข ๊ธฐ๋ฅ ํ ๊ธ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์ ์ธ๊ทธ๋จผํธ์ ๋ํด ๋ค๋ฅธ ๋ฒ์ ์ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ์ ํํฉ๋๋ค.
- ๊ตฌ์ฑ ๊ด๋ฆฌ: ํ๊ฒฝ ๋ณ์๋ ๊ตฌ์ฑ ํ์ผ์ ๋ฐ๋ผ ๋ชจ๋ ๋์์ ์ฌ์ฉ์ ์ ์ํฉ๋๋ค. ๋ฉํฐ ํ ๋ํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด๋ณด์ธ์. ๋ชจ๋ ํํ์์ ํ ๋ํธ์ ๊ณ ์ ์ค์ ์ ๋ฐ๋ผ ํ ๋ํธ๋ณ ๋ชจ๋์ ๋์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading): ๋ชจ๋์ด ํ์ํ ๋๋ง ๋ก๋ํ์ฌ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ๋ฐ์ดํฐ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ๊ณ ๊ธ ์ฐจํธ ๊ธฐ๋ฅ์ด ํ์ํ ํ์ด์ง๋ก ์ด๋ํ ๋๋ง ๋ก๋๋ ์ ์์ต๋๋ค.
๋ชจ๋ ํํ์์ ๋ง๋๋ ๊ธฐ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ํํ์์ ๋ง๋๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ธฐ์ ์ด ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ช ๊ฐ์ง ์ ๊ทผ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ฆ์ ์คํ ํจ์ ํํ์ (IIFE)
IIFE๋ ๋ชจ๋์ ๋ฐํํ ์ ์๋ ์์ฒด ์คํ ํจ์๋ฅผ ๋ง๋๋ ๊ณ ์ ์ ์ธ ๊ธฐ์ ์ ๋๋ค. ์ฝ๋๋ฅผ ์บก์ํํ๊ณ ๋น๊ณต๊ฐ ์ค์ฝํ๋ฅผ ์์ฑํ์ฌ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ๋ชจ๋์ ๋ด๋ถ ์ํ๊ฐ ๋ณดํธ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
const myModule = (function() {
let privateVariable = 'This is private';
function publicFunction() {
console.log('Accessing private variable:', privateVariable);
}
return {
publicFunction: publicFunction
};
})();
myModule.publicFunction(); // Output: Accessing private variable: This is private
์ด ์์์ IIFE๋ privateVariable
์ ์ ๊ทผํ ์ ์๋ publicFunction
์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. IIFE๋ privateVariable
์ด ๋ชจ๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
2. ํฉํ ๋ฆฌ ํจ์
ํฉํ ๋ฆฌ ํจ์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. ๋ค๋ฅธ ๊ตฌ์ฑ์ด๋ ์์กด์ฑ์ ๊ฐ์ง ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฌ์ฉ์ฑ์ ์ด์งํ๊ณ ๋์ผํ ๋ชจ๋์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ์ ์ ์๋ ๋์์ผ๋ก ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํฉ๋๋ค. ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์(์: ์ฝ์, ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ๋ก๊ทธ๋ฅผ ์์ฑํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ ๋ก๊น ๋ชจ๋์ ์๊ฐํด๋ณด์ธ์.
function createModule(config) {
const { apiUrl } = config;
function fetchData() {
return fetch(apiUrl)
.then(response => response.json());
}
return {
fetchData: fetchData
};
}
const module1 = createModule({ apiUrl: 'https://api.example.com/data1' });
const module2 = createModule({ apiUrl: 'https://api.example.com/data2' });
module1.fetchData().then(data => console.log('Module 1 data:', data));
module2.fetchData().then(data => console.log('Module 2 data:', data));
์ฌ๊ธฐ์ createModule
์ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๊ตฌ์ฑ๋ apiUrl
์ ์ฌ์ฉํ๋ fetchData
ํจ์๋ฅผ ๊ฐ์ง ๋ชจ๋์ ๋ฐํํ๋ ํฉํ ๋ฆฌ ํจ์์
๋๋ค.
3. ๋น๋๊ธฐ ํจ์์ ๋์ ์ํฌํธ
๋น๋๊ธฐ ํจ์์ ๋์ ์ํฌํธ(import()
)๋ฅผ ๊ฒฐํฉํ์ฌ ๋น๋๊ธฐ ์์
์ด๋ ๋์ ์ผ๋ก ๋ก๋๋๋ ๋ค๋ฅธ ๋ชจ๋์ ์์กดํ๋ ๋ชจ๋์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋์ ์ง์ฐ ๋ก๋ฉํ๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ด ํ์ํ ์์กด์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค. ์ฌ์ฉ์์ ์์น์ ๋ฐ๋ผ ๋ค๋ฅธ ์ง๋ ํ์ผ์ ๋ก๋ํด์ผ ํ๋ ์ง๋ ์ปดํฌ๋ํธ๋ฅผ ์์ํด๋ณด์ธ์. ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์์ ์์น๊ฐ ์๋ ค์ก์ ๋๋ง ์ ์ ํ ํ์ผ ์ธํธ๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.
async function createModule() {
const lodash = await import('lodash'); // Assuming lodash is not bundled initially
const _ = lodash.default;
function processData(data) {
return _.map(data, item => item * 2);
}
return {
processData: processData
};
}
createModule().then(module => {
const data = [1, 2, 3, 4, 5];
const processedData = module.processData(data);
console.log('Processed data:', processedData); // Output: [2, 4, 6, 8, 10]
});
์ด ์์์ createModule
ํจ์๋ import('lodash')
๋ฅผ ์ฌ์ฉํ์ฌ Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Lodash๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ processData
ํจ์๋ฅผ ๊ฐ์ง ๋ชจ๋์ ๋ฐํํฉ๋๋ค.
4. if
๋ฌธ์ ์ฌ์ฉํ ์กฐ๊ฑด๋ถ ๋ชจ๋ ์์ฑ
if
๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋์ ์กฐ๊ฑด๋ถ๋ก ์์ฑํ๊ณ ๋ฐํํ ์ ์์ต๋๋ค. ์ด๋ ํ๊ฒฝ์ด๋ ์ฌ์ฉ์ ์ ํธ๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋ ๊ตฌํ์ ์ ๊ณตํด์ผ ํ๋ ์๋๋ฆฌ์ค์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ์ค์๋ ๋ชจ์ API ๋ชจ๋์ ์ฌ์ฉํ๊ณ ํ๋ก๋์
ํ๊ฒฝ์์๋ ์ค์ API ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
function createModule(isProduction) {
if (isProduction) {
return {
getData: () => fetch('https://api.example.com/data').then(res => res.json())
};
} else {
return {
getData: () => Promise.resolve([{ id: 1, name: 'Mock Data' }])
};
}
}
const productionModule = createModule(true);
const developmentModule = createModule(false);
productionModule.getData().then(data => console.log('Production data:', data));
developmentModule.getData().then(data => console.log('Development data:', data));
์ฌ๊ธฐ์ createModule
ํจ์๋ isProduction
ํ๋๊ทธ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋์ ๋ฐํํฉ๋๋ค. ํ๋ก๋์
ํ๊ฒฝ์์๋ ์ค์ API ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ณ ๊ธ ํจํด ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๋ชจ๋ ํํ์์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณ ๊ธ ํจํด๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
1. ์์กด์ฑ ์ฃผ์
์์กด์ฑ ์ฃผ์ ์ ๋ชจ๋์ ์ธ๋ถ์์ ์์กด์ฑ์ ์ ๊ณตํ์ฌ ๋์จํ ๊ฒฐํฉ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ ์ด์งํ๋ ๋์์ธ ํจํด์ ๋๋ค. ๋ชจ๋ ํํ์์ ๋ชจ๋ ์์ฑ ํจ์์ ์ธ์๋ก ์์กด์ฑ์ ๋ฐ์๋ค์ฌ ์์กด์ฑ ์ฃผ์ ์ ์ฝ๊ฒ ์ง์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋์ ํต์ฌ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ํ ์คํธ๋ฅผ ์ํด ์์กด์ฑ์ ๊ต์ฒดํ๊ฑฐ๋ ๋ชจ๋ ๋์์ ์ฌ์ฉ์ ์ ์ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
function createModule(logger, apiService) {
function fetchData(url) {
logger.log('Fetching data from:', url);
return apiService.get(url)
.then(response => {
logger.log('Data fetched successfully:', response);
return response;
})
.catch(error => {
logger.error('Error fetching data:', error);
throw error;
});
}
return {
fetchData: fetchData
};
}
// Example Usage (assuming logger and apiService are defined elsewhere)
// const myModule = createModule(myLogger, myApiService);
// myModule.fetchData('https://api.example.com/data');
์ด ์์์ createModule
ํจ์๋ logger
์ apiService
๋ฅผ ์์กด์ฑ์ผ๋ก ๋ฐ์๋ค์ด๋ฉฐ, ์ด๋ค์ ๋ชจ๋์ fetchData
ํจ์ ๋ด์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ์์ฒด๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ค๋ฅธ ๋ก๊ฑฐ ๋๋ API ์๋น์ค ๊ตฌํ์ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค.
2. ๋ชจ๋ ๊ตฌ์ฑ
๋ชจ๋ ๊ตฌ์ฑ์ ์ธ๋ถํํ์ฌ ๋ชจ๋์ ๋ ์ ์์ฑ ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋์ธ์. ์ด๋ ๋ชจ๋ ์์ฑ ํจ์์ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ฌ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ชจ๋์ ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ๊ตฌ์ฑ์ ๊ตฌ์ฑ ํ์ผ, ํ๊ฒฝ ๋ณ์ ๋๋ ์ฌ์ฉ์ ์ ํธ๋์์ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก ๋ชจ๋์ด ๋ค์ํ ํ๊ฒฝ๊ณผ ์ฌ์ฉ ์ฌ๋ก์ ๋งค์ฐ ์ ์๋ ฅ์ด ๋์์ง๋๋ค.
function createModule(config) {
const { apiUrl, timeout } = config;
function fetchData() {
return fetch(apiUrl, { timeout: timeout })
.then(response => response.json());
}
return {
fetchData: fetchData
};
}
// Example Usage
const config = {
apiUrl: 'https://api.example.com/data',
timeout: 5000 // milliseconds
};
const myModule = createModule(config);
myModule.fetchData().then(data => console.log('Data:', data));
์ฌ๊ธฐ์ createModule
ํจ์๋ apiUrl
๊ณผ timeout
์ ์ง์ ํ๋ config
๊ฐ์ฒด๋ฅผ ๋ฐ์๋ค์
๋๋ค. fetchData
ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ด๋ฌํ ๊ตฌ์ฑ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
3. ์ค๋ฅ ์ฒ๋ฆฌ
๋ชจ๋ ํํ์ ๋ด์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์๊ธฐ์น ์์ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ ์ฉํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์. try...catch
๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ธ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ๊ธฐ๋กํ์ธ์. ์ค์ ์ง์ค์ ์ค๋ฅ ๋ก๊น
์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ ์ค๋ฅ๋ฅผ ์ถ์ ํ๊ณ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
function createModule() {
function fetchData() {
try {
return fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.json();
})
.catch(error => {
console.error('Error fetching data:', error);
throw error; // Re-throw the error to be handled further up the call stack
});
} catch (error) {
console.error('Unexpected error in fetchData:', error);
throw error;
}
}
return {
fetchData: fetchData
};
}
4. ๋ชจ๋ ํํ์ ํ ์คํธ
๋ชจ๋ ํํ์์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ๋ชจํน ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๊ฒฉ๋ฆฌํ๊ณ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๋ฅผ ํ ์คํธํ์ธ์. ๋ชจ๋ ํํ์์ ์ข ์ข ๋์ ์์กด์ฑ์ ํฌํจํ๋ฏ๋ก ๋ชจํน์ ์ฌ์ฉํ๋ฉด ํ ์คํธ ์ค์ ํด๋น ์์กด์ฑ์ ๋์์ ์ ์ดํ์ฌ ํ ์คํธ๊ฐ ์ ๋ขฐํ ์ ์๊ณ ์์ธก ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. Jest๋ Mocha์ ๊ฐ์ ๋๊ตฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋ชจํน๊ณผ ํ ์คํธ๋ฅผ ํ๋ฅญํ๊ฒ ์ง์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ชจ๋ ํํ์์ด ์ธ๋ถ API์ ์์กดํ๋ ๊ฒฝ์ฐ API ์๋ต์ ๋ชจํนํ์ฌ ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ๋ชจ๋์ด ํด๋น ์๋๋ฆฌ์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
5. ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
๋ชจ๋ ํํ์์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ํฅ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค. ๊ณผ๋ํ ๋์ ๋ชจ๋ ์์ฑ์ ์์ ์๊ฐ๊ณผ ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํ๊ธฐ ์ํด ๋ชจ๋์ ์บ์ฑํ๊ฑฐ๋ ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
๋ํ import()
๋ ๋น๋๊ธฐ์ ์ด๋ฉฐ Promise๋ฅผ ๋ฐํํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ๊ฒฝ์ ์กฐ๊ฑด์ด๋ ์๊ธฐ์น ์์ ๋์์ ํผํ๊ธฐ ์ํด Promise๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ธ์.
๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์์ ์์
๋ชจ๋ ํํ์์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ๋ง๊ฒ ์กฐ์ ๋ ์ ์์ต๋๋ค:
- ๋ธ๋ผ์ฐ์ : IIFE, ํฉํ ๋ฆฌ ํจ์ ๋๋ ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ๋ชจ๋์ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ IIFE๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ณ ์ ์ญ ๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค.
- Node.js: ํฉํ ๋ฆฌ ํจ์๋
require()
์ ํจ๊ป ๋์ ์ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ Node.js์์ ๋ชจ๋์ ๋ง๋ญ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ์๋ฒ ์ธก ๋ชจ๋์ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋งค๊ฐ๋ณ์๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. - ์๋ฒ๋ฆฌ์ค ํจ์ (์: AWS Lambda, Azure Functions): ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ ํนํ๋ ๋ชจ๋์ ๋ง๋ญ๋๋ค. ์ด๋ฌํ ๋ชจ๋์ ๊ตฌ์ฑ์ ํ๊ฒฝ ๋ณ์๋ ๊ตฌ์ฑ ํ์ผ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ชจ๋ ํํ์์ ๋์
๋ชจ๋ ํํ์์ ๋์ ๋ชจ๋ ์์ฑ์ ์ํ ๊ฐ๋ ฅํ ์ ๊ทผ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ๊ฐ์ง ์ฌ๋ฌ ๋์์ด ์กด์ฌํฉ๋๋ค. ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ๋ฒ์ ์ ํํ๊ธฐ ์ํด ์ด๋ฌํ ๋์์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ ์ ES ๋ชจ๋ (
import
/export
): ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋์ ์ ์ํ๋ ํ์ค ๋ฐฉ๋ฒ์ ๋๋ค. ์ ์ ๋ชจ๋์ ์ปดํ์ผ ์์ ์ ๋ถ์๋์ด ํธ๋ฆฌ ์์ดํน(tree shaking) ๋ฐ ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ(dead code elimination)์ ๊ฐ์ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ํํ์์ ๋์ ์ ์ฐ์ฑ์ ๋ถ์กฑํฉ๋๋ค. - CommonJS (
require
/module.exports
): Node.js์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ชจ๋ ์์คํ ์ ๋๋ค. CommonJS ๋ชจ๋์ ๋ฐํ์์ ๋ก๋๋๊ณ ์คํ๋์ด ์ด๋ ์ ๋์ ๋์ ๋์์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋์ง ์์ผ๋ฉฐ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. - ๋น๋๊ธฐ ๋ชจ๋ ์ ์ (AMD): ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. AMD๋ ES ๋ชจ๋์ด๋ CommonJS๋ณด๋ค ๋ณต์กํ์ง๋ง ๋น๋๊ธฐ ์์กด์ฑ์ ๋ํ ๋ ๋์ ์ง์์ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํํ์์ ๋์ ์ผ๋ก ๋ชจ๋์ ์์ฑํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์ ์ค๋ช ํ ๊ธฐ์ , ํจํด, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ๋ ์ ์์ฑ ์๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํ ์คํธํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ชจ๋ ํํ์์ ํ์ฉํ ์ ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ถํฐ ๊ตฌ์ฑ ๊ด๋ฆฌ์ ์ด๋ฅด๊ธฐ๊น์ง, ๋ชจ๋ ํํ์์ ๋ณต์กํ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฌ์ ์ ๊ณ์ํ๋ฉด์ ์ฝ๋ ๊ตฌ์ฑ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ์์ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด๊ธฐ ์ํด ๋ชจ๋ ํํ์์ ์คํํด ๋ณด์ธ์. ๋์ ๋ชจ๋ ์์ฑ์ ์ด์ ๊ณผ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ํฅ์ ๋น๊ตํ์ฌ ํ๋ก์ ํธ์ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ๋ฒ์ ์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๋ชจ๋ ํํ์์ ๋ง์คํฐํจ์ผ๋ก์จ ํ๋ ์น์ ์ํ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ค๋น๊ฐ ์ ๋ ๊ฒ์ ๋๋ค.