[MobX] ๐Ÿ”ฆ observable๊ณผ observer์˜ ํ™œ์šฉ

okorionยท2023๋…„ 5์›” 23์ผ
0

๐ŸŽ MobX

๋ชฉ๋ก ๋ณด๊ธฐ
1/1
post-thumbnail

MobX์—์„œ observable๋กœ ๋‘˜๋Ÿฌ ์Œ“์ธ ๊ฐ์ฒด๋Š” ์ƒํƒœ๋งŒ ์žˆ๋Š”๊ฒŒ ๋‚ซ์ง€ ์•Š์„๊นŒ? observable๋กœ ๋‘˜๋Ÿฌ์Œ“์ธ ๊ฐ์ฒด์— ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€?

=> observable ๊ฐ์ฒด๋Š” ๋ณ€ํ™” ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ observable ๊ฐ์ฒด์— ์ข…์†๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ๋„ ํ•œ๋‹ค!

๐Ÿ”— observable ๊ฐ์ฒด์— ์ข…์†๋œ ํ•จ์ˆ˜

observable๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๊ฐ์ฒด์— ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ MobX์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ MobX์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ์ž๋™ ๋ฐ˜์‘(automatic reaction)์„ ํ†ตํ•ด ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ observable ๊ฐ์ฒด์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์บก์Аํ™”: ํ•จ์ˆ˜๋ฅผ observable ๊ฐ์ฒด์— ํฌํ•จ์‹œํ‚ค๋ฉด ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์บก์Аํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์ด ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์–ด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ž๋™ ๋ฐ˜์‘: MobX์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ์ž๋™ ๋ฐ˜์‘์€ observable ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ observable ๊ฐ์ฒด์— ์ข…์†๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒํƒœ ๋ณ€ํ™”์— ์ž๋™์œผ๋กœ ๋ฐ˜์‘ํ•˜์—ฌ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

3. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ: ํ•จ์ˆ˜๋ฅผ observable ๊ฐ์ฒด์— ํฌํ•จ์‹œํ‚ค๋ฉด ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์ด ํ•œ ๊ณณ์— ๋ชจ์—ฌ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ํ•จ์ˆ˜์™€ ์ƒํƒœ๊ฐ€ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ณ  ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

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

๐Ÿ“ƒ ์˜ˆ๋ฌธ

์šฐ๋ฆฌ๋Š” ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜จ๋ผ์ธ ์ƒ์ ์„ ์šด์˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
์ฃผ๋ฌธ(order) ๊ฐ์ฒด๋ฅผ ์˜ต์ €๋ฒ„๋ธ”๋กœ ๋งŒ๋“ค๊ณ ,
ํ•ด๋‹น ๊ฐ์ฒด์—๋Š” ์ฃผ๋ฌธ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๐Ÿ”Œ ์˜ˆ์‹œ ์ฝ”๋“œ

์•„๋ž˜๋Š” MobX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด์— ํ•จ์ˆ˜๋ฅผ ์ข…์†์‹œํ‚ค๊ณ , ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ฃผ์„์„ ํ†ตํ•ด ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

import { observable, autorun } from "mobx";

// ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด ์ƒ์„ฑ
const user = observable({
  name: "Alice",
  age: 30,
});

// ํ•จ์ˆ˜ ์ข…์†์„ฑ ์„ค์ •
autorun(() => {
  console.log(`${user.name} is ${user.age} years old.`);
  // user ๊ฐ์ฒด์˜ name๊ณผ age์— ์ข…์†๋œ ํ•จ์ˆ˜
  // user์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ
});

// ์ƒํƒœ ๋ณ€๊ฒฝ
user.name = "Bob";
user.age = 35;

์œ„์˜ ์ฝ”๋“œ์—์„œ user๋ผ๋Š” ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , name๊ณผ age๋ผ๋Š” ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  autorun ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

autorun ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜๋Š” user ๊ฐ์ฒด์˜ name๊ณผ age์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” user ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, user ๊ฐ์ฒด์˜ name๊ณผ age๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ์ฝ˜์†”์— ${user.name} is ${user.age} years old.๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•จ์ˆ˜๋Š” user ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ user ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์ƒˆ๋กœ์šด ์ƒํƒœ์— ๋งž์ถฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด์— ํ•จ์ˆ˜๋ฅผ ์ข…์†์‹œํ‚ด์œผ๋กœ์จ, ์ƒํƒœ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐ŸŽซ observable๊ณผ observer์˜ ์ฝ”๋“œ ๊ตฌ์กฐ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹จ๊ณ„๋ณ„๋กœ ์ค‘์ฒฉ์ด ๋˜์–ด์žˆ์œผ๋ฉด ์ œ์ผ ๋ฐ ๋‹จ์— observable ๊ฐ์ฒด๋ฅผ ๋„ฃ๊ณ  ๊ทธ ์œ„์—๋Š” ๋‹จ๊ณ„๋ณ„๋กœ observer๋ฅผ ์ ์šฉํ•˜๋ฉด ๋˜๋‚˜?

=> ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด์™€ ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ค‘์ฒฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ตœํ•˜์œ„ ๋‹จ๊ณ„์— ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด๋ฅผ ์œ„์น˜์‹œํ‚ค๊ณ , ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—๋Š” ์˜ต์ €๋ฒ„๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ค‘์ฒฉ๋œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์—์„œ ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ต์ €๋ฒ„๊ฐ€ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

import { observer } from "mobx-react";
import { observable } from "mobx";

// ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด
const user = observable({
  name: "Alice",
  age: 30,
});

// ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ
const LowestComponent = observer(() => {
  return (
    <div>
      <p>Name: {user.name}</p>
      <p>Age: {user.age}</p>
      <button onClick={() => user.age++}>Increase Age</button>
    </div>
  );
});

// ์ค‘๊ฐ„ ๋‹จ๊ณ„ ์ปดํฌ๋„ŒํŠธ
// MiddleComponent์— observer๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ฝ”๋“œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ
// MiddleComponent๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ LowestComponent์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ 
// ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” observer๋ฅผ ์ ์šฉํ•ด์•ผ ํ•จ.
const MiddleComponent = () => {
  return (
    <div>
      <h2>Middle Component</h2>
      <LowestComponent />
    </div>
  );
};

// ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ
const TopComponent = observer(() => {
  return (
    <div>
      <h1>Top Component</h1>
      <MiddleComponent />
    </div>
  );
});

// ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง
ReactDOM.render(<TopComponent />, document.getElementById("root"));

์œ„์˜ ์ฝ”๋“œ์—์„œ LowestComponent๋Š” ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์˜ต์ €๋ฒ„๋ธ” ๊ฐ์ฒด user๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. user ๊ฐ์ฒด์˜ name๊ณผ age๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , Increase Age ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด age ์ƒํƒœ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

MiddleComponent๋Š” LowestComponent๋ฅผ ํฌํ•จํ•˜๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

TopComponent๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ, MiddleComponent๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ์—์„œ observer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ LowestComponent์—์„œ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ TopComponent์˜ ์˜ต์ €๋ฒ„๊ฐ€ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์ฒฉ๋œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ž๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘จโ€๐Ÿซ With ChatGPT ๐Ÿ’ป

profile
okorion's Tech Study Blog.

0๊ฐœ์˜ ๋Œ“๊ธ€