Post

๐ŸŽจย 02. ์˜ต์ €๋ฒ„ ํŒจํ„ด

๐ŸŽจย 02. ์˜ต์ €๋ฒ„ ํŒจํ„ด

โ›ˆ๏ธย ๊ธฐ์ƒ ๋ชจ๋‹ˆํ„ฐ๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•Œ์•„๋ณด๊ธฐ

Weather-O-Rama์˜ ์ฐจ์„ธ๋Œ€ ์ธํ„ฐ๋„ท ๊ธฐ๋ฐ˜ ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜ ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ์— ํ•จ๊ป˜ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ธฐ์ƒ ๋ชจ๋‹ˆํ„ฐ๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด 3๊ฐ€์ง€ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  • ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜ (์‹ค์ œ ๊ธฐ์ƒ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฌผ๋ฆฌ ์žฅ๋น„)
  • WeatherData ๊ฐ์ฒด (๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์ •๋ณด๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฐ์ฒด)
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜„์žฌ ๊ธฐ์ƒ ์กฐ๊ฑด์„ ๋ณด์—ฌ ์ฃผ๋Š” ๋””์Šคํ”Œ๋ ˆ์ด ์žฅ๋น„

์š”๊ตฌ์‚ฌํ•ญ์€ WeatherData ๊ฐ์ฒด๋กœ ํ˜„์žฌ ์กฐ๊ฑด, ๊ธฐ์ƒ ํ†ต๊ณ„, ๊ธฐ์ƒ ์˜ˆ๋ณด 3๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ๋””์Šคํ”Œ๋ ˆ์ด ์žฅ๋น„์—์„œ ๊ฐฑ์‹ ํ•ด ๊ฐ€๋ฉด์„œ ๋ณด์—ฌ ์ฃผ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

โ›ˆ๏ธย WeatherData ํด๋ž˜์Šค ์‚ดํŽด๋ณด๊ธฐ

1
2
3
4
5
6
7
8
9
// WeatherData

// ํ•˜๊ธฐ 3๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋Š” ์˜จ๋„, ์Šต๋„, ๊ธฐ์•• ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.
getTemperature()
getHumidity()
getPressure()

// ๊ธฐ์ƒ ๊ด€์ธก๊ฐ’์ด ๊ฐฑ์‹ ๋  ๋•Œ๋งˆ๋‹ค ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
measurementsChanged()

ํ˜„์žฌ ์กฐ๊ฑด, ๊ธฐ์ƒ ํ†ต๊ณ„, ๊ธฐ์ƒ ์˜ˆ๋ณด๋ฅผ ๋ณด์—ฌ ์ฃผ๋Š” 3๊ฐ€์ง€ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋„๋ก measurementsChanged()๋ฅผ ๋ฐ”๊ฟ”๋ณด์ž.

โ›ˆ๏ธย ๊ตฌํ˜„ ๋ชฉํ‘œ

measurementsChanged() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค WeatherData()์—์„œ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๊นŒ์ง€๋Š” ํŒŒ์•…ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

  • WeatherData() ํด๋ž˜์Šค์—๋Š” 3๊ฐ€์ง€ ์ธก์ •๊ฐ’(์˜จ๋„, ์Šต๋„, ๊ธฐ์••)์˜ ๊ฒŒํ„ฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ธฐ์ƒ ์ธก์ • ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค measurementsChanged() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋””์Šคํ”Œ๋ ˆ์ด ์š”์†Œ 3๊ฐ€์ง€๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • ํ˜„์žฌ ์กฐ๊ฑด, ๊ธฐ์ƒ ํ†ต๊ณ„, ๊ธฐ์ƒ ์˜ˆ๋ณด
  • ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก measurementsChanged() ๋ฉ”์†Œ๋“œ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

์ถ”๊ฐ€ ๋ชฉํ‘œ

๋‚˜์ค‘์— ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜์ด ์„ฑ๊ณตํ•˜๋ฉด ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ๋” ๋Š˜์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ณ , ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

  • ํ™•์žฅ์„ฑ: ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ๋””์Šคํ”Œ๋ ˆ์ด ์š”์†Œ๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

โ›ˆ๏ธย ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜์šฉ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ

์šฐ์„  measurementsChanged() ๋ฉ”์†Œ๋“œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class WeatherData{

		// ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์„ ์–ธ
    
    public void measurementsChanged(){
	    	// WeatherData์— ์žˆ๋Š” ๊ฒŒํ„ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ตœ์‹  ์ธก์ •๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
	      // ๊ฐ ๊ฐ’์„ ์ ๋‹นํ•œ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
	    	float temp = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();

        // ๊ฐ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
        // ์ตœ์‹  ์ธก์ •๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด์„œ ๊ฐ ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์˜ update ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
        currentConditionsDisplay.update(temp, humidity, pressure);
        statisticsDisplay.update(temp, humidity, pressure);
        forecastDisplay.update(temp, humidity, pressure);
    }

    // ๊ธฐํƒ€ ๋ฉ”์†Œ๋“œ
}

โ›ˆ๏ธย ์›์น™์œผ๋กœ ์ถ”๊ฐ€ ์ฝ”๋“œ ์‚ดํŽด๋ณด๊ธฐ

1
2
3
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);

ํ•ด๋‹น ์ฝ”๋“œ์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋”ฉํ•˜๊ณ  ์žˆ๋‹ค.
    • ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋งž์ถฐ์„œ ์ฝ”๋”ฉํ–ˆ์œผ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ ์น˜์ง€ ์•Š๊ณ ๋Š” ๋‹ค๋ฅธ ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ƒˆ๋กœ์šด ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
  • ์‹คํ–‰ ์ค‘์— ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์„ ์บก์Аํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค.
    • ์ƒ๊ธฐ ๋ถ€๋ถ„์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์œผ๋กœ ์บก์Аํ™”ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ชจ๋‘ ์˜จ๋„, ์Šต๋„, ๊ธฐ์•• ๊ฐ’์„ ๋ฐ›์•„๋“ค์ด๋Š” update() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

โ›ˆ๏ธย ์˜ต์ €๋ฒ„ ํŒจํ„ด ์ดํ•ดํ•˜๊ธฐ

์‹ ๋ฌธ์ด๋‚˜ ์žก์ง€๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณด์ž.

  • ์‹ ๋ฌธ์‚ฌ๊ฐ€ ์‚ฌ์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ ๋ฌธ์„ ์ฐ์–ด๋‚ธ๋‹ค.
  • ๋…์ž๊ฐ€ ํŠน์ • ์‹ ๋ฌธ์‚ฌ์— ๊ตฌ๋… ์‹ ์ฒญ์„ ํ•˜๋ฉด ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์‹ ๋ฌธ์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ๋ฐฐ๋‹ฌ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ๋…์„ ํ•ด์ง€ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์‹ ๋ฌธ์„ ๊ณ„์† ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ ๋ฌธ์„ ๋” ์ด์ƒ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด ๊ตฌ๋… ํ•ด์ง€ ์‹ ์ฒญ์„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋”์ด์ƒ ์‹ ๋ฌธ์ด ์˜ค์ง€ ์•Š๋Š”๋‹ค.
  • ์‹ ๋ฌธ์‚ฌ๊ฐ€ ๋งํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๊ฐœ์ธ, ํ˜ธํ…”, ํ•ญ๊ณต์‚ฌ ๋ฐ ๊ธฐํƒ€ ํšŒ์‚ฌ ๋“ฑ์€ ๊พธ์ค€ํ•˜๊ฒŒ ์‹ ๋ฌธ์„ ๊ตฌ๋…ํ•˜๊ฑฐ๋‚˜ ํ•ด์ง€ํ•œ๋‹ค.

์‹ ๋ฌธ์‚ฌ + ๊ตฌ๋…์ž = ์˜ต์ €๋ฒ„ ํŒจํ„ด

์‹ ๋ฌธ์‚ฌ๋ฅผ ์ฃผ์ œ(subject), ๊ตฌ๋…์ž๋ฅผ ์˜ต์ €๋ฒ„(observer)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

Image

โ›ˆ๏ธย ์˜ต์ €๋ฒ„ ํŒจํ„ด์˜ ์ž‘๋™ ์›๋ฆฌ

  • ์˜ค๋ฆฌ ๊ฐ์ฒด๊ฐ€ ๋“ฑ์žฅํ•ด์„œ ์ฃผ์ œํ•œํ…Œ ์ž๊ธฐ๋„ ์˜ต์ €๋ฒ„๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ•œ๋‹ค.
    • ์ฃผ์ œ์—์„œ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ณด๋‚ด ์ฃผ๋Š” int ๊ฐ’์— ์ •๋ง ๊ด€์‹ฌ์ด ๋งŽ์•˜๋˜ ์˜ค๋ฆฌ๋Š” ์ •๋ง๋กœ ์˜ต์ €๋ฒ„๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค.
  • ์˜ค๋ฆฌ ๊ฐ์ฒด๋„ ์ •์‹ ์˜ต์ €๋ฒ„๊ฐ€ ๋œ๋‹ค.
    • ์˜ค๋ฆฌ๋Š” ๊ตฌ๋…์ž ๋ชฉ๋ก์— ์ด๋ฆ„์„ ์˜ฌ๋ฆฌ๊ณ  ๋‹ค์Œ์— ์ „๋‹ฌ๋  int ๊ฐ’์„ ์• ํƒ€๊ฒŒ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • ์ฃผ์ œ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋‹ค.
    • ์˜ค๋ฆฌ๋ฅผ ๋น„๋กฏํ•œ ๋ชจ๋“  ์˜ต์ €๋ฒ„๊ฐ€ ์ฃผ์ œ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ์—ฐ๋ฝ์„ ๋ฐ›๋Š”๋‹ค.
  • ์ฅ ๊ฐ์ฒด๊ฐ€ ์˜ต์ €๋ฒ„ ๋ชฉ๋ก์—์„œ ํƒˆํ‡ดํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์š”์ฒญ์„ ํ•œ๋‹ค.
    • ์ฅ ๊ฐ์ฒด๋Š” ํ•œ์ฐธ ์ „๋ถ€ํ„ฐ int ๊ฐ’์„ ๋ฐ›์•„์™”์ง€๋งŒ ์ง€๊ฒจ์›Œ์„œ ํ•ด์ง€ ์š”์ฒญ์„ ํ•œ๋‹ค.
  • ์ฃผ์ œ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์—ฌ ์ฅ ๊ฐ์ฒด๋ฅผ ์˜ต์ €๋ฒ„ ์ง‘ํ•ฉ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์ฃผ์ œ์— ์ƒˆ๋กœ์šด int ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค.
    • ๋ชจ๋“  ์˜ต์ €๋ฒ„๊ฐ€ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ์—ฐ๋ฝ์„ ๋ฐ›๋Š”๋‹ค. ์ฅ๋Š” ์ด์ œ ์—ฐ๋ฝ์„ ๋ฐ›์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์€ int ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ณ , ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์‹œ ์˜ต์ €๋ฒ„ ๋“ฑ๋ก ์š”์ฒญ์„ ํ•˜๋ฉด ๋œ๋‹ค.

โ›ˆ๏ธย ์˜ต์ €๋ฒ„ ํŒจํ„ด์˜ ์ •์˜

์˜ต์ €๋ฒ„ ํŒจํ„ด(Observer Pattern) ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ทธ ๊ฐ์ฒด์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์—ฐ๋ฝ์ด ๊ฐ€๊ณ  ์ž๋™์œผ๋กœ ๋‚ด์šฉ์ด ๊ฐฑ์‹ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ๋Œ€๋‹ค(one-to-many) ์˜์กด์„ฑ์„ ์ •์˜ํ•œ๋‹ค. ์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ๋ณดํ†ต ์ฃผ์ œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์˜ต์ €๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํด๋ž˜์Šค ๋””์ž์ธ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

Image

โ›ˆ๏ธย ๋А์Šจํ•œ ๊ฒฐํ•ฉ์˜ ์œ„๋ ฅ

๋А์Šจํ•œ ๊ฒฐํ•ฉ(Loose Coupling)์€ ๊ฐ์ฒด๋“ค์ด ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์„œ๋กœ๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ํ™œ์šฉํ•˜๋ฉด ์œ ์—ฐ์„ฑ์ด ์•„์ฃผ ์ข‹์•„์ง€๋Š”๋ฐ, ์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ํ›Œ๋ฅญํ•œ ์˜ˆ๋‹ค.

  • ์ฃผ์ œ๋Š” ์˜ต์ €๋ฒ„๊ฐ€ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค(Observer ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์•ˆ๋‹ค.
    • ์˜ต์ €๋ฒ„์˜ ๊ตฌ์ƒ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์˜ต์ €๋ฒ„๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋Š” ์•Œ ํ•„์š” ์—†๋‹ค.
  • ์˜ต์ €๋ฒ„๋Š” ์–ธ์ œ๋“ ์ง€ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฃผ์ œ๋Š” Observer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ชฉ๋ก์—๋งŒ ์˜์กดํ•˜๋ฏ€๋กœ ์–ธ์ œ๋“ ์ง€ ์ƒˆ๋กœ์šด ์˜ต์ €๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‹คํ–‰ ์ค‘ ํ•˜๋‚˜์˜ ์˜ต์ €๋ฒ„๋ฅผ ๋‹ค๋ฅธ ์˜ต์ €๋ฒ„๋กœ ๋ฐ”๊ฟ”๋„ ์ฃผ์ œ๋Š” ๊ณ„์†ํ•ด์„œ ๋‹ค๋ฅธ ์˜ต์ €๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„๋ฌด ๋•Œ๋‚˜ ์˜ต์ €๋ฒ„๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๋œ๋‹ค.
  • ์ƒˆ๋กœ์šด ํ˜•์‹์˜ ์˜ต์ €๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋„ ์ฃผ์ œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๋‹ค.
    • ์˜ต์ €๋ฒ„๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ตฌ์ƒ ํด๋ž˜์Šค๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ, ์ฃผ์ œ๋ฅผ ๋ฐ”๊ฟ€ ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์—์„œ Observer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์˜ต์ €๋ฒ„๋กœ ๋“ฑ๋กํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ฃผ์ œ๋Š” ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์ฃผ์ œ์™€ ์˜ต์ €๋ฒ„๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์„œ๋กœ ๋‹จ๋‹จํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ฃผ์ œ๋‚˜ ์˜ต์ €๋ฒ„๊ฐ€ ๋‹ฌ๋ผ์ ธ๋„ ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

๋””์ž์ธ ์›์น™

์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฐ์ฒด ์‚ฌ์ด์—๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋Š” ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒจ๋„ ๋ฌด๋‚œํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ƒํ˜ธ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โ›ˆ๏ธย ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜ ์„ค๊ณ„ํ•˜๊ธฐ

Image

  • Subject
  • Observer
    • ๋ชจ๋“  ๊ธฐ์ƒ ๊ตฌ์„ฑ ์š”์†Œ์— Observer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
    • ์ฃผ์ œ์—์„œ ์˜ต์ €๋ฒ„์— ๊ฐฑ์‹ ๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต
  • DisplayElement
    • ๋ชจ๋“  ๋””์Šคํ”Œ๋ ˆ์ด ์š”์†Œ์— ๊ตฌํ˜„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ฆ
  • WeatherData
    • Subject ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
  • CurrentConditionsDisplay
    • WeatherData ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์–ป์€ ํ˜„์žฌ ์ธก์ •๊ฐ’์„ ๋ณด์—ฌ์คŒ
  • StatisticsDisplay
    • ์ธก์ •์น˜์˜ ์ตœ์†Ÿ๊ฐ’, ํ‰๊ท , ์ตœ๋Œ“๊ฐ’์„ ์ถ”์ ํ•˜๊ณ  ํ™”๋ฉด์— ํ‘œ์‹œํ•จ
  • ForecastDisplay
    • ์ธก์ •์น˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ์ƒ ์˜ˆ๋ณด๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•จ
  • ThirdPartyDisplay
    • ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๋„ Observer์™€ DisplayElement ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์ƒˆ๋กœ์šด ๋””์Šคํ”Œ๋ ˆ์ด ์š”์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

โ›ˆ๏ธย ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pubilc interface Subject{
	// Observer๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ฐ๊ฐ ์˜ต์ €๋ฒ„๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ
	public void registerObserver(Observer o); 
  public void removeObserver(Observer o);
    
  // ์ฃผ์ œ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋“  ์˜ต์ €๋ฒ„์—๊ฒŒ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์•Œ๋ฆผ
  public void notifyObservers();
}

// ๋ชจ๋“  ์˜ต์ €๋ฒ„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
// ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์˜ต์ €๋ฒ„๋Š” update() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
public interface Observer{
	public void update(float temp, float humidity, float pressure);
}

// ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์•ผ ํ•  ๋•Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ
public interface DisplayElement{
	public void display();
}

โ›ˆ๏ธย Subject ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class WeatherData implements Subject {
// WeahterData์—์„œ Subject ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
	private List<Observer> observers; // Observer ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ArrayList ์ถ”๊ฐ€
	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData() {
		observers = new ArrayList<Observer>(); // ์ƒ์„ฑ์ž๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ
	}
	
  // ์˜ต์ €๋ฒ„๊ฐ€ ๋“ฑ๋ก์„ ์š”์ฒญํ•˜๋ฉด ๋ชฉ๋ก ๋งจ ๋’ค์— ์ถ”๊ฐ€
	public void registerObserver(Observer o) {
		observers.add(o);
	}
	
  // ์˜ต์ €๋ฒ„๊ฐ€ ํƒˆํ‡ด๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ชฉ๋ก์—์„œ ๋บŒ
	public void removeObserver(Observer o) {
		observers.remove(o);
	}
	
  // ๋ชจ๋“  ์˜ต์ €๋ฒ„์—๊ฒŒ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์•Œ๋ฆผ
  // ๋ชจ๋‘ Observer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” update() ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์ด๋ฏ€๋กœ ์†์‰ฝ๊ฒŒ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Œ
	public void notifyObservers() {
		for (Observer observer : observers) {
			observer.update(temperature, humidity, pressure);
		}
	}
	// ์—ฌ๊ธฐ๊นŒ์ง€ Subject ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ ๋ถ€๋ถ„
	
  // ๊ธฐ์ƒ ์Šคํ…Œ์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ๊ฐฑ์‹ ๋œ ์ธก์ •๊ฐ’์„ ๋ฐ›์œผ๋ฉด ์˜ต์ €๋ฒ„๋“ค์—๊ฒŒ ์•Œ๋ฆผ
	public void measurementsChanged() {
		notifyObservers();
	}
	
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		
		// ์‹ค์ œ ์žฅ๋น„์—์„œ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์„ ํ…Œ์ŠคํŠธ
		measurementsChanged();
	}

	// ๊ธฐํƒ€ WeatherData ๋ฉ”์†Œ๋“œ

}

โ›ˆ๏ธย ๋””์Šคํ”Œ๋ ˆ์ด ์š”์†Œ ๊ตฌํ˜„ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// API ๊ตฌ์กฐ์ƒ ๋ชจ๋“  ๋””์Šคํ”Œ๋ ˆ์ด ํ•ญ๋ชฉ์—์„œ DisplayElement ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„ํ•จ
// WeatherData ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ›์œผ๋ ค๋ฉด Observer๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
public class CurrentConditionsDisplay implements Observer, DisplayElement {
	private float temperature;
	private float humidity;
	private WeatherData weatherData;
	
  // ์ƒ์„ฑ์ž์— weatherData๋ผ๋Š” ์ฃผ์ œ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ, ๊ทธ ๊ฐ์ฒด๋ฅผ ์จ์„œ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์˜ต์ €๋ฒ„๋กœ ๋“ฑ๋ก
	public CurrentConditionsDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}
	
  // update()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์˜จ๋„์™€ ์Šต๋„๋ฅผ ์ €์žฅํ•˜๊ณ  display()๋ฅผ ํ˜ธ์ถœ
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		display();
	}
	
  // ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฐ›์€ ์˜จ๋„์™€ ์Šต๋„๋ฅผ ์ถœ๋ ฅ
	public void display() {
		System.out.println("Current conditions: " + temperature 
			+ "F degrees and " + humidity + "% humidity");
	}
}

โ›ˆ๏ธย ํ‘ธ์‹œ์™€ ํ’€ ๋ฐฉ์‹

์˜ต์ €๋ฒ„ ํŒจํ„ด์—์„œ ๊ตฌ๋…์ž(Observer)๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ํ‘ธ์‹œ(Push) ๋ฐฉ์‹๊ณผ ํ’€(Pull) ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

โœ… 1. ํ‘ธ์‹œ(Push) ๋ฐฉ์‹: โ€œ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ณด๋‚ด์คŒโ€

์ฃผ์ œ(subject)๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ต์ €๋ฒ„(Observer)์—๊ฒŒ ์ž๋™์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹.

  • ์˜ต์ €๋ฒ„๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๋งŒ ์„ ํƒํ•  ์ˆ˜ ์—†์Œ: ์ฃผ์ œ๊ฐ€ ์ฃผ๋Š” ๋Œ€๋กœ ๋ฐ›์•„์•ผ ํ•จ

๐Ÿ“ข ๋‰ด์Šค ์•Œ๋ฆผ(Push Notification)

1
- ๋‰ด์Šค ์•ฑ์—์„œ "์†๋ณด ์•Œ๋ฆผ"์„ ๋ณด๋‚ด๋ฉด, ๋‚ด๊ฐ€ ์›ํ•˜๋“  ์›ํ•˜์ง€ ์•Š๋“  ๋ฐ”๋กœ ๋ฐ›์•„์•ผ ํ•จ. - `useEffect()`์—์„œ **์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰**๋˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•จ.
1
2
3
useEffect(() => {
  console.log("์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:", count);
}, [count]); // count ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™ ์‹คํ–‰ (Push ๋ฐฉ์‹)

๐Ÿ“Œ ์žฅ์ 

โœ… ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๋ฏ€๋กœ ๋ฐ˜์‘์„ฑ์ด ์ข‹์Œ.

๐Ÿ“Œ ๋‹จ์ 

โŒ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ.


โœ… 2. ํ’€(Pull) ๋ฐฉ์‹: โ€œํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ๊ฐโ€ !MEMO : ๋А์Šจํ•œ ๊ฒฐํ•ฉ์€ ์•„๋‹˜

๐Ÿ‘‰ ์˜ต์ €๋ฒ„(Observer)๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ์ฃผ์ œ(subject)์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹.

  • ๊ตฌ๋…์ž๊ฐ€ ์›ํ•  ๋•Œ๋งŒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ.

๐Ÿœ ๋ผ๋ฉด ๋“์ด๊ธฐ (Pull ๋ฐฉ์‹)

1
2
- ๋ฐฐ๊ณ ํ”Œ ๋•Œ ๋‚ด๊ฐ€ ๋ƒ„๋น„๋ฅผ ์—ด์–ด๋ณด๊ณ  "๋‹ค ๋๋‚˜?" ํ™•์ธํ•˜๊ณ  ๋จน์Œ.
- ๋ผ๋ฉด์ด "๋‹ค ์ต์—ˆ์–ด์š”!"๋ผ๊ณ  ๋งํ•ด์ฃผ์ง€๋Š” ์•Š์Œ. - `useStore.getState()`์ฒ˜๋Ÿผ **ํ•„์š”ํ•  ๋•Œ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹**
1
2
const count = useStore.getState().count; // ํ˜„์žฌ count ๊ฐ’์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ด (Pull ๋ฐฉ์‹)
console.log("ํ˜„์žฌ ์นด์šดํŠธ ๊ฐ’:", count);

๐Ÿ“Œ ์žฅ์ 

โœ… ๋ถˆํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ ์–ด ์„ฑ๋Šฅ์ด ์ข‹์Œ.

๐Ÿ“Œ ๋‹จ์ 

โŒ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” ์ง์ ‘ ์š”์ฒญํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Œ.

๐Ÿ”ฅ ์ •๋ฆฌ! ํ‘ธ์‹œ vs ํ’€ (ํ•œ ์ค„ ์š”์•ฝ)

๋ฐฉ์‹๋™์ž‘ ๋ฐฉ์‹์žฅ์ ๋‹จ์ 
Push (ํ‘ธ์‹œ)๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐ”๋กœ ์ „๋‹ฌ์‹ค์‹œ๊ฐ„ ๋ฐ˜์‘์„ฑ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
Pull (ํ’€)ํ•„์š”ํ•  ๋•Œ๋งŒ ์ง์ ‘ ์š”์ฒญ !MEMO : ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์ „๋‹ฌ > ํ•„์š”ํ•˜๋ฉด ๊ฐ€์ ธ๋‹ค๊ฐ€ ์จ๋ถˆํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ ๋ฐฉ์ง€์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Œ

โ›ˆ๏ธย ํ’€ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ ๋ฐ”๊พธ๊ธฐ

๊ฐ’์ด ๋ณ€ํ–ˆ๋‹ค๋Š” ์•Œ๋ฆผ์„ ์˜ต์ €๋ฒ„๊ฐ€ ๋ฐ›์•˜์„ ๋•Œ ์ฃผ์ œ์— ์žˆ๋Š” ๊ฒŒํ„ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•„์š”ํ•œ ๊ฐ’์„ ๋‹น๊ฒจ์˜ค๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

โœ… 1. ์ฃผ์ œ์—์„œ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ

  1. ์˜ต์ €๋ฒ„์˜ update ๋ฉ”์†Œ๋“œ๋ฅผ ์ธ์ž ์—†์ด ํ˜ธ์ถœํ•˜๋„๋ก WeatherData์˜ notifyObservers() ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
1
2
3
4
5
	public void notifyObservers() {
		for (Observer observer : observers) {
			observer.update();
		}
	}

โœ… 2. ์˜ต์ €๋ฒ„์—์„œ ์•Œ๋ฆผ ๋ฐ›๊ธฐ

  1. Observer ์ธํ„ฐํŽ˜์ด์Šค์—์„œ update() ๋ฉ”์†Œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋„๋ก ์„œ๋ช…์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
1
2
3
	public interface Observer {
		public void update()
	}
  1. ๋งˆ์ง€๋ง‰์œผ๋กœ update() ๋ฉ”์†Œ๋“œ์˜ ์„œ๋ช…์„ ๋ฐ”๊พธ๊ณ  WeatherData์˜ ๊ฒŒํ„ฐ ๋ฉ”์†Œ๋“œ๋กœ ์ฃผ์ œ์˜ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ฐ Observer ๊ตฌ์ƒ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
1
2
3
4
5
	public void update() {
		this.temperature = weatherData.getTemperature()
		this.humidity = weatherData.getHumidity()
		display()
	}

โ›ˆ๏ธย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์† ์˜ต์ €๋ฒ„ ํŒจํ„ด ์•Œ์•„๋ณด๊ธฐ

๋‚˜: ์˜ต์ €๋ฒ„ ํŒจํ„ด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•Œ๋ ค์ค˜ ์ฑ…์—๋Š” ์Šค์œ™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚˜์˜ค๋Š”๋ฐ ์•„์˜ˆ ๋ชจ๋ฅด๊ฒ ๊ณ  ๋‚œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ ์นœ์ˆ™ํ•œ ๊ฑฐ ์ถ”์ฒœํ•ด์ค˜ ๊ฑฐ๊ธฐ์„œ ์–ด๋–ป๊ฒŒ ์˜ต์ €๋ฒ„ ํŒจํ„ด ์“ฐ๋Š”์ง€๋„ ๊ฐ™์ด ์•Œ๋ ค์ค˜

C์„ ์ƒ: Zustand๋Š” ๊ฐ„๊ฒฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, subscribe ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

  • ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ์ ์šฉํ•œ ์˜ˆ์‹œ: store.subscribe(callback)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ ๊ฐ€๋Šฅ

๐Ÿ” Zustand์—์„œ ์˜ต์ €๋ฒ„ ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜์—ˆ์„๊นŒ?

โœ… subscribe()์„ ํ™œ์šฉํ•œ ์ƒํƒœ ๊ฐ์ง€

Zustand๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ด๋ฅผ ๊ตฌ๋…(subscribe)ํ•˜๊ณ , ๊ตฌ๋…ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { create } from 'zustand';

// Zustand ์Šคํ† ์–ด ์ƒ์„ฑ
const useStore = create((set) => ({
  count: 0,
  increase: () => set((state) => ({ count: state.count + 1 })),
}));

// ๊ตฌ๋…(subscribe) ๊ธฐ๋Šฅ ํ™œ์šฉ
const unsubscribe = useStore.subscribe((state) => {
  console.log("๐Ÿ“ข ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€:", state.count);
});

// ์ƒํƒœ ๋ณ€๊ฒฝ
useStore.getState().increase(); // ์ฝ˜์†”: ๐Ÿ“ข ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€: 1

// ๊ตฌ๋… ํ•ด์ œ
unsubscribe();

๐Ÿง ์˜ต์ €๋ฒ„ ํŒจํ„ด์˜ ํ•ต์‹ฌ

  • useStore.subscribe((state) => {...}) โ†’ ์ƒํƒœ ๋ณ€ํ™” ๊ฐ์ง€ ํ›„ ํŠน์ • ๋™์ž‘ ์‹คํ–‰
  • unsubscribe() โ†’ ํ•„์š” ์—†์„ ๋•Œ ๊ตฌ๋… ํ•ด์ œ

๐Ÿš€ Zustand์—์„œ ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ์“ฐ๋Š” ์ด์œ 

  1. ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€: ํŠน์ • ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ์—…๋ฐ์ดํŠธ๋จ.
  2. ๋ฆฌ์•กํ‹ฐ๋ธŒํ•œ ์ƒํƒœ ๊ด€๋ฆฌ: ์ƒํƒœ ๋ณ€ํ™” ๊ฐ์ง€ ํ›„ ์ž๋™์œผ๋กœ ๋ฐ˜์‘.
  3. ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„ํŽธ: Redux๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ž„.
  4. ๊ตฌ๋… ํ•ด์ œ ๊ธฐ๋Šฅ ์ง€์›: ๋ถˆํ•„์š”ํ•œ ๊ตฌ๋…์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ.

Zustand๊ฐ€ Redux, Context API๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ํšจ์œจ์ ์ธ ์ด์œ ๋Š” ๋ฐ”๋กœ ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ํ™œ์šฉํ•œ ๊ตฌ๋… ์‹œ์Šคํ…œ ๋•๋ถ„์ด๋‹ค.


โ›ˆ๏ธย Reference

https://velog.io/@akimcse/%ED%97%A4%EB%93%9C-%ED%8D%BC%EC%8A%A4%ED%8A%B8-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-02.-%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4

https://greensky0026.tistory.com/264?category=1002449

This post is licensed under CC BY 4.0 by the author.