MobX์์ 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๋ฅผ ์ ์ฉํ๋ฉด ๋๋?
=> ์ต์ ๋ฒ๋ธ ๊ฐ์ฒด์ ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ค์ฒฉ์ํฌ ์ ์์ต๋๋ค. ๊ฐ ์ปดํฌ๋ํธ์ ์ตํ์ ๋จ๊ณ์ ์ต์ ๋ฒ๋ธ ๊ฐ์ฒด๋ฅผ ์์น์ํค๊ณ , ์์ ์ปดํฌ๋ํธ์๋ ์ต์ ๋ฒ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ค์ฒฉ๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ์์ ์ตํ์ ์ปดํฌ๋ํธ์ ์๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ณ ์๋ ์์ ์ปดํฌ๋ํธ์ ์ต์ ๋ฒ๊ฐ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
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 ๐ป