

์ต์ ๋ฒ ํจํด์ ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ ๊ด์ฐฐ์(์ต์ ๋ฒ)์ ๋ชฉ๋ก์ ๊ฐ์ฒด์ ๋ฑ๋กํ์ฌ ์ํ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๋ฉ์๋ ๋๋ฑ์ ํตํด ๊ฐ์ฒด๊ฐ ์ง์ ๋ชฉ๋ก์ ๊ฐ ์ต์ ๋ฒ์๊ฒ ํต์งํ๋๋ก ํ๋ ๋์์ธํจํด์ด๋ค.
์ต์ ๋ฒ๋ ๊ณ์ํด์ ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ ์ํ์ด๊ณ , ์ด๋ฌํ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ์ฐ๊ด๋ ๊ฐ์ฒด๋ค์๊ฒ ์๋ฆผ์ ๋ณด๋ธ๋ค๊ณ ํ๋๋ฐ, ํ๋ฎ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ถ๊ณผํ ์ต์ ๋ฒ๊ฐ ์ด๋ป๊ฒ ์๊ณ ์๋๊ฑธ๊น?
๋ต์ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์๋ค.
๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ํด๋น ๊ฐ์ฒด์ ์ต์ ๋ฒ๋ฅผ ๊ตฌ๋ (attach)์ํค๊ณ , ํด๋น ๊ฐ์ฒด์ ์์กดํ๊ณ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ๋ ์ต์ ๋ฒ๋ฅผ ํตํด ์ ๋ฐ์ดํธ ์ํฉ์ ์ ์ ์๋๋ก ํ๋ค.
class Observer {
constructor() {
this.students = [];
}
add(student){
this.students.push(student);
}
getStateUpdate(student,action){
console.log(`ํ์ ${student.name}์ด ${action}์ ํ๋ค์ ๊ฑด๊ฐํ๊ฒ๋ง ์ปค์ผํ๋ค~`)
}
}ํ์ ์ต์ ๋ฒ๋ฅผ ๋ง๋ค์๋ค.
class Student{
observer
constructor(name){
this.name = name;
}
attach(observer){
this.observer = observer;
}
eat(){
console.log(`${this.name}์ด ๋ฐฅ์ ๋จน๋๋ค`)
this.#notify(this,"๋ฐฅ๋จน๊ธฐ")
}
#notify(who,action) {
this.observer.getStateUpdate(who,action);
}
}
const obeserver = new Observer();
const minsu = new Student("minsu");
minsu.attach(obeserver)
minsu.eat()๊ทธ๋ฆฌ๊ณ ํ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค์ ๋ฏผ์์๊ฒ ์ต์ ๋ฒ๋ฅผ ๊ตฌ๋ ์ํค๊ณ , ๋ฏผ์์ ๋ฉ์๋์์๋ ํด๋น ์ต์ ๋ฒ์๊ฒ ์์ ์ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋์์์ ํจ๊ป ์๋ฆฌ๋ ๋ฉ์๋๋ฅผ ์คํ์ํจ๋ค.
๊ทธ๋ผ ์ต์ ๋ฒ๋ ์ด๋ฌํ ์ํ ์
๋ฐ์ดํธ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
ํด๋น ์ต์ ๋ฒ๋ ๋ฐฐ์ด์ ํตํด ์์ ์ด ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๊ฐ์ฒด๋ค์ ๊ดํด์๋ ๊ฐ๊ฐ ์ํ๊ฐ ๊ฐฑ์ ๋์์ ๋ forEach๋ฅผ ํตํด ๊ฐ์ฒด๋ค์ ๋๋ฉด์ ๋์ผํ๊ฒ ์ํ ์
๋ฐ์ดํธ์ ๋ํด์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ์คํ์ํจ๋ค๋ฉด ๊ฐ ๊ฐ์ฒด๋ค์ด ์ด๋ฌํ ํ ๊ฐ์ฒด์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์์ ๋ค๋ ๋์ผํ๊ฒ ๊ฐ์ฒด๋ฅผ ๋๊ธฐํ์ํค๋ ์์
์ ์ํฌ ์ ์๋ค.
์ด๋ฌํ ๊ด๊ณ๋ ๊ฐ์ฒด๊ฐ์ ๋์จํ ๊ฒฐํฉ์ฑ์ด ํฌ์ธํธ์ด๋ค. ๋ ๊ฐ์ฒด๊ฐ ๋์จํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ค๋ ๊ฒ์ ๋์์ธํจํด ์ค Pub-Sub ํจํด์ฒ๋ผ, ์๋ก๊ฐ ์ํธ์์ฉ์ ํ์ง๋ง์๋ ์๋ก์ ๋ํด ๋ชจ๋ฅด๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด์ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์ต์ ๋ฒ๋ฅผ ์ธ์ ๋ ์๋ก ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ
- ์๋ก์ด ํ์์ ์ต์ ๋ฒ๋ผ๋ ์ฃผ์ ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์
- ์ฃผ์ ์ ์ต์ ๋ฒ๋ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- ์ฃผ์ ๋ ์ต์ ๋ฒ๊ฐ ๋ฐ๋๋๋ผ๋ ์๋ก์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์์