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μ—μ„œ 잘 κ³ μ•ˆλœ λ””μžμΈ νŒ¨ν„΄ 예제 λͺ©λ‘μ€ 발견 경둜λ₯Ό 계속 μœ μ§€ν•˜λŠ” 데 μœ μš©ν•œ λ¦¬μ†ŒμŠ€μž…λ‹ˆλ‹€.