JavaScript Design Patterns_merlin - Lee-hyuna/33-js-concepts-kr GitHub Wiki
JavaScript Design Patterns
λ²μ : https://seesparkbox.com/foundry/javascript_design_patterns
κ°λ°μλ€μ μ ν립 λ λμμΈ ν¨ν΄μ μ¬μ©νμ¬ ν΄κ²°ν μμλ JavaScriptμ μ½λ© λ¬Έμ λ₯Ό μ’ μ’ κ²ͺμ΅λλ€. JavaScriptλ μ ν΅μ μΈ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μΈμ΄κ° μλκΈ° λλ¬Έμ λμμΈ ν¨ν΄μ μλ³νκΈ°λ μ΄λ ΅μ§λ§ λ¬μ±νκΈ°λ μ΄λ ΅μ§ μμ΅λλ€.
λμμΈ ν¨ν΄μ μ½λμμ μ§μ μ¬μ©ν μμλ μ½λ μ€λν«μ΄ μλλλ€ (μ : λ°μ΄ν° ꡬ쑰). 그보λ€λ μννΈμ¨μ΄ μμ§λμ΄λ§μ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ λν λ μνΌ μ λλ€. λμμΈ ν¨ν΄μ νλ‘κ·Έλλ¨Έκ° μμ© νλ‘κ·Έλ¨μ΄λ μμ€ν μ κ°λ° (λλ λμμΈ) ν λ μΌλ°μ μΈ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° μ¬μ©ν μμλ ꡬ쑰ν λ λͺ¨λ² μ¬λ‘μ λλ€.
κ°λ°μκ° λ°ν΄λ₯Ό μ¬ λ°λͺ νμ§ μλλ‘ μ΄λ¬ν ν¨ν΄μ μ¬λ°λ₯΄κ² μΈμνκ³ μ μ© ν μ μμ΄μΌν©λλ€. JavaScript μΈκ³μμ λμμΈ ν¨ν΄μ μ¬μ©ν μ μμμ 보μ¬μ£ΌκΈ° μν΄ JavaScriptμμ μΌλ°μ μΌλ‘ μ¬μ©λλ λμμΈ ν¨ν΄μ μμΈν μ€λͺ νκ² μ΅λλ€.
Creational Patterns
Prototype
μ΄κ²μ κ°μ²΄μ μμ±μ μλ‘μ΄ κ°μ²΄λ‘ 볡μ νκΈ° μν΄ νΉλ³ν μ¬μ©λλ λμμΈ ν¨ν΄μ λλ€. JavaScriptλ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νμ¬ μ΄λ₯Ό μννλ―λ‘ κ³ μ ν νλ‘ν νμ μ μ€μ νλ κ²μ νΉν JavaScriptμμ μμμΌ ν μ€μν λμμΈ ν¨ν΄μ λλ€.
μ:
function Hello (greeting) {
this.greeting = greeting || 'Hello World!';
}
Hello.prototype.speak = function(somethingElse) {
var message = somethingElse || this.greeting; console.log(message);
}
var hi = new Hello('Just saying hi!'); hi.speak();
hi.speak('Something different');
var hello = new Hello();
hello.speak();
hello.speak('Yep');
See the example on gist.github.com
μ νλ‘ν νμ μ μ¬μ©ν©λκΉ? JavaScriptμμ ν΄λμ€λ₯Ό μν κ²½μ° μ΄ λ°©λ²μΌλ‘ μ»μ μ μμ΅λλ€. ES6λ μμ μ λμ νμ§λ§ μ΄κ²μ΄ κΈ°μ‘΄ νλ‘ν νμ ν¨ν΄λ³΄λ€ ꡬ문 μ€ν μ΄λΌλ κ²μ μλ κ²μ΄ μ€μν©λλ€.
Module
λͺ¨λ ν¨ν΄μ νλ‘ν νμ λ€μμ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ ν¨ν΄ μΌ κ²μ λλ€. λͺ¨λμ μ¦μ νΈμΆλλ ν¨μμ (IIFE)μ΄μ΄μΌν©λλ€. λͺ¨λ λͺ¨λ μ½λλ ν΄λ‘μ λ΄μ μ‘΄μ¬ν©λλ€. ν¨μ μ€νμ ν΅ν΄ κ°μ μ λ¬νμ¬ λ³μλ₯Ό κ°μ Έμ΅λλ€. κ°μ²΄λ₯Ό λ°ννμ¬ λ³μ (λ ΈμΆ λ³μ)λ₯Ό λ΄ λ³΄λ λλ€.
μ λͺ¨λμ μ¬μ©ν©λκΉ? λ¨μΌ ν¨μ JavaScript μ΄μΈμ λͺ¨λ μμ€ν μμ λͺ¨λμ μ¬μ©ν΄μΌν©λλ€. μ μ λ€μ μ€νμ΄μ€λ₯Ό μ€μΌμν€μ§ μκ³ ν¨μλ₯Ό κ°μ Έμ€κ³ λ΄λ³΄λΌ μ μλλ‘ μ μ§νλ κ²μ΄ μ’μ΅λλ€.
var options = {
username: 'blah',
server: '127.0.0.1'
};
var ConfigObject = (function(params) {
var username = params.username || '',
server = params.server || '',
password = params.password || '';
function _checkPassword() {
if (this.password === '') {
console.log('no password!');
return false;
}
return true;
}
function _checkUsername() {
if (this.username === '') {
console.log('no username!');
return false;
}
return true;
}
function login() {
if (_checkPassword() && _checkUsername()) {
// perform login
}
}
return { login: login }
})(options);
See the example on gist.github.com
Singleton
μ±κΈ ν€ κ°μ²΄μ μμ±μ μ체 νΈμΆλμ΄μΌν©λλ€. μ¦, μ μν μ¦μ μ€νμν€κ³ μΈμ€ν΄μ€λ₯Ό μ μ₯ν©λλ€.
μ±κΈ ν€μ μΈμ μ¬μ©ν΄μΌν©λκΉ? μ±κΈ ν€ ν¨ν΄μ κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό μ νν νλλ§ μν λ μ¬μ©λ©λλ€. μ±κΈ ν€ μΈν°νμ΄μ€λ μμ²μ΄μμ λλ§λ€ ν΄λΉ μΈμ€ν΄μ€λ₯Ό λ°νν©λλ€.
μ:
var GlobalConfigurationObject = (function() {
var instance;
function createInstance() {
return new ConfigObject();
};
var getInstance = function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
return { getInstance: getInstance }
})();
See example on gist.github.com
Behavioral Patterns
Observer
λ©μ§ μμ μ μν΄ JavaScriptλ₯Ό μμ±νλ κ²½μ° μ΄λ―Έ κ΄μ°°μ ν¨ν΄μ μ¬μ©νκ³ μμ κ²μ λλ€. μ΄λ²€νΈκ° λ°μνμ λ ν¨μκ° μ€νλλλ‘ μ΄λ²€νΈ μ²λ¦¬κΈ°λ₯Ό λ§λ€λ©΄ μ΄κ²μ΄ κ΄μ°°μ ν¨ν΄μ λλ€. κ΄μ°°μ ν¨ν΄μ μ΄λ²€νΈλ₯Ό μμ νλλ‘ μ€λΈμ νΈλ₯Ό μ§μ νλ ꡬλ λͺ¨λΈμ λλ€.
μΈμ μ¬μ©ν©λκΉ? μ΄λ κ²νλ©΄ λ°μ νκ² μ°κ²°λ μ½λλ₯Ό λ°©μ§ ν μ μμ΅λλ€.
Example: http://www.dofactory.com/javascript/observer-design-pattern
Structural Patterns
Adapter
μ΄λν° ν¨ν΄μ νλμ μΈν°νμ΄μ€μμ λ€λ₯Έ μΈν°νμ΄μ€λ‘μ μΆμν λλ μ€κ°κ°μ²΄ μ λλ€. μΌλ°μ μΌλ‘ μ΄λ API μλ΅ κ°μ²΄, μμ API λ°μ΄ν° (JSON, XML λ±)λ₯Ό μ¬μ© κ°λ₯ν JavaScript κ°μ²΄μ μ μ©ν©λλ€.
μΈμ μ¬μ©ν©λκΉ? JavaScriptμμλ μ΄λν°λ₯Ό μμ±νκΈ° μ μ λͺ νν λ°μ΄ν° λͺ¨λΈμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
Example: http://www.dofactory.com/javascript/adapter-design-pattern
Cleaner, Clearer Code
κ°λ°μλ λμμΈ ν¨ν΄μ μ μ©νμ¬λ³΄λ€ κΉλνκ³ μ²΄κ³μ μΈ JavaScriptλ₯Ό μμ±ν μ μμ΅λλ€. λμμΈ ν¨ν΄ (Ember, React, KnockoutJS)μ μ¬μ©νλ νλ μ μν¬μ μ¬μ©κ³Ό μΈκΈ°κ° λμμ§μ λ°λΌ μννΈμ¨μ΄ λμμΈ ν¨ν΄μ κ·Έ μ΄λ λ보 λ€ μλ³νκ³ νμ©ν μ μμ΄μΌν©λλ€. κ°λ°μκ° JavaScriptμμ κ°λ₯ν ν λ§μ λμμΈ ν¨ν΄μ μ¬μ©νλλ‘ κΆμ₯ν©λλ€. JavaScriptμμ μ κ³ μλ λμμΈ ν¨ν΄ μμ λͺ©λ‘μ λ°κ²¬ κ²½λ‘λ₯Ό κ³μ μ μ§νλ λ° μ μ©ν 리μμ€μ λλ€.