π μλ°μ€ν¬λ¦½νΈ λͺ¨λ ν¨ν΄μ νμ©ν μμ ν λ°μ΄ν° κ΄λ¦¬ μ λ΅
β 1. κ°μ: μ μ λ³μ μ μΈμ ꡬ쑰μ μ·¨μ½μ
μλ°μ€ν¬λ¦½νΈμμ var ν€μλλ₯Ό μ¬μ©ν΄ νμΌ μ΅μλ¨μ λ³μλ₯Ό μ μΈνλ λ°©μ(Global Scope)μ λ°μ΄ν° λ ΈμΆκ³Ό μ€μΌμ λ§€μ° μ·¨μ½νλ€. μ‘°νμ© λ°μ΄ν°λΌ ν μ§λΌλ λΈλΌμ°μ μ½μμ ν΅ν΄ λꡬλ μ κ·Όνκ³ μμ ν μ μλ€λ©΄, λ°νμ νκ²½μμ λ°μ΄ν° 무결μ±μ 보μ₯ν μ μλ€. λ³Έ κΈμμλ μ¦μ μ€ν ν¨μ(IIFE)μ ν΄λ‘μ (Closure)λ₯Ό νμ©νμ¬ λ°μ΄ν°λ₯Ό μΊ‘μννλ λͺ¨λ ν¨ν΄μ λν΄ κΈ°μ νλ€.
β 2. κ°λ λ° ν¨ν΄ κΈ°λ³Έ ꡬ쑰
β 2-1. κ°λ
- μ¦μ μ€ν ν¨μ(IIFE): ν¨μ μ μμ λμμ μ€νλλ ν¨ν΄μΌλ‘, λ΄λΆ λ³μκ° μ μ μ€μ½νμ μΉ¨λ²νλ κ²μ λ°©μ§νλ€.
- ν΄λ‘μ (Closure): ν¨μκ° μ μΈλ λΉμμ λ μ컬 νκ²½μ κΈ°μ΅νμ¬, μΈλΆ ν¨μκ° μ’ λ£λ νμλ λ΄λΆ λ³μμ μ κ·Όν μ μλ λ©μ»€λμ¦μ΄λ€.
- λͺ¨λ ν¨ν΄(Module Pattern): ν΄λ‘μ λ₯Ό μ΄μ©νμ¬ μΈλΆμμ μ κ·Ό λΆκ°λ₯ν Private λ³μλ₯Ό μμ±νκ³ , νμν κΈ°λ₯λ§ Public λ©μλλ‘ λ ΈμΆνλ μ€κ³ λ°©μμ΄λ€.
β 2-2. κΈ°λ³Έ ꡬ쑰
var ModuleName = (function() {
// Private: μΈλΆμμ μ§μ μ κ·Ό λΆκ°
var _privateData = [];
// Public: μΈλΆλ‘ λ
ΈμΆλλ μΈν°νμ΄μ€
return {
setData: function(data) {
_privateData = data;
},
getData: function() {
return _privateData;
}
};
})();
β 3. ꡬ쑰μ κ°μ λΉκ΅ (Before vs After)
β 3-1. [Before] μ μ λ³μ λ°©μ (Global Variable)
λ°μ΄ν°κ° μ μ μ€μ½νμ λ ΈμΆλμ΄ λ³΄μκ³Ό κ΄λ¦¬ μΈ‘λ©΄μμ μννλ€.
// κ° JS νμΌ μ΅μλ¨ μ μΈ
var factoryListRowData = [];
// μνμ± μμ: μ½μμ°½μμ μ¦μ λ³μ‘° κ°λ₯
// > factoryListRowData = "malicious data"; (κΈ°μ‘΄ λ°μ΄ν° νκ΄΄)
β 3-2. [After] λͺ¨λ ν¨ν΄ μ μ© (Encapsulated)
λ°μ΄ν°λ₯Ό ν¨μ μ€μ½ν μμ κ°λμ΄ μΈλΆμ μ§μ μ μΈ μ κ·Όμ μ°¨λ¨νλ€.
var FactoryModule = (function() {
var _factoryListRowData = []; // κΈκ³ λ΄λΆ
return {
setList: function(list) {
_factoryListRowData = list;
},
getRow: function(id) {
return _factoryListRowData.find(function(item) {
return item.portlet_id === id;
});
}
};
})();
// νΈμΆ μ: FactoryModule.getRow('ID01');
// μ‘°μ μλ: FactoryModule._factoryListRowData; // undefined (μ κ·Ό λΆκ°)
β 4. λ°μ΄ν° κ²λ¬Έμ μν μ ν΅ν μμ μ± ν보
λ¨μν λ³μλ₯Ό μ¨κΈ°λ κ²μ λμ΄, λͺ¨λ ν¨ν΄μ λ°μ΄ν°μ μ ꡬ(Setter)μ 'κ²λ¬Έμ'λ₯Ό μΈμ λ°μ΄ν° 무결μ±μ ν보ν μ μλ€.
β 4-1. μμ μλμ λͺ νν μ ν (Validation)
λ°μ΄ν° μ λ ₯ μ μ ν¨μ± κ²μ¬ λ‘μ§μ ν¬ν¨νμ¬ μλͺ»λ λ°μ΄ν°κ° μ μ λλ κ²μ λ°©μ§νλ€.
setList: function(list) {
if (!Array.isArray(list)) {
console.error("λ°°μ΄ νμμ΄ μλλλ€.");
return;
}
_factoryListRowData = list;
}
β 4-2. μ½κΈ° μ μ© μν ꡬν (Read-Only)
μ΅μ΄ 1νλ§ λ°μ΄ν° μ μ₯μ νμ©νμ¬ λ°νμ μ€ μλμΉ μμ μμ μ μμ² μ°¨λ¨νλ€.
var isInitialized = false;
return {
setList: function(list) {
if (isInitialized) {
console.warn("μ΄λ―Έ μ΄κΈ°νλ λ°μ΄ν°λ μμ ν μ μμ΅λλ€.");
return;
}
_factoryListRowData = list;
isInitialized = true;
}
};
β 4-3. λλ²κΉ μ ν¨μ¨μ± μ¦λ (Traceability)
λ°μ΄ν° λ³κ²½μ΄ μΌμ΄λλ μμ μ λ‘κΉ μ΄λ μ€ν μΆμ μ μννμ¬ μ€λ₯ λ°μ μμΈμ λΉ λ₯΄κ² νμ ν μ μλ€.
setList: function(list) {
console.trace("λ°μ΄ν° λ³κ²½ μΆμ :"); // νΈμΆ μ€ν μΆλ ₯
_factoryListRowData = list;
}
β 5. κ²°λ‘ : λͺ¨λ ν¨ν΄μ νμμ±
λͺ¨λ ν¨ν΄μ κ΄μ¬μ¬μ λΆλ¦¬(SoC)λ₯Ό μ€ννκ³ , λ°μ΄ν°μ 무결μ±μ 보μ₯νλ©°, μμΈ‘ κ°λ₯ν μ½λλ₯Ό μμ±νκ² νλ€. μ΄λ λκ·λͺ¨ νλ‘μ νΈμμ μ μ μ€μΌμ λ°©μ§νκ³ λ³΄μ μ¬κ³ μ μ€λ―Έλ₯Ό μ°¨λ¨νλ κ°μ₯ κΈ°λ³Έμ μΈ λ°©μ΄μ νλ‘κ·Έλλ°μ μμμ΄λ€!!
'Frontend > javaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| HTML, DevTools Sourcesμ μ 보μ΄λ λ¬Έμ ν΄κ²° (sourceURL μ¬μ©) (0) | 2026.04.17 |
|---|---|
| 첨λΆνμΌ κ΄λ¦¬ (DataTransfer) (0) | 2025.11.08 |
| summernote - μλν° λΌμ΄λΈλ¬λ¦¬ (0) | 2025.08.31 |
| JavaScript λͺ¨λ μ¬μ© (0) | 2025.04.06 |
| JavaScript μ½λ μ€ν μμ & μ€ν νμ΄λ° μ μ΄ (0) | 2025.04.06 |