ํ๋์ ํด๋์ค์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง์ ๊ฐ์ง๋ ํจํด์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋จ์ํ๊ฒ ๋ฆฌํฐ๋ด {} ๋ง์ผ๋ก๋ ์ฑ๊ธํค ํจํด์ ๋ง๋ค ์ ์๋ค.
const obj = {
a:27
}
const obj2 = {
a:27
}
console.log(obj==obj2) //false
๋ฆฌํฐ๋ด๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋ค๋ฅธ ์ด๋ค ๊ฐ์ฒด์๋ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ด์ฉ์ ๊ฐ์ง๋๋ผ๋ obj์ obj2๋ ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ๋น๊ณต๊ฐ ์ํ๋ ๋น๊ณต๊ฐ ํจ์๋ฅผ ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฑ๊ธํค ํจํด์ ๊ตฌ์ฑํ๋ค.
Class Singleton {
// constructor(์์ฑ์)
// class ๊ฐ์ฒด์ ์ด๊ธฐ๊ฐ ์ค์
// class ๋ด๋ถ์์๋ ํ ๊ฐ๋ง ์กด์ฌํ ์ ์๊ณ 2๋ฒ ์ด์ ์ฌ์ฉํ๋ฉด Syntax Error ๋ฐ์
constructor() {
// Singleton ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด, ์ธ์คํด์ค ์์ฑ
if (!Singleton.instance){
Singleton.instance = this;
}
// ์กด์ฌํ๋ค๋ฉด ๋ฐ๋ก ์ธ์คํด์ค ๋ฐํ
return Singleton.instance;
}
}
const a = new Singleton();
const b = new Singleton();
console.log(a==b) //true
์ด๋ฌํ ๋ฐฉ์์ ์ฑ๊ธํค ํจํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋์ ๋ง์ด ์ฐ์ธ๋ค.
const URL='mongodb://localhost:27017/kundolapp'
const createConnection = url => ({
"url" : url
})
class DB {
constructor(url) {
if (!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect() {
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a===b) // true
์ด์ ๊ฐ์ด DB.instance๋ผ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก a,b๋ฅผ ์์ฑํ ์ ์๋ค.
๋ณดํต ๊ณตํต๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํด์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ดํ ์ธ์คํด์ค ์์ฑ ๋น์ฉ์ ์๋ ์ ์๋ค.
๋จ์
TDD(Test Driven Development)๋ฅผ ํ ๋ ๊ฑธ๋ฆผ๋์ด ๋ ์ ์๋ค. TDD๋ฅผ ํ ๋, ๋จ์ ํ ์คํธ๋ฅผ ํ๊ฒ ๋๋๋ฐ ๋จ์ ํ ์คํธ๋ ํ ์คํธ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ฉฐ ํ ์คํธ๋ฅผ ์ด๋ค ์์๋ก๋ ์คํํ ์ ์์ด์ผ ํ๋ค. ํ์ง๋ง ์ฑ๊ธํค ํจํด์ ๋ฏธ๋ฆฌ ์์ฑ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ ํจํด์ด๋ฏ๋ก ๊ฐ ํ ์คํธ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ๊ฐ ์ด๋ ต๋ค.
์ฅ์
๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ์ง๊ณ ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์, ํด๋น ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ๊ณต์ ํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋๋ ๋น์ฉ์ด ์ค์ด๋ ๋ค.
์์กด์ฑ ์ฃผ์ (Dependency Injection)
์ฑ๊ธํค ํจํด์ ๋ชจ๋๊ฐ์ ๊ฒฐํฉ์ ๊ฐํ๊ฒ ๋ง๋ค ์ ์๋ค. ์ด๋ฅผ ์ํํ๊ธฐ ์ํด '์์กด์ฑ ์ฃผ์ '์ ์ด์ฉํ๋ค.
*์์กด์ฑ(์ข ์์ฑ) : A๊ฐ B์ ์์กด์ฑ์ด ์๋ค๋ ๊ฒ์ B์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด A๋ ๋ณํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํจ.
์ผ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ๋ฉ์ธ ๋ชจ๋์ด ์ง์ ๋ค๋ฅธ ํ์ ๋ชจ๋์ ๋ํ ์์กด์ฑ์ ์ฃผ๊ธฐ๋ณด๋ค๋ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ์ค๊ฐ์ ์์กด์ฑ ์ฃผ์ ์(Dependency Injection)๊ฐ ์ด ๋ถ๋ถ์ ๊ฐ๋ก์ฑ์ ๋ฉ์ธ ๋ชจ๋์ด ๊ฐ์ ์ ์ผ๋ก ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ด๋ค.
์ด๋ฅผ ํตํด ๋ฉ์ธ ๋ชจ๋์ ํ์ ๋ชจ๋์ ๋ํ ์์กด์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค. (๋์ปคํ๋ง ๋๋ค)
์์กด์ฑ ์ฃผ์ ์ ์์ ์ฝ๋๋ฅผ ์์๋ณด์
class Weapon {
public attack() {
console.log('hit!');
}
}
class Player {
private weapon: Weapon;
constructor() {
this.weapon = new Weapon();
}
public attack() {
this.weapon.attack();
}
}
const me = new Player();
me.attack();
์ ์ฝ๋์์ ๋ณด๋ฉด Player ํด๋์ค๋ Weapon ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก Weapon ํด๋์ค์ ๋ํด ์์กด์ฑ์ ๋๊ณ ์๋ค๊ณ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด ์ค์ Weapon ํด๋์ค๊ฐ ์๋๋ผ, Weapon ํด๋์ค๋ฅผ ์์๋ฐ์ Whip ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด Weapon์ ์์กดํ๋ ๋ชจ๋ ํด๋์ค๋ฅผ ์ฐพ์ ์์ ํด์ค์ผ ํ๋ค.
class Weapon {
public attack() {
console.log('hit!');
}
}
class Whip extends Weapon {
public attack() {
console.log('whipwhip!');
}
}
class Player {
private weapon: Weapon;
constructor() {
this.weapon = new Whip();
}
public attack() {
this.weapon.attack();
}
}
const me = new Player();
me.attack();
์ด๋ฌํ ๊ฒฝ์ฐ, ์์กด์ฑ ์ฃผ์ ์ ํ๋ ค๋ฉด ์์กดํ๊ณ ์๋ ์ฝ๋ ๋ถ๋ถ์์ ํด๋์ค๋ฅผ ์์ฑ์๋ก ๋ฐ์์ค๋ฉด ๋๋ค.
Player์์ ์์ฑ์๋ก ์์กดํ๊ณ ์ ํ๋ Weapon ํด๋์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋๊ฒจ์ค๋ค.
const me = new Player(new Whip());
๊ทธ๋ฌ๋ฉด ๊ธฐ์กด์ ์์กด์ฑ์ ๊ฐ์ง๋ Player ํด๋์ค๋ฅผ ์์ ํ ํ์์์ด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
์์กด์ฑ ์ฃผ์ ์ ์ฅ์
- ๋ชจ๋๋ค์ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ๋์ด ํ ์คํ ํ๊ธฐ ์ฝ๊ณ ๋ง์ด๊ทธ๋ ์ด์ (์ ๋ฐ์ดํธ)ํ๊ธฐ ์์ํ๋ค.
- ๊ตฌํํ ๋ ์ถ์ํ ๊ณ์ธต์ ๋ฃ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์์กด์ฑ ๋ฐฉํฅ์ด ์ผ๊ด๋๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์ถ๋ก ํ ์ ์์ผ๋ฉฐ, ๋ชจ๋ ๊ฐ์ ๊ด๊ณ๊ฐ ๋ ๋ช ํํด์ง๋ค.
์์กด์ฑ ์ฃผ์ ์ ๋จ์
- ๋ชจ๋๋ค์ด ๋์ฑ ๋ถ๋ฆฌ๋๋ฏ๋ก ํด๋์ค ์๊ฐ ๋์ด๋ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์๋ค.
- ์ฝ๊ฐ์ ๋ฐํ์ ํจ๋ํฐ๊ฐ ์๊ธฐ๊ธฐ๋ ํ๋ค.
์์กด์ฑ ์ฃผ์ ์์น
- ๊ณ ์์ค ๋ชจ๋์ ์ ์์ค ๋ชจ๋์ ์์กดํด์๋ ์๋๋ฉฐ, ๋ ๋ค ์ถ์ํ์ ์์กดํด์ผ ํ๋ค.
- ์ถ์ํ๋ ์ธ๋ถ ์ฌํญ์ ์์กดํ์ง ์์์ผ ํ๋ค.
- ์ฆ, ์์ ์์ค ๋ชจ๋์ ํ์ ์์ค ๋ชจ๋ ๋์ , ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ ๊ฐ์ ์ถ์ํ๋ ๊ฐ๋ ์ ์์กดํด์ผ ํฉ๋๋ค. ์ด๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ง์ ์์กดํ์ง ์๊ณ , ์ด๋ฅผ ์ถ์ํ์ ์์ํจ์ผ๋ก์จ ์์คํ ์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ํฅ์์ํค๋๋ฐ ๋์์ด ๋๋ค.
'CS > ๋์์ธ ํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์์ธ ํจํด] ํ๋ก์ ํจํด(Proxy Pattern)๊ณผ ํ๋ก์ ์๋ฒ(Proxy Server) (0) | 2023.08.03 |
---|---|
[๋์์ธ ํจํด] ์ต์ ๋ฒ ํจํด(Observer Pattern) (0) | 2023.08.02 |
[๋์์ธ ํจํด] ์ ๋ต ํจํด(Strategy Pattern) (0) | 2023.08.02 |
[๋์์ธ ํจํด] ํฉํ ๋ฆฌ ํจํด(Factory Pattern) (0) | 2023.08.01 |
[๋์์ธ ํจํด] SOLID ์์น (0) | 2023.08.01 |