๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ์ฉ์ดํ ์ฑ์ ๋ง๋ค๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํจํด์ ์ค๊ณ ์์น๊ณผ ์ค์ฉ์ ๊ตฌํ ์ ๋ต์ ์ฌ์ธต์ ์ผ๋ก ํ๊ตฌํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํจํด: ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ์ํ ์ค๊ณ ๋ฐ ๊ตฌํ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ, ํนํ ๋ณต์กํ๊ณ ๋๊ท๋ชจ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ถ์ฐ๋ ๊ธ๋ก๋ฒ ํ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํจ๊ณผ์ ์ธ ์ฝ๋ ๊ตฌ์ฑ๊ณผ ๋ชจ๋์ฑ์ ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ํ๋ ๊ฐ๋จํ ํด๋ผ์ด์ธํธ ์ธก ์คํฌ๋ฆฝํ ์๋ง ๊ตญํ๋์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด์ ์ธํฐ๋ํฐ๋ธํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ถํฐ ๊ฒฌ๊ณ ํ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ๊น์ง ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ํฉ๋๋ค. ์ด๋ฌํ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๊ณ ๋ค์ํ ์ง๋ฆฌ์ , ๋ฌธํ์ ํ๊ฒฝ์ ๊ฑธ์น ํ์ ์ ์ด์งํ๊ธฐ ์ํด, ๊ฒฌ๊ณ ํ ๋ชจ๋ ํจํด์ ์ดํดํ๊ณ ๊ตฌํํ๋ ๊ฒ์ ๋จ์ํ ์ ์ตํ ๊ฒ์ ๋์ด ํ์์ ์ ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํจํด์ ํต์ฌ ๊ฐ๋ ์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ์งํ ๊ณผ์ , ์ค๊ณ ์์น ๋ฐ ์ค์ฉ์ ์ธ ๊ตฌํ ์ ๋ต์ ํ๊ตฌํ ๊ฒ์ ๋๋ค. ์ด๊ธฐ ๋จ์ํ ์ ๊ทผ ๋ฐฉ์๋ถํฐ ํ๋์ ์ด๊ณ ์ ๊ตํ ์๋ฃจ์ ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ํจํด์ ์ดํด๋ณด๊ณ , ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ํํ๊ณ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ ผ์ํ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ฑ์ ์งํ
๋จ์ผ ํ์ผ, ์ ์ญ ์ค์ฝํ ์ค์ฌ์ ์ธ์ด์์ ๋ชจ๋ํ๋ ๊ฐ๋ ฅํ ์ธ์ด๋ก ๋ฐ์ ํ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฌ์ ์ ๊ทธ ์ ์์ฑ์ ์ฆ๋ช ํฉ๋๋ค. ์ด๊ธฐ์๋ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋์ ์์ฑํ๊ธฐ ์ํ ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ด ์์์ต๋๋ค. ์ด๋ก ์ธํด ํ ์คํฌ๋ฆฝํธ์์ ์ ์๋ ๋ณ์์ ํจ์๊ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ๋ณ์์ ํจ์๋ฅผ ์ฝ๊ฒ ๋ฎ์ด์ฐ๊ฑฐ๋ ์ถฉ๋ํ ์ ์๋ ์ ๋ช ๋์ "์ ์ญ ๋ค์์คํ์ด์ค ์ค์ผ" ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ผ๋ฉฐ, ์ด๋ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํฉํ ๋ ํนํ ๋๋๋ฌ์ก์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ค์ ์๋ฆฌํ ํด๊ฒฐ์ฑ ์ ๊ณ ์ํ์ต๋๋ค:
1. ์ ์ญ ์ค์ฝํ์ ๋ค์์คํ์ด์ค ์ค์ผ
๊ฐ์ฅ ์ด๊ธฐ์ ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ ์ญ ์ค์ฝํ์ ๋ฃ๋ ๊ฒ์ด์์ต๋๋ค. ๋จ์ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๊ธ์ธ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ก์ต๋๋ค. ์์ญ ๊ฐ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ํ๋ก์ ํธ๋ฅผ ์์ํด ๋ณด์ญ์์ค. ๋ณ์ ์ด๋ฆ์ ์ถ์ ํ๊ณ ์ถฉ๋์ ํผํ๋ ๊ฒ์ ์ ๋ชฝ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ์ด๋ก ์ธํด ์ข ์ข ๋ง์ถคํ ๋ช ๋ช ๊ท์น์ ๋ง๋ค๊ฑฐ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๋ด๋ ๋จ์ผ์ ๊ฑฐ๋ํ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
์์ (๋ฌธ์ ์ ):
// script1.js var counter = 0; function increment() { counter++; } // script2.js var counter = 100; // script1.js์ counter๋ฅผ ๋ฎ์ด์๋๋ค. function reset() { counter = 0; // ์๋์น ์๊ฒ script1.js์ ์ํฅ์ ์ค๋๋ค. }
2. ์ฆ์ ์คํ ํจ์ ํํ์ (IIFE)
IIFE๋ ์บก์ํ๋ฅผ ํฅํ ์ค์ํ ๋จ๊ณ๋ก ๋ฑ์ฅํ์ต๋๋ค. IIFE๋ ์ ์๋์๋ง์ ์ฆ์ ์คํ๋๋ ํจ์์ ๋๋ค. ์ฝ๋๋ฅผ IIFE๋ก ๊ฐ์ธ๋ฉด ๋น๊ณต๊ฐ ์ค์ฝํ๊ฐ ์์ฑ๋์ด ๋ณ์์ ํจ์๊ฐ ์ ์ญ ์ค์ฝํ๋ก ์ ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
IIFE์ ์ฃผ์ ์ด์ :
- ๋น๊ณต๊ฐ ์ค์ฝํ: IIFE ๋ด์์ ์ ์ธ๋ ๋ณ์์ ํจ์๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ ์ญ ๋ค์์คํ์ด์ค ์ค์ผ ๋ฐฉ์ง: ๋ช ์์ ์ผ๋ก ๋ ธ์ถ๋ ๋ณ์๋ ํจ์๋ง์ด ์ ์ญ ์ค์ฝํ์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค.
IIFE ์ฌ์ฉ ์์ :
// module.js var myModule = (function() { var privateVariable = "๋๋ ๋น๊ณต๊ฐ์ ๋๋ค"; function privateMethod() { console.log(privateVariable); } return { publicMethod: function() { console.log("๊ณต๊ฐ ๋ฉ์๋์์ ์ธ์ฌํฉ๋๋ค!"); privateMethod(); } }; })(); myModule.publicMethod(); // ์ถ๋ ฅ: ๊ณต๊ฐ ๋ฉ์๋์์ ์ธ์ฌํฉ๋๋ค! // console.log(myModule.privateVariable); // undefined (privateVariable์ ์ ๊ทผํ ์ ์์ต๋๋ค)
IIFE๋ ๊ฐ๋ฐ์๋ค์ด ๋ ๋ฆฝ์ ์ธ ์ฝ๋ ๋จ์๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ์๋นํ ๊ฐ์ ์ด์์ง๋ง, ์ฌ์ ํ ๋ช ์์ ์ธ ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋ถ์กฑํ์ฌ ๋ชจ๋ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
๋ชจ๋ ๋ก๋์ ํจํด์ ๋ถ์
์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์ ๋ฐ๋ผ, ์์กด์ฑ ๋ฐ ์ฝ๋ ๊ตฌ์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ณด๋ค ๊ตฌ์กฐํ๋ ์ ๊ทผ ๋ฐฉ์์ ํ์์ฑ์ด ๋ถ๋ช ํด์ก์ต๋๋ค. ์ด๋ ๋ค์ํ ๋ชจ๋ ์์คํ ๊ณผ ํจํด์ ๊ฐ๋ฐ๋ก ์ด์ด์ก์ต๋๋ค.
3. ๋๋ฌ๋ด๊ธฐ ๋ชจ๋ ํจํด (Revealing Module Pattern)
IIFE ํจํด์ ๊ฐ์ ๋ ๋ฒ์ ์ธ ๋๋ฌ๋ด๊ธฐ ๋ชจ๋ ํจํด์ ๋ชจ๋ ์ ์์ ๋์์ ํน์ ๋ฉค๋ฒ(๋ฉ์๋ ๋ฐ ๋ณ์)๋ง ๋ ธ์ถํ์ฌ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋์ ์ด๋ค ๋ถ๋ถ์ด ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ก ์๋๋์๋์ง ๋ช ํํ๊ฒ ์ ์ ์์ต๋๋ค.
์ค๊ณ ์์น: ๋ชจ๋ ๊ฒ์ ์บก์ํํ ๋ค์ ํ์ํ ๊ฒ๋ง ๋๋ฌ๋ ๋๋ค.
์์ :
var myRevealingModule = (function() { var privateCounter = 0; var publicApi = {}; function privateIncrement() { privateCounter++; console.log('๋น๊ณต๊ฐ ์นด์ดํฐ:', privateCounter); } function publicHello() { console.log('์๋ ํ์ธ์!'); } // ๊ณต๊ฐ ๋ฉ์๋ ๋๋ฌ๋ด๊ธฐ publicApi.hello = publicHello; publicApi.increment = function() { privateIncrement(); }; return publicApi; })(); myRevealingModule.hello(); // ์ถ๋ ฅ: ์๋ ํ์ธ์! myRevealingModule.increment(); // ์ถ๋ ฅ: ๋น๊ณต๊ฐ ์นด์ดํฐ: 1 // myRevealingModule.privateIncrement(); // ์ค๋ฅ: privateIncrement๋ ํจ์๊ฐ ์๋๋๋ค
๋๋ฌ๋ด๊ธฐ ๋ชจ๋ ํจํด์ ๋น๊ณต๊ฐ ์ํ๋ฅผ ๋ง๋ค๊ณ ๊น๋ํ ๊ณต๊ฐ API๋ฅผ ๋ ธ์ถํ๋ ๋ฐ ํ์ํฉ๋๋ค. ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ ๋ค๋ฅธ ๋ง์ ํจํด์ ๊ธฐ์ด๋ฅผ ํ์ฑํฉ๋๋ค.
4. ์์กด์ฑ์ด ์๋ ๋ชจ๋ ํจํด (์๋ฎฌ๋ ์ด์ )
๊ณต์์ ์ธ ๋ชจ๋ ์์คํ ์ด ๋ฑ์ฅํ๊ธฐ ์ , ๊ฐ๋ฐ์๋ค์ ์ข ์ข ์์กด์ฑ์ IIFE์ ์ธ์๋ก ์ ๋ฌํ์ฌ ์์กด์ฑ ์ฃผ์ ์ ์๋ฎฌ๋ ์ด์ ํ์ต๋๋ค.
์์ :
// dependency1.js var dependency1 = { greet: function(name) { return "์๋ ํ์ธ์, " + name; } }; // moduleWithDependency.js var moduleWithDependency = (function(dep1) { var message = ""; function setGreeting(name) { message = dep1.greet(name); } function displayGreeting() { console.log(message); } return { greetUser: function(userName) { setGreeting(userName); displayGreeting(); } }; })(dependency1); // dependency1์ ์ธ์๋ก ์ ๋ฌ moduleWithDependency.greetUser("Alice"); // ์ถ๋ ฅ: ์๋ ํ์ธ์, Alice
์ด ํจํด์ ํ๋ ๋ชจ๋ ์์คํ ์ ํต์ฌ ๊ธฐ๋ฅ์ธ ๋ช ์์ ์์กด์ฑ์ ๋ํ ์๊ตฌ๋ฅผ ์ ๋ณด์ฌ์ค๋๋ค.
๊ณต์ ๋ชจ๋ ์์คํ
์์๋ฐฉํธ์ ์ธ ํจํด์ ํ๊ณ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ์์คํ ์ ํ์คํ๋ก ์ด์ด์ก์ผ๋ฉฐ, ์ด๋ ํนํ ๋ช ํํ ์ธํฐํ์ด์ค์ ์์กด์ฑ์ด ์ค์ํ ํ์ ์ ์ธ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐํํ๋ ๋ฐฉ์์ ํฐ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค.
5. CommonJS (Node.js์์ ์ฌ์ฉ)
CommonJS๋ ์ฃผ๋ก Node.js์ ๊ฐ์ ์๋ฒ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์ฌ์์ ๋๋ค. ๋ชจ๋์ ๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋ ๋ฐฉ์์ ์ ์ํ์ฌ ์์กด์ฑ์ ๊ฐ๋จํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฃผ์ ๊ฐ๋ :
- `require()`: ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ํจ์์ ๋๋ค.
- `module.exports` ๋๋ `exports`: ๋ชจ๋์์ ๊ฐ์ ๋ด๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ๋๋ค.
์์ (Node.js):
// math.js (๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ) const add = (a, b) => a + b; const subtract = (a, b) => a - b; module.exports = { add, subtract }; // app.js (๋ชจ๋ ๊ฐ์ ธ์์ ์ฌ์ฉํ๊ธฐ) const math = require('./math'); console.log('ํฉ๊ณ:', math.add(5, 3)); // ์ถ๋ ฅ: ํฉ๊ณ: 8 console.log('์ฐจ์ด:', math.subtract(10, 4)); // ์ถ๋ ฅ: ์ฐจ์ด: 6
CommonJS์ ์ฅ์ :
- ๊ฐ๋จํ๊ณ ๋๊ธฐ์ ์ธ API.
- Node.js ์ํ๊ณ์์ ๋๋ฆฌ ์ฑํ๋จ.
- ๋ช ํํ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ ํจ.
CommonJS์ ๋จ์ :
- ๋๊ธฐ์ ์ธ ํน์ฑ์ ๋คํธ์ํฌ ์ง์ฐ์ด ๋ฐ์ํ ์ ์๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ์ด์์ ์ด์ง ์์.
6. ๋น๋๊ธฐ ๋ชจ๋ ์ ์ (AMD)
AMD๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ CommonJS์ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค. ์คํฌ๋ฆฝํธ ์คํ์ ์ฐจ๋จํ์ง ์๊ณ ๋ชจ๋์ ๋ก๋ํ๋๋ก ์ค๊ณ๋ ๋น๋๊ธฐ ๋ชจ๋ ์ ์ ์์คํ ์ ๋๋ค.
์ฃผ์ ๊ฐ๋ :
- `define()`: ๋ชจ๋๊ณผ ๊ทธ ์์กด์ฑ์ ์ ์ํ๋ ํจ์์ ๋๋ค.
- ์์กด์ฑ ๋ฐฐ์ด: ํ์ฌ ๋ชจ๋์ด ์์กดํ๋ ๋ชจ๋์ ์ง์ ํฉ๋๋ค.
์์ (์ธ๊ธฐ ์๋ AMD ๋ก๋์ธ RequireJS ์ฌ์ฉ):
// mathModule.js (๋ชจ๋ ์ ์) define(['dependency'], function(dependency) { const add = (a, b) => a + b; const subtract = (a, b) => a - b; return { add: add, subtract: subtract }; }); // main.js (๋ชจ๋ ์ค์ ๋ฐ ์ฌ์ฉ) requirejs.config({ baseUrl: 'js/lib' }); requirejs(['mathModule'], function(math) { console.log('ํฉ๊ณ:', math.add(7, 2)); // ์ถ๋ ฅ: ํฉ๊ณ: 9 });
AMD์ ์ฅ์ :
- ๋น๋๊ธฐ ๋ก๋ฉ์ ๋ธ๋ผ์ฐ์ ์ ์ด์์ ์.
- ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ง์ํจ.
AMD์ ๋จ์ :
- CommonJS์ ๋นํด ๊ตฌ๋ฌธ์ด ๋ ์ฅํฉํจ.
- ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ES ๋ชจ๋์ ๋นํด ๋ ๋ณดํธ์ ์.
7. ECMAScript ๋ชจ๋ (ES ๋ชจ๋ / ESM)
ES ๋ชจ๋์ ECMAScript 2015(ES6)์์ ๋์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ณต์ ํ์ค ๋ชจ๋ ์์คํ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์๋ฒ ์ธก ํ๊ฒฝ(์: Node.js) ๋ชจ๋์์ ์๋ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ฃผ์ ๊ฐ๋ :
- `import` ๊ตฌ๋ฌธ: ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- `export` ๊ตฌ๋ฌธ: ๋ชจ๋์์ ๊ฐ์ ๋ด๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ ์ ๋ถ์: ๋ชจ๋ ์์กด์ฑ์ด ์ปดํ์ผ ์๊ฐ(๋๋ ๋น๋ ์๊ฐ)์ ํด๊ฒฐ๋์ด ๋ ๋์ ์ต์ ํ์ ์ฝ๋ ๋ถํ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์์ (๋ธ๋ผ์ฐ์ ):
// logger.js (๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ) export const logInfo = (message) => { console.info(`[์ ๋ณด] ${message}`); }; export const logError = (message) => { console.error(`[์ค๋ฅ] ${message}`); }; // app.js (๋ชจ๋ ๊ฐ์ ธ์์ ์ฌ์ฉํ๊ธฐ) import { logInfo, logError } from './logger.js'; logInfo('์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์์๋์์ต๋๋ค.'); logError('๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.');
์์ (ES ๋ชจ๋์ ์ง์ํ๋ Node.js):
Node.js์์ ES ๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํ์ผ์ `.mjs` ํ์ฅ์๋ก ์ ์ฅํ๊ฑฐ๋ package.json
ํ์ผ์ "type": "module"
์ ์ค์ ํด์ผ ํฉ๋๋ค.
// utils.js export const capitalize = (str) => str.toUpperCase(); // main.js import { capitalize } from './utils.js'; console.log(capitalize('javascript')); // ์ถ๋ ฅ: JAVASCRIPT
ES ๋ชจ๋์ ์ฅ์ :
- ํ์คํ๋์ด ์์ผ๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด์ฅ๋จ.
- ์ ์ ๋ฐ ๋์ ์ํฌํธ๋ฅผ ๋ชจ๋ ์ง์ํจ.
- ์ต์ ํ๋ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ํ ํธ๋ฆฌ ์์ดํน(tree-shaking)์ ๊ฐ๋ฅํ๊ฒ ํจ.
- ๋ธ๋ผ์ฐ์ ์ Node.js ์ ๋ฐ์ ๊ฑธ์ณ ๋ณดํธ์ ์ผ๋ก ์๋ํจ.
ES ๋ชจ๋์ ๋จ์ :
- ๋์ ์ํฌํธ์ ๋ํ ๋ธ๋ผ์ฐ์ ์ง์์ด ๋ค๋ฅผ ์ ์์ง๋ง, ํ์ฌ๋ ๋๋ฆฌ ์ฑํ๋จ.
- ์ค๋๋ Node.js ํ๋ก์ ํธ๋ฅผ ์ ํํ๋ ค๋ฉด ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ํ์ํ ์ ์์.
๊ธ๋ก๋ฒ ํ์ ์ํ ์ค๊ณ: ๋ชจ๋ฒ ์ฌ๋ก
๋ค๋ฅธ ์๊ฐ๋, ๋ฌธํ, ๊ฐ๋ฐ ํ๊ฒฝ์ ์๋ ๊ฐ๋ฐ์๋ค๊ณผ ํจ๊ป ์ผํ ๋๋ ์ผ๊ด๋๊ณ ๋ช ํํ ๋ชจ๋ ํจํด์ ์ฑํํ๋ ๊ฒ์ด ๋์ฑ ์ค์ํด์ง๋๋ค. ๋ชฉํ๋ ํ์ ๋ชจ๋ ์ฌ๋์ด ์ดํดํ๊ณ , ์ ์ง๋ณด์ํ๊ณ , ํ์ฅํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
1. ES ๋ชจ๋ ์ ๊ทน ํ์ฉ
ํ์คํ์ ๊ด๋ฒ์ํ ์ฑํ์ ๊ณ ๋ คํ ๋, ES ๋ชจ๋(ESM)์ ์๋ก์ด ํ๋ก์ ํธ์ ๊ถ์ฅ๋๋ ์ ํ์ ๋๋ค. ์ ์ ์ธ ํน์ฑ์ ๋๊ตฌ ์ฌ์ฉ์ ๋์์ด ๋๋ฉฐ, ๋ช ํํ `import`/`export` ๊ตฌ๋ฌธ์ ๋ชจํธ์ฑ์ ์ค์ฌ์ค๋๋ค.
- ์ผ๊ด์ฑ: ๋ชจ๋ ๋ชจ๋์ ๊ฑธ์ณ ESM ์ฌ์ฉ์ ๊ฐ์ ํฉ๋๋ค.
- ํ์ผ ์ด๋ฆ ์ง์ : ์ค๋ช ์ ์ธ ํ์ผ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ `.js` ๋๋ `.mjs` ํ์ฅ์๋ฅผ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํฉ๋๋ค.
- ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ: ๋ชจ๋์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ด๋ก๋ `src` ๋๋ ํ ๋ฆฌ๋ฅผ ๋๊ณ ๊ทธ ์๋์ ๊ธฐ๋ฅ์ด๋ ๋ชจ๋ ์ ํ๋ณ ํ์ ๋๋ ํ ๋ฆฌ(์: `src/components`, `src/utils`, `src/services`)๋ฅผ ๋๋ ๊ฒ์ ๋๋ค.
2. ๋ชจ๋์ ์ํ ๋ช ํํ API ์ค๊ณ
๋๋ฌ๋ด๊ธฐ ๋ชจ๋ ํจํด์ ์ฌ์ฉํ๋ ES ๋ชจ๋์ ์ฌ์ฉํ๋ , ๊ฐ ๋ชจ๋์ ๋ํด ๋ช ํํ๊ณ ์ต์ํ์ ๊ณต๊ฐ API๋ฅผ ์ ์ํ๋ ๋ฐ ์ง์คํด์ผ ํฉ๋๋ค.
- ์บก์ํ: ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋น๊ณต๊ฐ๋ก ์ ์งํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋๊ณผ ์ํธ์์ฉํ๋ ๋ฐ ํ์ํ ๊ฒ๋ง ๋ด๋ณด๋ ๋๋ค.
- ๋จ์ผ ์ฑ ์ ์์น: ๊ฐ ๋ชจ๋์ ์ด์์ ์ผ๋ก ๋จ์ผํ๊ณ ์ ์ ์๋ ๋ชฉ์ ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ด๋ ๋ชจ๋์ ์ดํดํ๊ณ , ํ ์คํธํ๊ณ , ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๋ฌธ์ํ: ๋ณต์กํ ๋ชจ๋์ด๋ ๋ณต์กํ API๊ฐ ์๋ ๋ชจ๋์ ๊ฒฝ์ฐ, JSDoc ์ฃผ์์ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ธ ํจ์์ ํด๋์ค์ ๋ชฉ์ , ๋งค๊ฐ๋ณ์, ๋ฐํ ๊ฐ์ ๋ฌธ์ํํฉ๋๋ค. ์ด๋ ์ธ์ด์ ๋์์ค๊ฐ ์ฅ๋ฒฝ์ด ๋ ์ ์๋ ๊ตญ์ ํ์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
3. ์์กด์ฑ ๊ด๋ฆฌ
์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ญ์์ค. ์ด๋ ๋ชจ๋ ์์คํ ๊ณผ ๋น๋ ํ๋ก์ธ์ค ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค.
- ESM `import` ๊ตฌ๋ฌธ: ๋ชจ๋์ด ๋ฌด์์ ํ์๋ก ํ๋์ง ๋ช ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค.
- ๋ฒ๋ค๋ฌ (Webpack, Rollup, Vite): ์ด๋ฌํ ๋๊ตฌ๋ ํธ๋ฆฌ ์์ดํน ๋ฐ ์ต์ ํ๋ฅผ ์ํด ๋ชจ๋ ์ ์ธ์ ํ์ฉํฉ๋๋ค. ๋น๋ ํ๋ก์ธ์ค๊ฐ ์ ๊ตฌ์ฑ๋๊ณ ํ์๋ค์ด ์ดํดํ ์ ์๋๋ก ํ์ญ์์ค.
- ๋ฒ์ ๊ด๋ฆฌ: npm์ด๋ Yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ํ ์ ์ฒด์์ ์ผ๊ด๋ ๋ฒ์ ์ ์ ์งํ์ญ์์ค.
4. ๋๊ตฌ ๋ฐ ๋น๋ ํ๋ก์ธ์ค
์ต์ ๋ชจ๋ ํ์ค์ ์ง์ํ๋ ๋๊ตฌ๋ฅผ ํ์ฉํ์ญ์์ค. ์ด๋ ๊ธ๋ก๋ฒ ํ์ด ํต์ผ๋ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ํธ๋์คํ์ผ๋ฌ (Babel): ESM์ด ํ์ค์ด์ง๋ง, ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ Node.js ๋ฒ์ ์์๋ ํธ๋์คํ์ผ๋ง์ด ํ์ํ ์ ์์ต๋๋ค. Babel์ ํ์์ ๋ฐ๋ผ ESM์ CommonJS๋ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
- ๋ฒ๋ค๋ฌ: Webpack, Rollup, Vite์ ๊ฐ์ ๋๊ตฌ๋ ๋ฐฐํฌ๋ฅผ ์ํ ์ต์ ํ๋ ๋ฒ๋ค์ ๋ง๋๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ค์ ๋ชจ๋ ์์คํ ์ ์ดํดํ๊ณ ์ฝ๋ ๋ถํ ๋ฐ ์ถ์์ ๊ฐ์ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.
- ๋ฆฐํฐ (ESLint): ๋ชจ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฐ์ ํ๋ ๊ท์น(์: ์ฌ์ฉ๋์ง ์๋ ์ํฌํธ ๊ธ์ง, ์ฌ๋ฐ๋ฅธ ์ํฌํธ/์ต์คํฌํธ ๊ตฌ๋ฌธ)์ผ๋ก ESLint๋ฅผ ๊ตฌ์ฑํ์ญ์์ค. ์ด๋ ํ ์ ์ฒด์ ์ฝ๋ ํ์ง๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
5. ๋น๋๊ธฐ ์์ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๋น๋๊ธฐ ์์ (์: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ํ์ด๋จธ)์ ํฌํจํฉ๋๋ค. ์ ์ ํ ๋ชจ๋ ์ค๊ณ๋ ์ด๋ฅผ ์์ฉํด์ผ ํฉ๋๋ค.
- Promise์ Async/Await: ๋ชจ๋ ๋ด์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ค๋ฅ ์ ํ: ์ค๋ฅ๊ฐ ๋ชจ๋ ๊ฒฝ๊ณ๋ฅผ ํตํด ์ฌ๋ฐ๋ฅด๊ฒ ์ ํ๋๋๋ก ํ์ญ์์ค. ์ ์ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์ ๋ถ์ฐ๋ ํ์์ ๋๋ฒ๊น ํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ๊ณ ๋ ค: ๊ธ๋ก๋ฒ ์๋๋ฆฌ์ค์์๋ ๋คํธ์ํฌ ์ง์ฐ์ด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ฑฐ๋ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ ์ ์๋ ๋ชจ๋์ ์ค๊ณํ์ญ์์ค.
6. ํ ์คํธ ์ ๋ต
๋ชจ๋ํ๋ ์ฝ๋๋ ๋ณธ์ง์ ์ผ๋ก ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ํ ์คํธ ์ ๋ต์ด ๋ชจ๋ ๊ตฌ์กฐ์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค.
- ๋จ์ ํ ์คํธ: ๊ฐ๋ณ ๋ชจ๋์ ๊ฒฉ๋ฆฌํ์ฌ ํ ์คํธํฉ๋๋ค. ๋ช ํํ ๋ชจ๋ API๋ฅผ ์ฌ์ฉํ๋ฉด ์์กด์ฑ์ ๋ชจํน(mocking)ํ๊ธฐ๊ฐ ๊ฐ๋จํฉ๋๋ค.
- ํตํฉ ํ ์คํธ: ๋ชจ๋์ด ์๋ก ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง ํ ์คํธํฉ๋๋ค.
- ํ ์คํ ํ๋ ์์ํฌ: ES ๋ชจ๋๊ณผ CommonJS๋ฅผ ํ๋ฅญํ๊ฒ ์ง์ํ๋ Jest๋ Mocha์ ๊ฐ์ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
ํ๋ก์ ํธ์ ์ ํฉํ ํจํด ์ ํํ๊ธฐ
๋ชจ๋ ํจํด์ ์ ํ์ ์ข ์ข ์คํ ํ๊ฒฝ๊ณผ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ ์ฉ, ์ค๋๋ ํ๋ก์ ํธ: ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ํด๋ฆฌํ ์์ด ๋งค์ฐ ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ, IIFE์ ๋๋ฌ๋ด๊ธฐ ๋ชจ๋ ํจํด์ด ์ฌ์ ํ ์ ์ฉํ ์ ์์ต๋๋ค.
- Node.js (์๋ฒ ์ธก): CommonJS๊ฐ ํ์ค์ด์์ง๋ง, ESM ์ง์์ด ์ฆ๊ฐํ๋ฉด์ ์๋ก์ด ํ๋ก์ ํธ์์ ์ ํธ๋๋ ์ ํ์ด ๋๊ณ ์์ต๋๋ค.
- ํ๋ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ (React, Vue, Angular): ์ด๋ฌํ ํ๋ ์์ํฌ๋ ES ๋ชจ๋์ ํฌ๊ฒ ์์กดํ๋ฉฐ ์ข ์ข Webpack์ด๋ Vite์ ๊ฐ์ ๋ฒ๋ค๋ฌ์ ํตํฉ๋ฉ๋๋ค.
- ์ ๋๋ฒ์ค/๋ํ ์๋ฐ์คํฌ๋ฆฝํธ: ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋์์ ์คํ๋๋ ์ฝ๋์ ๊ฒฝ์ฐ, ES ๋ชจ๋์ด ํต์ผ๋ ํน์ฑ์ผ๋ก ์ธํด ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํจํด์ ์๋์ ์ธ ํด๊ฒฐ์ฑ ์์ ES ๋ชจ๋๊ณผ ๊ฐ์ ํ์คํ๋๊ณ ๊ฐ๋ ฅํ ์์คํ ์ผ๋ก ํฌ๊ฒ ๋ฐ์ ํ์ต๋๋ค. ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ์๊ฒ ๋ชจ๋์ฑ์ ๋ํ ๋ช ํํ๊ณ ์ผ๊ด๋๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํ๋ ๊ฒ์ ํ์ , ์ฝ๋ ํ์ง ๋ฐ ํ๋ก์ ํธ ์ฑ๊ณต์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
ES ๋ชจ๋์ ์ฑํํ๊ณ , ๊น๋ํ ๋ชจ๋ API๋ฅผ ์ค๊ณํ๊ณ , ์์กด์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ํ๋์ ์ธ ๋๊ตฌ๋ฅผ ํ์ฉํ๊ณ , ๊ฒฌ๊ณ ํ ํ ์คํธ ์ ๋ต์ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ๋ฐ ํ์ ๊ธ๋ก๋ฒ ์์ฅ์ ์๊ตฌ์ ๋ถ์ํ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ๊ณ ํ์ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจํด์ ์ดํดํ๋ ๊ฒ์ ๋จ์ํ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ด์์ ๋๋ค. ์ด๋ ๊ตญ๊ฒฝ์ ๋์ด ์ํํ ํ์ ๊ณผ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ ๋๋ค.
๊ธ๋ก๋ฒ ํ์ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ:
- ES ๋ชจ๋๋ก ํ์คํ: ESM์ ๊ธฐ๋ณธ ๋ชจ๋ ์์คํ ์ผ๋ก ๋ชฉํํฉ๋๋ค.
- ๋ช ์์ ๋ฌธ์ํ: ๋ชจ๋ ๋ด๋ณด๋ธ API์ JSDoc์ ์ฌ์ฉํฉ๋๋ค.
- ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ: ๊ณต์ ๋ ์ค์ ์ผ๋ก ๋ฆฐํฐ(ESLint)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋น๋ ์๋ํ: CI/CD ํ์ดํ๋ผ์ธ์ด ๋ชจ๋ ๋ฒ๋ค๋ง๊ณผ ํธ๋์คํ์ผ๋ง์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ ๊ธฐ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ: ๋ฆฌ๋ทฐ ์ค์ ๋ชจ๋์ฑ๊ณผ ํจํด ์ค์์ ์ง์คํฉ๋๋ค.
- ์ง์ ๊ณต์ : ์ ํํ ๋ชจ๋ ์ ๋ต์ ๋ํ ๋ด๋ถ ์ํฌ์์ ์งํํ๊ฑฐ๋ ๋ฌธ์๋ฅผ ๊ณต์ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํจํด์ ๋ง์คํฐํ๋ ๊ฒ์ ๊ณ์๋๋ ์ฌ์ ์ ๋๋ค. ์ต์ ํ์ค๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊พธ์คํ ์ ๋ฐ์ดํธํจ์ผ๋ก์จ, ํ๋ก์ ํธ๊ฐ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค๊ณผ์ ํ์ ์ ๋๋น๋ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๊ธฐ๋ฐ ์์ ๊ตฌ์ถ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.