์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ด€์ฐฐ์ž(์˜ต์ €๋ฒ„)์˜ ๋ชฉ๋ก์„ ๊ฐ์ฒด์— ๋“ฑ๋กํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ ๋“œ๋“ฑ์„ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ๋ชฉ๋ก์˜ ๊ฐ ์˜ต์ €๋ฒ„์—๊ฒŒ ํ†ต์ง€ํ•˜๋„๋ก ํ•˜๋Š” ๋””์ž์ธํŒจํ„ด์ด๋‹ค.

์˜ต์ €๋ฒ„๋Š” ๊ณ„์†ํ•ด์„œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๊ณ , ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ธ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ํ•œ๋‚ฎ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ถˆ๊ณผํ•œ ์˜ต์ €๋ฒ„๊ฐ€ ์–ด๋–ป๊ฒŒ ์•Œ๊ณ ์žˆ๋Š”๊ฑธ๊นŒ?

๋‹ต์€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์— ์žˆ๋‹ค.

๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ํ•ด๋‹น ๊ฐ์ฒด์— ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌ๋…(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 ํŒจํ„ด์ฒ˜๋Ÿผ, ์„œ๋กœ๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜์ง€๋งŒ์„œ๋„ ์„œ๋กœ์— ๋Œ€ํ•ด ๋ชจ๋ฅด๋Š” ์ƒํƒœ์ด๊ธฐ ๋–„๋ฌธ์— ์ด์— ๋Œ€ํ•ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์˜ต์ €๋ฒ„๋ฅผ ์–ธ์ œ๋“  ์ƒˆ๋กœ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ
  • ์ƒˆ๋กœ์šด ํ˜•์‹์˜ ์˜ต์ €๋ฒ„๋ผ๋„ ์ฃผ์ œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ์ฃผ์ œ์™€ ์˜ต์ €๋ฒ„๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ฃผ์ œ๋‚˜ ์˜ต์ €๋ฒ„๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ