ํ์ฅ ๊ฐ๋ฅํ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ํ ์คํธ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ JavaScript ๋ชจ๋ ์ํคํ ์ฒ ๋์์ธ ํจํด์ ํ์ํฉ๋๋ค. ์ค์ฉ์ ์ธ ์์ ์ ํจ๊ป ๋ค์ํ ํจํด์ ๋ํด ์์๋ณด์ธ์.
JavaScript ๋ชจ๋ ์ํคํ ์ฒ: ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋์์ธ ํจํด
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ JavaScript๋ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์กฐํํ๋ ๊ฒ์ด ๋ฌด์๋ณด๋ค ์ค์ํด์ง๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ JavaScript ๋ชจ๋ ์ํคํ ์ฒ์ ๋์์ธ ํจํด์ด ๋ฑ์ฅํฉ๋๋ค. ์ด๊ฒ๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ํ ์คํธ ๊ฐ๋ฅํ ๋จ์๋ก ๊ตฌ์ฑํ๊ธฐ ์ํ ์ฒญ์ฌ์ง์ ์ ๊ณตํฉ๋๋ค.
JavaScript ๋ชจ๋์ด๋ ๋ฌด์์ธ๊ฐ?
ํต์ฌ์ ์ผ๋ก ๋ชจ๋์ ๋ฐ์ดํฐ์ ๋์์ ์บก์ํํ๋ ๋ ๋ฆฝ์ ์ธ ์ฝ๋ ๋จ์์ ๋๋ค. ์ด๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถํ ํ์ฌ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ด์งํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ๋ชจ๋์ ๋ ํฐ ๊ตฌ์กฐ์ ๋น๋ฉ ๋ธ๋ก์ด๋ผ๊ณ ์์ํด๋ณด์ธ์. ๊ฐ ๋ธ๋ก์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ๊ฐ์ญํ์ง ์์ผ๋ฉด์ ํน์ ๊ธฐ๋ฅ์ ๊ธฐ์ฌํฉ๋๋ค.
๋ชจ๋ ์ฌ์ฉ์ ์ฃผ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฅ์๋ ์ฝ๋ ๊ตฌ์ฑ: ๋ชจ๋์ ํฐ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋จ์๋ก ๋๋๋๋ค.
- ์ฆ๊ฐ๋ ์ฌ์ฌ์ฉ์ฑ: ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํฅ์๋ ์ ์ง๋ณด์์ฑ: ๋ชจ๋ ๋ด์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
- ๋ ๋์ ํ ์คํธ ๊ฐ๋ฅ์ฑ: ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์์ด ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์์ ํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
- ๋ค์์คํ์ด์ค ๊ด๋ฆฌ: ๋ชจ๋์ ์์ฒด ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํ์ฌ ์ด๋ฆ ์ถฉ๋์ ํผํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
JavaScript ๋ชจ๋ ์์คํ ์ ์งํ
๋ชจ๋์ ๋ํ JavaScript์ ์ฌ์ ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฐ์ ํด ์์ต๋๋ค. ์ญ์ฌ์ ๋งฅ๋ฝ์ ๊ฐ๋ตํ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์ญ ๋ค์์คํ์ด์ค: ์ด๊ธฐ์๋ ๋ชจ๋ JavaScript ์ฝ๋๊ฐ ์ ์ญ ๋ค์์คํ์ด์ค์ ์กด์ฌํ์ฌ ์ ์ฌ์ ์ธ ์ด๋ฆ ์ถฉ๋์ ์ผ์ผํค๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ์ด๋ ต๊ฒ ๋ง๋ค์์ต๋๋ค.
- IIFE (์ฆ์ ์คํ ํจ์ ํํ์): IIFE๋ ๊ฒฉ๋ฆฌ๋ ์ค์ฝํ๋ฅผ ๋ง๋ค๊ณ ๋ชจ๋์ ์๋ฎฌ๋ ์ด์ ํ๋ ค๋ ์ด๊ธฐ ์๋์์ต๋๋ค. ์ด๋ ์ ๋์ ์บก์ํ๋ฅผ ์ ๊ณตํ์ง๋ง ์ ์ ํ ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋ถ์กฑํ์ต๋๋ค.
- CommonJS: CommonJS๋ ์๋ฒ ์ฌ์ด๋ JavaScript(Node.js)๋ฅผ ์ํ ๋ชจ๋ ํ์ค์ผ๋ก ๋ฑ์ฅํ์ต๋๋ค.
require()
์module.exports
๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. - AMD (๋น๋๊ธฐ ๋ชจ๋ ์ ์): AMD๋ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ฉํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. RequireJS์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ํํ ์ฌ์ฉ๋ฉ๋๋ค.
- ES ๋ชจ๋ (ECMAScript ๋ชจ๋): ES ๋ชจ๋(ESM)์ JavaScript์ ๋ด์ฅ๋ ๋ค์ดํฐ๋ธ ๋ชจ๋ ์์คํ
์
๋๋ค.
import
์export
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉฐ ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js์์ ์ง์๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ JavaScript ๋ชจ๋ ๋์์ธ ํจํด
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ JavaScript์์ ๋ชจ๋ ์์ฑ์ ์ฉ์ดํ๊ฒ ํ๋ ์ฌ๋ฌ ๋์์ธ ํจํด์ด ๋ฑ์ฅํ์ต๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ช ๊ฐ์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ๋ชจ๋ ํจํด
๋ชจ๋ ํจํด์ IIFE๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ณต๊ฐ ์ค์ฝํ๋ฅผ ๋ง๋๋ ๊ณ ์ ์ ์ธ ๋์์ธ ํจํด์ ๋๋ค. ๋ด๋ถ ๋ฐ์ดํฐ์ ํจ์๋ ์จ๊ธฐ๋ฉด์ ๊ณต๊ฐ API๋ฅผ ๋ ธ์ถํฉ๋๋ค.
์์ :
const myModule = (function() {
// ๋น๊ณต๊ฐ ๋ณ์ ๋ฐ ํจ์
let privateCounter = 0;
function privateMethod() {
privateCounter++;
console.log('๋น๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ. ์นด์ดํฐ:', privateCounter);
}
// ๊ณต๊ฐ API
return {
publicMethod: function() {
console.log('๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ.');
privateMethod(); // ๋น๊ณต๊ฐ ๋ฉ์๋์ ์ ๊ทผ
},
getCounter: function() {
return privateCounter;
}
};
})();
myModule.publicMethod(); // ์ถ๋ ฅ: ๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ.
// ๋น๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ. ์นด์ดํฐ: 1
myModule.publicMethod(); // ์ถ๋ ฅ: ๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ.
// ๋น๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ. ์นด์ดํฐ: 2
console.log(myModule.getCounter()); // ์ถ๋ ฅ: 2
// myModule.privateCounter; // ์ค๋ฅ: privateCounter๊ฐ ์ ์๋์ง ์์ (๋น๊ณต๊ฐ)
// myModule.privateMethod(); // ์ค๋ฅ: privateMethod๊ฐ ์ ์๋์ง ์์ (๋น๊ณต๊ฐ)
์ค๋ช :
myModule
์ IIFE์ ๊ฒฐ๊ณผ์ ํ ๋น๋ฉ๋๋ค.privateCounter
์privateMethod
๋ ๋ชจ๋์ ๋น๊ณต๊ฐ์ด๋ฉฐ ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.return
๋ฌธ์publicMethod
์getCounter
๋ฅผ ํฌํจํ๋ ๊ณต๊ฐ API๋ฅผ ๋ ธ์ถํฉ๋๋ค.
์ฅ์ :
- ์บก์ํ: ๋น๊ณต๊ฐ ๋ฐ์ดํฐ์ ํจ์๋ ์ธ๋ถ ์ ๊ทผ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฉ๋๋ค.
- ๋ค์์คํ์ด์ค ๊ด๋ฆฌ: ์ ์ญ ๋ค์์คํ์ด์ค๋ฅผ ์ค์ผ์ํค๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
ํ๊ณ:
- ๋น๊ณต๊ฐ ๋ฉ์๋๋ฅผ ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋น๊ณต๊ฐ ์ํ๋ฅผ ์์ ํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
2. ๋๋ฌ๋๋ ๋ชจ๋ ํจํด(Revealing Module Pattern)
๋๋ฌ๋๋ ๋ชจ๋ ํจํด์ ๋ชจ๋ ํจํด์ ๋ณํ์ผ๋ก, ๋ชจ๋ ๋ณ์์ ํจ์๋ฅผ ๋น๊ณต๊ฐ๋ก ์ ์ํ๊ณ return
๋ฌธ์์ ์ ํ๋ ๋ช ๊ฐ์ง๋ง ๊ณต๊ฐ ์์ฑ์ผ๋ก ๋๋ฌ๋
๋๋ค. ์ด ํจํด์ ๋ชจ๋ ๋์์ ๊ณต๊ฐ API๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ธํจ์ผ๋ก์จ ๋ช
ํ์ฑ๊ณผ ๊ฐ๋
์ฑ์ ๊ฐ์กฐํฉ๋๋ค.
์์ :
const myRevealingModule = (function() {
let privateCounter = 0;
function privateMethod() {
privateCounter++;
console.log('๋น๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ. ์นด์ดํฐ:', privateCounter);
}
function publicMethod() {
console.log('๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ.');
privateMethod();
}
function getCounter() {
return privateCounter;
}
// ๋น๊ณต๊ฐ ํจ์ ๋ฐ ์์ฑ์ ๋ํ ๊ณต๊ฐ ํฌ์ธํฐ๋ฅผ ๋๋ฌ๋
return {
publicMethod: publicMethod,
getCounter: getCounter
};
})();
myRevealingModule.publicMethod(); // ์ถ๋ ฅ: ๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ.
// ๋น๊ณต๊ฐ ๋ฉ์๋ ํธ์ถ๋จ. ์นด์ดํฐ: 1
console.log(myRevealingModule.getCounter()); // ์ถ๋ ฅ: 1
์ค๋ช :
- ๋ชจ๋ ๋ฉ์๋์ ๋ณ์๋ ์ฒ์์ ๋น๊ณต๊ฐ๋ก ์ ์๋ฉ๋๋ค.
return
๋ฌธ์ ๊ณต๊ฐ API๋ฅผ ํด๋น ๋น๊ณต๊ฐ ํจ์์ ๋ช ์์ ์ผ๋ก ๋งคํํฉ๋๋ค.
์ฅ์ :
- ํฅ์๋ ๊ฐ๋ ์ฑ: ๊ณต๊ฐ API๊ฐ ๋ชจ๋์ ๋์ ๋ช ํํ๊ฒ ์ ์๋ฉ๋๋ค.
- ํฅ์๋ ์ ์ง๋ณด์์ฑ: ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ์๋ณํ๊ณ ์์ ํ๊ธฐ ์ฝ์ต๋๋ค.
ํ๊ณ:
- ๋น๊ณต๊ฐ ํจ์๊ฐ ๊ณต๊ฐ ํจ์๋ฅผ ์ฐธ์กฐํ๊ณ , ๊ทธ ๊ณต๊ฐ ํจ์๊ฐ ๋ฎ์ด์ฐ์ฌ์ง ๊ฒฝ์ฐ, ๋น๊ณต๊ฐ ํจ์๋ ์ฌ์ ํ ์๋ ํจ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
3. CommonJS ๋ชจ๋
CommonJS๋ ์ฃผ๋ก Node.js์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ํ์ค์
๋๋ค. ๋ชจ๋์ ๊ฐ์ ธ์ค๊ธฐ ์ํด require()
ํจ์๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ ์ํด module.exports
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ (Node.js):
moduleA.js:
// moduleA.js
const privateVariable = '์ด๊ฒ์ ๋น๊ณต๊ฐ ๋ณ์์
๋๋ค';
function privateFunction() {
console.log('์ด๊ฒ์ ๋น๊ณต๊ฐ ํจ์์
๋๋ค');
}
function publicFunction() {
console.log('์ด๊ฒ์ ๊ณต๊ฐ ํจ์์
๋๋ค');
privateFunction();
}
module.exports = {
publicFunction: publicFunction
};
moduleB.js:
// moduleB.js
const moduleA = require('./moduleA');
moduleA.publicFunction(); // ์ถ๋ ฅ: ์ด๊ฒ์ ๊ณต๊ฐ ํจ์์
๋๋ค
// ์ด๊ฒ์ ๋น๊ณต๊ฐ ํจ์์
๋๋ค
// console.log(moduleA.privateVariable); // ์ค๋ฅ: privateVariable์ ์ ๊ทผํ ์ ์์
์ค๋ช :
module.exports
๋moduleA.js
์์publicFunction
์ ๋ด๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.require('./moduleA')
๋ ๋ด๋ณด๋ด์ง ๋ชจ๋์moduleB.js
๋ก ๊ฐ์ ธ์ต๋๋ค.
์ฅ์ :
- ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๊ตฌ๋ฌธ.
- Node.js ๊ฐ๋ฐ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
ํ๊ณ:
- ๋๊ธฐ์ ๋ชจ๋ ๋ก๋ฉ์ผ๋ก, ๋ธ๋ผ์ฐ์ ์์๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
4. AMD ๋ชจ๋
AMD(๋น๋๊ธฐ ๋ชจ๋ ์ ์)๋ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ฉํ๊ธฐ ์ํด ์ค๊ณ๋ ๋ชจ๋ ํ์ค์ ๋๋ค. RequireJS์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ํํ ์ฌ์ฉ๋ฉ๋๋ค.
์์ (RequireJS):
moduleA.js:
// moduleA.js
define(function() {
const privateVariable = '์ด๊ฒ์ ๋น๊ณต๊ฐ ๋ณ์์
๋๋ค';
function privateFunction() {
console.log('์ด๊ฒ์ ๋น๊ณต๊ฐ ํจ์์
๋๋ค');
}
function publicFunction() {
console.log('์ด๊ฒ์ ๊ณต๊ฐ ํจ์์
๋๋ค');
privateFunction();
}
return {
publicFunction: publicFunction
};
});
moduleB.js:
// moduleB.js
require(['./moduleA'], function(moduleA) {
moduleA.publicFunction(); // ์ถ๋ ฅ: ์ด๊ฒ์ ๊ณต๊ฐ ํจ์์
๋๋ค
// ์ด๊ฒ์ ๋น๊ณต๊ฐ ํจ์์
๋๋ค
});
์ค๋ช :
define()
์ ๋ชจ๋์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.require()
๋ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฅ์ :
- ๋ธ๋ผ์ฐ์ ์ ์ด์์ ์ธ ๋น๋๊ธฐ ๋ชจ๋ ๋ก๋ฉ.
- ์์กด์ฑ ๊ด๋ฆฌ.
ํ๊ณ:
- CommonJS ๋ฐ ES ๋ชจ๋์ ๋นํด ๋ ๋ณต์กํ ๊ตฌ๋ฌธ.
5. ES ๋ชจ๋ (ECMAScript ๋ชจ๋)
ES ๋ชจ๋(ESM)์ JavaScript์ ๋ด์ฅ๋ ๋ค์ดํฐ๋ธ ๋ชจ๋ ์์คํ
์
๋๋ค. import
์ export
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉฐ ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js(v13.2.0๋ถํฐ ์คํ์ ํ๋๊ทธ ์์ด, v14๋ถํฐ ์์ ์ง์)์์ ์ง์๋ฉ๋๋ค.
์์ :
moduleA.js:
// moduleA.js
const privateVariable = '์ด๊ฒ์ ๋น๊ณต๊ฐ ๋ณ์์
๋๋ค';
function privateFunction() {
console.log('์ด๊ฒ์ ๋น๊ณต๊ฐ ํจ์์
๋๋ค');
}
export function publicFunction() {
console.log('์ด๊ฒ์ ๊ณต๊ฐ ํจ์์
๋๋ค');
privateFunction();
}
// ๋๋ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค:
// export { publicFunction, anotherFunction };
// ๋๋ ๋ด๋ณด๋ด๊ธฐ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค:
// export { publicFunction as myFunction };
moduleB.js:
// moduleB.js
import { publicFunction } from './moduleA.js';
publicFunction(); // ์ถ๋ ฅ: ์ด๊ฒ์ ๊ณต๊ฐ ํจ์์
๋๋ค
// ์ด๊ฒ์ ๋น๊ณต๊ฐ ํจ์์
๋๋ค
// ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๊ฒฝ์ฐ:
// import myDefaultFunction from './moduleA.js';
// ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด:
// import * as moduleA from './moduleA.js';
// moduleA.publicFunction();
์ค๋ช :
export
๋ ๋ชจ๋์์ ๋ณ์, ํจ์ ๋๋ ํด๋์ค๋ฅผ ๋ด๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.import
๋ ๋ค๋ฅธ ๋ชจ๋์์ ๋ด๋ณด๋ธ ๋ฉค๋ฒ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.- Node.js์ ES ๋ชจ๋์์๋
.js
ํ์ฅ์๊ฐ ํ์์ ์ ๋๋ค. ๋จ, ํจํค์ง ๊ด๋ฆฌ์์ ๋ชจ๋ ํด์์ ์ฒ๋ฆฌํ๋ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ธ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์์๋ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ๋ชจ๋ ํ์ ์ ์ง์ ํด์ผ ํ ์ ์์ต๋๋ค:<script type="module" src="moduleB.js"></script>
์ฅ์ :
- ๋ธ๋ผ์ฐ์ ์ Node.js์์ ์ง์ํ๋ ๋ค์ดํฐ๋ธ ๋ชจ๋ ์์คํ .
- ์ ์ ๋ถ์ ๊ธฐ๋ฅ์ผ๋ก ํธ๋ฆฌ ์์ดํน ๋ฐ ์ฑ๋ฅ ํฅ์ ๊ฐ๋ฅ.
- ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ.
ํ๊ณ:
- ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด์๋ ๋น๋ ํ๋ก์ธ์ค(๋ฒ๋ค๋ฌ)๊ฐ ํ์ํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ชจ๋ ํจํด ์ ํํ๊ธฐ
๋ชจ๋ ํจํด์ ์ ํ์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ๋์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ค์์ ๊ฐ๋จํ ๊ฐ์ด๋์ ๋๋ค:
- ES ๋ชจ๋: ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js๋ฅผ ๋์์ผ๋ก ํ๋ ํ๋์ ์ธ ํ๋ก์ ํธ์ ๊ถ์ฅ๋ฉ๋๋ค.
- CommonJS: Node.js ํ๋ก์ ํธ์ ์ ํฉํ๋ฉฐ, ํนํ ์ค๋๋ ์ฝ๋๋ฒ ์ด์ค์ ์์ ํ ๋ ์ ์ฉํฉ๋๋ค.
- AMD: ๋น๋๊ธฐ ๋ชจ๋ ๋ก๋ฉ์ด ํ์ํ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ํ๋ก์ ํธ์ ์ ์ฉํฉ๋๋ค.
- ๋ชจ๋ ํจํด๊ณผ ๋๋ฌ๋๋ ๋ชจ๋ ํจํด: ์์ ํ๋ก์ ํธ๋ ์บก์ํ์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ๋์ด์: ๊ณ ๊ธ ๋ชจ๋ ๊ฐ๋
์์กด์ฑ ์ฃผ์ (Dependency Injection)
์์กด์ฑ ์ฃผ์ (DI)์ ์์กด์ฑ์ด ๋ชจ๋ ์์ฒด ๋ด์์ ์์ฑ๋๋ ๋์ ๋ชจ๋์ ์ ๊ณต๋๋ ๋์์ธ ํจํด์ ๋๋ค. ์ด๋ ๋์จํ ๊ฒฐํฉ์ ์ด์งํ์ฌ ๋ชจ๋์ ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์ :
// ์์กด์ฑ (๋ก๊ฑฐ)
const logger = {
log: function(message) {
console.log('[LOG]: ' + message);
}
};
// ์์กด์ฑ ์ฃผ์
์ ์ฌ์ฉํ๋ ๋ชจ๋
const myService = (function(logger) {
function doSomething() {
logger.log('์ค์ํ ์์
์ ์ํ ์ค...');
}
return {
doSomething: doSomething
};
})(logger);
myService.doSomething(); // ์ถ๋ ฅ: [LOG]: ์ค์ํ ์์
์ ์ํ ์ค...
์ค๋ช :
myService
๋ชจ๋์logger
๊ฐ์ฒด๋ฅผ ์์กด์ฑ์ผ๋ก ๋ฐ์ต๋๋ค.- ์ด๋ฅผ ํตํด ํ
์คํธ๋ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก
logger
๋ฅผ ๋ค๋ฅธ ๊ตฌํ์ผ๋ก ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค.
ํธ๋ฆฌ ์์ดํน(Tree Shaking)
ํธ๋ฆฌ ์์ดํน์ ๋ฒ๋ค๋ฌ(Webpack, Rollup ๋ฑ)๊ฐ ์ต์ข ๋ฒ๋ค์์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ES ๋ชจ๋์ ์ ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ฒ๋ค๋ฌ๊ฐ ์์กด์ฑ์ ๋ถ์ํ๊ณ ์ฌ์ฉ๋์ง ์๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์๋ณํ ์ ์์ผ๋ฏ๋ก ํธ๋ฆฌ ์์ดํน์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
์ฝ๋ ๋ถํ (Code Splitting)
์ฝ๋ ๋ถํ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋๋ ๊ดํ์ ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ , ์ด๊ธฐ์ ํ์ฑํ๊ณ ์คํํด์ผ ํ๋ JavaScript์ ์์ ์ค์ผ ์ ์์ต๋๋ค.
ES ๋ชจ๋๊ณผ ๊ฐ์ ๋ชจ๋ ์์คํ ๊ณผ Webpack๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๋ ๋์ import๋ฅผ ์ ์ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด ๋ณ๋์ ๋ฒ๋ค์ ์์ฑํ ์ ์๊ฒ ํ์ฌ ์ฝ๋ ๋ถํ ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
JavaScript ๋ชจ๋ ์ํคํ ์ฒ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ES ๋ชจ๋ ์ ํธ: ๋ค์ดํฐ๋ธ ์ง์, ์ ์ ๋ถ์ ๊ธฐ๋ฅ, ํธ๋ฆฌ ์์ดํน ์ด์ ์ ์ํด ES ๋ชจ๋์ ์ฑํํ์ธ์.
- ๋ฒ๋ค๋ฌ ์ฌ์ฉ: Webpack, Parcel ๋๋ Rollup๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ , ์ฝ๋๋ฅผ ์ต์ ํํ๋ฉฐ, ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ์ธ์.
- ๋ชจ๋์ ์๊ณ ์ง์ค์ ์ผ๋ก ์ ์ง: ๊ฐ ๋ชจ๋์ ๋จ์ผํ๊ณ ์ ์ ์๋ ์ฑ ์์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- ์ผ๊ด๋ ๋ช ๋ช ๊ท์น ์ค์: ๋ชจ๋, ํจ์, ๋ณ์์ ์๋ฏธ ์๊ณ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์.
- ๋จ์ ํ ์คํธ ์์ฑ: ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ ์ ํ ํ ์คํธํ์ธ์.
- ๋ชจ๋ ๋ฌธ์ํ: ๊ฐ ๋ชจ๋์ ๋ชฉ์ , ์์กด์ฑ, ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ๋ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์.
- TypeScript ์ฌ์ฉ ๊ณ ๋ ค: TypeScript๋ ์ ์ ํ์ดํ์ ์ ๊ณตํ์ฌ ๋๊ท๋ชจ JavaScript ํ๋ก์ ํธ์์ ์ฝ๋ ๊ตฌ์ฑ, ์ ์ง๋ณด์์ฑ, ํ ์คํธ ๊ฐ๋ฅ์ฑ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- SOLID ์์น ์ ์ฉ: ํนํ ๋จ์ผ ์ฑ ์ ์์น๊ณผ ์์กด์ฑ ์ญ์ ์์น์ ๋ชจ๋ ์ค๊ณ์ ํฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ชจ๋ ์ํคํ ์ฒ์ ๋ํ ์ ์ญ์ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋ชจ๋ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ ๋ ๋ค์์ ๊ณ ๋ คํ์ธ์:
- ๊ตญ์ ํ(i18n): ๋ค์ํ ์ธ์ด์ ์ง์ญ ์ค์ ์ ์ฝ๊ฒ ์์ฉํ ์ ์๋๋ก ๋ชจ๋์ ๊ตฌ์กฐํํ์ธ์. ํ ์คํธ ๋ฆฌ์์ค(์: ๋ฒ์ญ)์ ๋ํด ๋ณ๋์ ๋ชจ๋์ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ก๋ํ์ธ์.
- ํ์งํ(l10n): ๋ ์ง ๋ฐ ์ซ์ ํ์, ํตํ ๊ธฐํธ, ์๊ฐ๋์ ๊ฐ์ ๋ค์ํ ๋ฌธํ์ ๊ด๋ก๋ฅผ ๊ณ ๋ คํ์ธ์. ์ด๋ฌํ ๋ณํ์ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ ๋ง๋์ธ์.
- ์ ๊ทผ์ฑ(a11y): ์ฅ์ ๊ฐ ์๋ ์ฌ๋๋ค๋ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ทผ์ฑ์ ์ผ๋์ ๋๊ณ ๋ชจ๋์ ์ค๊ณํ์ธ์. ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ(์: WCAG)์ ๋ฐ๋ฅด๊ณ ์ ์ ํ ARIA ์์ฑ์ ์ฌ์ฉํ์ธ์.
- ์ฑ๋ฅ: ๋ค์ํ ์ฅ์น์ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ์ฑ๋ฅ์ ์ต์ ํํ๋๋ก ๋ชจ๋์ ๋ง๋์ธ์. ์ฝ๋ ๋ถํ , ์ง์ฐ ๋ก๋ฉ ๋ฐ ๊ธฐํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ต์ํํ์ธ์.
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN): CDN์ ํ์ฉํ์ฌ ์ฌ์ฉ์์ ๋ ๊ฐ๊น์ด ์์น์ ์๋ฒ์์ ๋ชจ๋์ ์ ๊ณตํจ์ผ๋ก์จ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค์ธ์.
์์ (ES ๋ชจ๋์ ์ฌ์ฉํ i18n):
en.js:
// en.js
export default {
greeting: 'Hello, world!',
farewell: 'Goodbye!'
};
fr.js:
// fr.js
export default {
greeting: 'Bonjour le monde!',
farewell: 'Au revoir!'
};
app.js:
// app.js
async function loadTranslations(locale) {
try {
const translations = await import(`./${locale}.js`);
return translations.default;
} catch (error) {
console.error(`๋ก์ผ์ผ ${locale}์ ๋ํ ๋ฒ์ญ์ ๋ก๋ํ์ง ๋ชปํ์ต๋๋ค:`, error);
return {}; // ๋น ๊ฐ์ฒด ๋๋ ๊ธฐ๋ณธ ๋ฒ์ญ ์ธํธ๋ฅผ ๋ฐํ
}
}
async function greetUser(locale) {
const translations = await loadTranslations(locale);
console.log(translations.greeting);
}
greetUser('en'); // ์ถ๋ ฅ: Hello, world!
greetUser('fr'); // ์ถ๋ ฅ: Bonjour le monde!
๊ฒฐ๋ก
JavaScript ๋ชจ๋ ์ํคํ ์ฒ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ํ ์คํธ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ๋ชจ๋ ์์คํ ์ ์งํ๋ฅผ ์ดํดํ๊ณ ๋ชจ๋ ํจํด, ๋๋ฌ๋๋ ๋ชจ๋ ํจํด, CommonJS, AMD, ES ๋ชจ๋๊ณผ ๊ฐ์ ๋์์ธ ํจํด์ ์ฑํํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์กฐํํ๊ณ ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์์กด์ฑ ์ฃผ์ , ํธ๋ฆฌ ์์ดํน, ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ฐ๋ ์ ๊ณ ๋ คํ์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋์ฑ ์ต์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ ์ญ์ ์ธ ์ํฅ์ ๊ณ ๋ คํจ์ผ๋ก์จ ๋ค์ํ ์ฒญ์ค๊ณผ ํ๊ฒฝ์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ์ ์ ๊ฐ๋ฅํ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
JavaScript ๋ชจ๋ ์ํคํ ์ฒ์ ์ต์ ๋ฐ์ ์ ๋ํด ์ง์์ ์ผ๋ก ๋ฐฐ์ฐ๊ณ ์ ์ํ๋ ๊ฒ์ด ๋์์์ด ๋ณํํ๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์์ ์์ ๋๊ฐ๋ ์ด์ ์ ๋๋ค.