Reactμ μ€νμ μΈ experimental_useMutableSource ν μ λν ν¬κ΄μ μΈ κ°μ΄λ. React μ ν리μΌμ΄μ μμ κ°λ³ λ°μ΄ν° μμ€ κ΄λ¦¬λ₯Ό μν ꡬν, μ¬μ© μ¬λ‘, μ΄μ λ° μ μ¬μ κ³Όμ λ₯Ό νꡬν©λλ€.
React experimental_useMutableSource ꡬν: κ°λ³ λ°μ΄ν° μμ€ μ¬μΈ΅ λΆμ
μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μν μΈκΈ° μλ μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬μΈ Reactλ λμμμ΄ λ°μ νκ³ μμ΅λλ€. μ΅κ·Ό μΆκ°λ κΈ°λ₯ μ€ νλλ‘ νμ¬ μ€ν λ¨κ³μ μλ experimental_useMutableSource ν
μ νΉν ν₯λ―Έλ‘μ΅λλ€. μ΄ ν
μ React μ»΄ν¬λνΈ λ΄μμ μ§μ κ°λ³ λ°μ΄ν° μμ€λ₯Ό κ΄λ¦¬νλ μλ‘μ΄ μ κ·Ό λ°©μμ μ 곡ν©λλ€. μ΄ ν
μ ꡬνκ³Ό μ¬λ°λ₯Έ μ¬μ©λ²μ μ΄ν΄νλ©΄, νΉν κΈ°μ‘΄μ React μν κ΄λ¦¬ λ°©μμ΄ λΆμ‘±ν μλ리μ€μμ μν κ΄λ¦¬λ₯Ό μν κ°λ ₯ν μ ν¨ν΄μ νμ©ν μ μμ΅λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ experimental_useMutableSourceμ λ©μ»€λμ¦, μ¬μ© μ¬λ‘, μ₯μ λ° μ μ¬μ ν¨μ μ λν΄ μμΈν μμλ³Ό κ²μ
λλ€.
κ°λ³ λ°μ΄ν° μμ€(Mutable Data Source)λ 무μμΈκ°?
ν μ체λ₯Ό μ΄ν΄λ³΄κΈ° μ μ, κ°λ³ λ°μ΄ν° μμ€μ κ°λ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. Reactμ λ§₯λ½μμ κ°λ³ λ°μ΄ν° μμ€λ μ 체 κ΅μ²΄λ₯Ό μꡬνμ§ μκ³ μ§μ μμ λ μ μλ λ°μ΄ν° ꡬ쑰λ₯Ό μλ―Έν©λλ€. μ΄λ μν μ λ°μ΄νΈκ° μλ‘μ΄ λΆλ³ κ°μ²΄λ₯Ό μμ±νλ κ²μ ν¬ν¨νλ Reactμ μΌλ°μ μΈ μν κ΄λ¦¬ μ κ·Ό λ°©μκ³Ό λμ‘°λ©λλ€. κ°λ³ λ°μ΄ν° μμ€μ μλ λ€μκ³Ό κ°μ΅λλ€:
- μΈλΆ λΌμ΄λΈλ¬λ¦¬: MobXμ κ°μ λΌμ΄λΈλ¬λ¦¬λ DOM μμμ μ§μ μ μΈ μ‘°μμ κ°λ³ λ°μ΄ν° μμ€λ‘ κ°μ£Όλ μ μμ΅λλ€.
- 곡μ κ°μ²΄: μ ν리μΌμ΄μ μ μ¬λ¬ λΆλΆ κ°μ 곡μ λλ©°, λ€μν ν¨μλ λͺ¨λμ μν΄ μμ λ μ μλ κ°μ²΄μ λλ€.
- μ€μκ° λ°μ΄ν°: μΉμμΌ(WebSockets)μ΄λ μλ²-μ μ‘ μ΄λ²€νΈ(SSE)λ‘λΆν° μ§μμ μΌλ‘ μ λ°μ΄νΈλλ λ°μ΄ν° μ€νΈλ¦Όμ λλ€. μ£Όμ μμΈ νμκΈ°λ μ€μκ° μ μ μ λ°μ΄νΈλ₯Ό μμν΄ λ³΄μΈμ.
- κ²μ μν: Reactλ‘ κ΅¬μΆλ 볡μ‘ν κ²μμ κ²½μ°, κ²μ μνλ₯Ό κ°λ³ κ°μ²΄λ‘ μ§μ κ΄λ¦¬νλ κ²μ΄ Reactμ λΆλ³ μνμλ§ μμ‘΄νλ κ²λ³΄λ€ λ ν¨μ¨μ μΌ μ μμ΅λλ€.
- 3D μ¬ κ·Έλν: Three.jsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ κ°λ³ μ¬ κ·Έλνλ₯Ό μ μ§νλ©°, μ΄λ₯Ό Reactμ ν΅ν©νλ €λ©΄ μ΄λ¬ν κ·Έλνμ λ³κ²½ μ¬νμ ν¨μ¨μ μΌλ‘ μΆμ νλ λ©μ»€λμ¦μ΄ νμν©λλ€.
κΈ°μ‘΄μ React μν κ΄λ¦¬λ μ΄λ¬ν κ°λ³ λ°μ΄ν° μμ€λ₯Ό λ€λ£° λ λΉν¨μ¨μ μΌ μ μμ΅λλ€. μλνλ©΄ μμ€μ λͺ¨λ λ³κ²½μ΄ μλ‘μ΄ React μν κ°μ²΄λ₯Ό μμ±νκ³ μ»΄ν¬λνΈμ 리λ λλ§μ νΈλ¦¬κ±°ν΄μΌ νκΈ° λλ¬Έμ λλ€. μ΄λ νΉν λΉλ²ν μ λ°μ΄νΈλ λκ·λͺ¨ λ°μ΄ν° μΈνΈλ₯Ό λ€λ£° λ μ±λ₯ λ³λͺ© νμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
experimental_useMutableSource μκ°
experimental_useMutableSourceλ Reactμ μ»΄ν¬λνΈ λͺ¨λΈκ³Ό μΈλΆ κ°λ³ λ°μ΄ν° μμ€ κ°μ κ°κ·Ήμ λ©μ°κΈ° μν΄ μ€κ³λ React ν
μ
λλ€. μ΄ ν
μ μ¬μ©νλ©΄ React μ»΄ν¬λνΈκ° κ°λ³ λ°μ΄ν° μμ€μ λ³κ²½ μ¬νμ ꡬλ
νκ³ νμν λλ§ λ¦¬λ λλ§νμ¬ μ±λ₯μ μ΅μ ννκ³ λ°μμ±μ ν₯μμν¬ μ μμ΅λλ€. μ΄ ν
μ λ κ°μ μΈμλ₯Ό λ°μ΅λλ€:
- μμ€(Source): κ°λ³ λ°μ΄ν° μμ€ κ°μ²΄μ λλ€. MobX observableλΆν° μΌλ° μλ°μ€ν¬λ¦½νΈ κ°μ²΄κΉμ§ 무μμ΄λ λ μ μμ΅λλ€.
- μ νμ(Selector): μμ€μμ μ»΄ν¬λνΈμ νμν νΉμ λ°μ΄ν°λ₯Ό μΆμΆνλ ν¨μμ λλ€. μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈλ λ°μ΄ν° μμ€μ κ΄λ ¨ λΆλΆμλ§ κ΅¬λ νμ¬ λ¦¬λ λλ§μ λμ± μ΅μ νν μ μμ΅λλ€.
μ΄ ν
μ μμ€μμ μ νλ λ°μ΄ν°λ₯Ό λ°νν©λλ€. μμ€κ° λ³κ²½λλ©΄ Reactλ μ νμ ν¨μλ₯Ό λ€μ μ€ννκ³ , μ νλ λ°μ΄ν°κ° λ³κ²½λμλμ§ μ¬λΆ(Object.isλ₯Ό μ¬μ©νμ¬ λΉκ΅)μ λ°λΌ μ»΄ν¬λνΈλ₯Ό 리λ λλ§ν΄μΌ νλμ§ κ²°μ ν©λλ€.
κΈ°λ³Έ μ¬μ© μμ
μΌλ° μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ₯Ό κ°λ³ λ°μ΄ν° μμ€λ‘ μ¬μ©νλ κ°λ¨ν μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
const mutableSource = { value: 0 };
function incrementValue() {
mutableSource.value++;
// μ΄μμ μΌλ‘λ μ¬κΈ°μ λ κ°λ ₯ν λ³κ²½ μλ¦Ό λ©μ»€λμ¦μ΄ μμ΄μΌ ν©λλ€.
// μ΄ κ°λ¨ν μμ μμλ μλ νΈλ¦¬κ±°μ μμ‘΄ν©λλ€.
forceUpdate(); // 리λ λλ§μ νΈλ¦¬κ±°νλ ν¨μ (μλμμ μ€λͺ
)
}
function MyComponent() {
const value = experimental_useMutableSource(
mutableSource,
() => mutableSource.value,
);
return (
Value: {value}
);
}
// 리λ λλ§μ κ°μ νλ ν¬νΌ ν¨μ (νλ‘λμ
μλ μ ν©νμ§ μμ, μλ μ°Έμ‘°)
const [, forceUpdate] = React.useReducer(x => x + 1, 0);
μ€λͺ :
valueμμ±μ κ°μ§mutableSourceκ°μ²΄λ₯Ό μ μν©λλ€.incrementValueν¨μλvalueμμ±μ μ§μ μμ ν©λλ€.MyComponentλexperimental_useMutableSourceλ₯Ό μ¬μ©νμ¬mutableSource.valueμ λ³κ²½ μ¬νμ ꡬλ ν©λλ€.- μ νμ ν¨μ
() => mutableSource.valueλ κ΄λ ¨ λ°μ΄ν°λ₯Ό μΆμΆν©λλ€. - 'Increment' λ²νΌμ ν΄λ¦νλ©΄
incrementValueκ° νΈμΆλμ΄mutableSource.valueκ° μ λ°μ΄νΈλ©λλ€. - μ€μνκ²λ, 리λ λλ§μ νΈλ¦¬κ±°νκΈ° μν΄
forceUpdateν¨μκ° νΈμΆλ©λλ€. μ΄λ μμ°μ μν λ¨μνλ λ°©λ²μ λλ€. μ€μ μ ν리μΌμ΄μ μμλ κ°λ³ λ°μ΄ν° μμ€μ λ³κ²½ μ¬νμ Reactμ μ리λ λ μ κ΅ν λ©μ»€λμ¦μ΄ νμν©λλ€. λμμ λμ€μ λ Όμνκ² μ΅λλ€.
μ€μ: μ§μ λ°μ΄ν° μμ€λ₯Ό λ³κ²½νκ³ forceUpdateμ μμ‘΄νλ κ²μ μΌλ°μ μΌλ‘ νλ‘λμ
μ½λμ *κΆμ₯λμ§ μμ΅λλ€*. μ¬κΈ°μλ μ€λͺ
μ λ¨μννκΈ° μν΄ ν¬ν¨λμμ΅λλ€. λ λμ μ κ·Ό λ°©μμ μ μ ν observable ν¨ν΄μ΄λ λ³κ²½ μλ¦Ό λ©μ»€λμ¦μ μ 곡νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ
λλ€.
μ μ ν λ³κ²½ μλ¦Ό λ©μ»€λμ¦ κ΅¬ννκΈ°
experimental_useMutableSourceλ₯Ό μ¬μ©ν λμ ν΅μ¬ κ³Όμ λ κ°λ³ λ°μ΄ν° μμ€κ° λ³κ²½λ λ Reactμ μλ¦Όμ΄ κ°λλ‘ λ³΄μ₯νλ κ²μ
λλ€. λ¨μν λ°μ΄ν° μμ€λ₯Ό λ³κ²½νλ κ²λ§μΌλ‘λ μλμΌλ‘ 리λ λλ§μ΄ νΈλ¦¬κ±°λμ§ *μμ΅λλ€*. λ°μ΄ν°κ° μ
λ°μ΄νΈλμμμ Reactμ μ리λ λ©μ»€λμ¦μ΄ νμν©λλ€.
λ€μμ λͺ κ°μ§ μΌλ°μ μΈ μ κ·Ό λ°©μμ λλ€:
1. μ¬μ©μ μ μ Observable μ¬μ©νκΈ°
λ°μ΄ν°κ° λ³κ²½λ λ μ΄λ²€νΈλ₯Ό λ°μμν€λ μ¬μ©μ μ μ observable κ°μ²΄λ₯Ό λ§λ€ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈλ μ΄λ¬ν μ΄λ²€νΈλ₯Ό ꡬλ νκ³ κ·Έμ λ°λΌ μμ μ μ λ°μ΄νΈν μ μμ΅λλ€.
class Observable {
constructor(initialValue) {
this._value = initialValue;
this._listeners = [];
}
get value() {
return this._value;
}
set value(newValue) {
if (this._value !== newValue) {
this._value = newValue;
this.notifyListeners();
}
}
subscribe(listener) {
this._listeners.push(listener);
return () => {
this._listeners = this._listeners.filter(l => l !== listener);
};
}
notifyListeners() {
this._listeners.forEach(listener => listener());
}
}
const mutableSource = new Observable(0);
function incrementValue() {
mutableSource.value++;
}
function MyComponent() {
const value = experimental_useMutableSource(
mutableSource,
observable => observable.value,
() => mutableSource.value // μ€λ
μ· ν¨μ
);
const [, forceUpdate] = React.useReducer(x => x + 1, 0);
React.useEffect(() => {
const unsubscribe = mutableSource.subscribe(() => {
forceUpdate(); // λ³κ²½ μ 리λ λλ§ νΈλ¦¬κ±°
});
return () => unsubscribe(); // μΈλ§μ΄νΈ μ μ 리
}, [mutableSource]);
return (
Value: {value}
);
}
μ€λͺ :
- κ°κ³Ό 리μ€λ λͺ©λ‘μ κ΄λ¦¬νλ μ¬μ©μ μ μ
Observableν΄λμ€λ₯Ό μ μν©λλ€. valueμμ±μ setterλ κ°μ΄ λ³κ²½λ λλ§λ€ 리μ€λμκ² μ립λλ€.MyComponentλuseEffectλ₯Ό μ¬μ©νμ¬Observableμ ꡬλ ν©λλ€.Observableμ κ°μ΄ λ³κ²½λλ©΄ 리μ€λλforceUpdateλ₯Ό νΈμΆνμ¬ λ¦¬λ λλ§μ νΈλ¦¬κ±°ν©λλ€.useEffectν μ μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλ λ ꡬλ μ΄ μ 리λλλ‘ νμ¬ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§ν©λλ€.experimental_useMutableSourceμ μΈ λ²μ§Έ μΈμμΈ μ€λ μ· ν¨μκ° μ΄μ μ¬μ©λ©λλ€. μ΄λ Reactκ° μ μ¬μ μ λ°μ΄νΈ μ νμ κ°μ μ¬λ°λ₯΄κ² λΉκ΅νλ λ° νμν©λλ€.
μ΄ μ κ·Ό λ°©μμ κ°λ³ λ°μ΄ν° μμ€μ λ³κ²½ μ¬νμ μΆμ νλ λ κ°λ ₯νκ³ μ λ’°ν μ μλ λ°©λ²μ μ 곡ν©λλ€.
2. MobX μ¬μ©νκΈ°
MobXλ κ°λ³ λ°μ΄ν°λ₯Ό μ½κ² κ΄λ¦¬ν μ μκ² ν΄μ£Όλ μΈκΈ° μλ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬μ λλ€. μμ‘΄μ±μ μλμΌλ‘ μΆμ νκ³ κ΄λ ¨ λ°μ΄ν°κ° λ³κ²½λ λ μ»΄ν¬λνΈλ₯Ό μ λ°μ΄νΈν©λλ€.
import { makeObservable, observable, action } from "mobx";
import { observer } from "mobx-react-lite";
class Store {
value = 0;
constructor() {
makeObservable(this, {
value: observable,
increment: action,
});
}
increment = () => {
this.value++;
};
}
const store = new Store();
const MyComponent = observer(() => {
const value = experimental_useMutableSource(
store,
(s) => s.value,
() => store.value // μ€λ
μ· ν¨μ
);
return (
Value: {value}
);
});
export default MyComponent;
μ€λͺ :
- MobXλ₯Ό μ¬μ©νμ¬
valueμμ±κ³Όincrementμ‘μ μ κ°μ§ observablestoreλ₯Ό λ§λλλ€. observerκ³ μ°¨ μ»΄ν¬λνΈλstoreμ λ³κ²½ μ¬νμ μλμΌλ‘ ꡬλ ν©λλ€.experimental_useMutableSourceλstoreμvalueμ μ κ·Όνλ λ° μ¬μ©λ©λλ€.- 'Increment' λ²νΌμ ν΄λ¦νλ©΄
incrementμ‘μ μ΄storeμvalueλ₯Ό μ λ°μ΄νΈνκ³ , μ΄λ μλμΌλ‘MyComponentμ 리λ λλ§μ νΈλ¦¬κ±°ν©λλ€. - λ€μ λ§νμ§λ§, μ¬λ°λ₯Έ λΉκ΅λ₯Ό μν΄ μ€λ μ· ν¨μλ μ€μν©λλ€.
MobXλ κ°λ³ λ°μ΄ν° κ΄λ¦¬ νλ‘μΈμ€λ₯Ό λ¨μννκ³ React μ»΄ν¬λνΈκ° νμ μ΅μ μνλ₯Ό μ μ§νλλ‘ λ³΄μ₯ν©λλ€.
3. Recoil μ¬μ©νκΈ° (μ£Όμ νμ)
Recoilμ Facebookμμ λ§λ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ‘, μν κ΄λ¦¬μ λν λ€λ₯Έ μ κ·Ό λ°©μμ μ 곡ν©λλ€. Recoilμ μ£Όλ‘ λΆλ³ μνλ₯Ό λ€λ£¨μ§λ§, νΉμ μλ리μ€μμλ experimental_useMutableSourceμ ν΅ν©ν μ μμ΅λλ€. λ€λ§ μ΄λ μ£Όμν΄μ μ¬μ©ν΄μΌ ν©λλ€.
μΌλ°μ μΌλ‘ μ£Ό μν κ΄λ¦¬λ Recoilμ μ¬μ©νκ³ , νΉμ 격리λ κ°λ³ λ°μ΄ν° μμ€λ₯Ό κ΄λ¦¬νκΈ° μν΄ experimental_useMutableSourceλ₯Ό μ¬μ©ν μ μμ΅λλ€. Recoil atomμ μ§μ μμ νκΈ° μν΄ experimental_useMutableSourceλ₯Ό μ¬μ©νλ κ²μ μμΈ‘ν μ μλ λμμΌλ‘ μ΄μ΄μ§ μ μμΌλ―λ‘ νΌν΄μΌ ν©λλ€.
μμ (κ°λ μ - μ£Όμν΄μ μ¬μ©):
import { useRecoilState } from 'recoil';
import { myRecoilAtom } from './atoms'; // Recoil atomμ΄ μ μλμ΄ μλ€κ³ κ°μ
const mutableSource = { value: 0 };
function incrementValue() {
mutableSource.value++;
// μ¬κΈ°μλ μ¬μ ν λ³κ²½ μλ¦Ό λ©μ»€λμ¦(μ: μ¬μ©μ μ μ Observable)μ΄ νμν©λλ€
// μ§μ λ³κ²½νκ³ forceUpdateνλ κ²μ νλ‘λμ
μ *κΆμ₯λμ§ μμ΅λλ€*.
forceUpdate(); // μ μ ν ν΄κ²°μ±
μ μ΄μ μμ λ₯Ό μ°Έμ‘°νμΈμ.
}
function MyComponent() {
const [recoilValue, setRecoilValue] = useRecoilState(myRecoilAtom);
const mutableValue = experimental_useMutableSource(
mutableSource,
() => mutableSource.value,
() => mutableSource.value // μ€λ
μ· ν¨μ
);
// ... recoilValueμ mutableValueλ₯Ό λͺ¨λ μ¬μ©νλ μ»΄ν¬λνΈ λ‘μ§ ...
return (
Recoil Value: {recoilValue}
Mutable Value: {mutableValue}
);
}
Recoilκ³Ό experimental_useMutableSourceλ₯Ό ν¨κ» μ¬μ©ν λμ μ€μ κ³ λ €μ¬ν:
- Recoil Atomμ μ§μ μ μΈ λ³κ²½ νΌνκΈ°:
experimental_useMutableSourceλ₯Ό μ¬μ©νμ¬ Recoil atomμ κ°μ μ§μ μμ νμ§ λ§μΈμ. Recoil atomμ μ λ°μ΄νΈνλ €λ©΄useRecoilStateμμ μ 곡νλsetRecoilValueν¨μλ₯Ό μ¬μ©νμΈμ. - κ°λ³ λ°μ΄ν° 격리: Recoilμ΄ κ΄λ¦¬νλ μ 체 μ ν리μΌμ΄μ
μνμ μ€μνμ§ μμ μκ³ κ²©λ¦¬λ κ°λ³ λ°μ΄ν° μ‘°κ°μ κ΄λ¦¬νλ λ°μλ§
experimental_useMutableSourceλ₯Ό μ¬μ©νμΈμ. - λμ κ³ λ €: Recoilκ³Ό ν¨κ»
experimental_useMutableSourceλ₯Ό μ¬μ©νκΈ° μ μ, νμ μν(derived state)λ ν¨κ³Ό(effects)μ κ°μ Recoilμ λ΄μ₯ κΈ°λ₯μ μ¬μ©νμ¬ μνλ κ²°κ³Όλ₯Ό μ»μ μ μλμ§ μ μ€νκ² κ³ λ €νμΈμ.
experimental_useMutableSourceμ μ΄μ
experimental_useMutableSourceλ κ°λ³ λ°μ΄ν° μμ€λ₯Ό λ€λ£° λ κΈ°μ‘΄μ React μν κ΄λ¦¬μ λΉν΄ μ¬λ¬ κ°μ§ μ΄μ μ μ 곡ν©λλ€:
- μ±λ₯ ν₯μ: λ°μ΄ν° μμ€μ κ΄λ ¨ λΆλΆμλ§ κ΅¬λ
νκ³ νμν λλ§ λ¦¬λ λλ§ν¨μΌλ‘μ¨
experimental_useMutableSourceλ νΉν λΉλ²ν μ λ°μ΄νΈλ λκ·λͺ¨ λ°μ΄ν° μΈνΈλ₯Ό λ€λ£° λ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. - κ°λ¨ν ν΅ν©: μΈλΆ κ°λ³ λΌμ΄λΈλ¬λ¦¬ λ° λ°μ΄ν° μμ€λ₯Ό React μ»΄ν¬λνΈμ ν΅ν©νλ κΉ¨λνκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€.
- 보μΌλ¬νλ μ΄νΈ κ°μ: κ°λ³ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ λ° νμν 보μΌλ¬νλ μ΄νΈ μ½λμ μμ μ€μ¬ μ½λλ₯Ό λ κ°κ²°νκ³ μ μ§λ³΄μνκΈ° μ½κ² λ§λλλ€.
- λμμ± μ§μ:
experimental_useMutableSourceλ Reactμ λμμ± λͺ¨λ(Concurrent Mode)μ μ μλνλλ‘ μ€κ³λμ΄, Reactκ° κ°λ³ λ°μ΄ν°λ₯Ό λμΉμ§ μκ³ νμμ λ°λΌ λ λλ§μ μ€λ¨νκ³ μ¬κ°ν μ μλλ‘ ν©λλ€.
μ μ¬μ κ³Όμ λ° κ³ λ €μ¬ν
experimental_useMutableSourceλ μ¬λ¬ μ₯μ μ μ 곡νμ§λ§, μ μ¬μ μΈ κ³Όμ μ κ³ λ €μ¬νμ μΈμ§νλ κ²μ΄ μ€μν©λλ€:
- μ€νμ μν: μ΄ ν μ νμ¬ μ€ν λ¨κ³μ μμΌλ©°, μ΄λ ν₯ν APIκ° λ³κ²½λ μ μμμ μλ―Έν©λλ€. νμνλ€λ©΄ μ½λλ₯Ό μμ ν μ€λΉλ₯Ό ν΄μΌ ν©λλ€.
- 볡μ‘μ±: κ°λ³ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ κ²μ λ³Έμ§μ μΌλ‘ λΆλ³ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ κ²λ³΄λ€ λ 볡μ‘ν μ μμ΅λλ€. κ°λ³ λ°μ΄ν°λ₯Ό μ¬μ©νλ κ²μ μλ―Έλ₯Ό μ μ€νκ² κ³ λ €νκ³ μ½λκ° μ ν μ€νΈλκ³ μ μ§λ³΄μ κ°λ₯νμ§ νμΈνλ κ²μ΄ μ€μν©λλ€.
- λ³κ²½ μλ¦Ό: μμ λ Όμνλ―μ΄, κ°λ³ λ°μ΄ν° μμ€κ° λ³κ²½λ λ Reactμ μλ¦Όμ΄ κ°λλ‘ μ μ ν λ³κ²½ μλ¦Ό λ©μ»€λμ¦μ ꡬνν΄μΌ ν©λλ€. μ΄λ μ½λμ 볡μ‘μ±μ λν μ μμ΅λλ€.
- λλ²κΉ : κ°λ³ λ°μ΄ν°μ κ΄λ ¨λ λ¬Έμ λ₯Ό λλ²κΉ νλ κ²μ λΆλ³ λ°μ΄ν°μ κ΄λ ¨λ λ¬Έμ λ₯Ό λλ²κΉ νλ κ²λ³΄λ€ λ μ΄λ €μΈ μ μμ΅λλ€. κ°λ³ λ°μ΄ν° μμ€κ° μ΄λ»κ² μμ λκ³ Reactκ° μ΄λ¬ν λ³κ²½μ μ΄λ»κ² λ°μνλμ§ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
- μ€λ μ· ν¨μμ μ€μμ±: μ€λ μ· ν¨μ(μΈ λ²μ§Έ μΈμ)λ Reactκ° μ μ¬μ μ λ°μ΄νΈ μ νμ λ°μ΄ν°λ₯Ό μ¬λ°λ₯΄κ² λΉκ΅ν μ μλλ‘ λ³΄μ₯νλ λ° λ§€μ° μ€μν©λλ€. μ΄ ν¨μλ₯Ό μλ΅νκ±°λ μλͺ» ꡬννλ©΄ μκΈ°μΉ μμ λμμ΄ λ°μν μ μμ΅λλ€.
experimental_useMutableSource μ¬μ©μ μν λͺ¨λ² μ¬λ‘
experimental_useMutableSource μ¬μ©μ μ΄μ μ κ·Ήλννκ³ μνμ μ΅μννλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- μ μ ν λ³κ²½ μλ¦Ό λ©μ»€λμ¦ μ¬μ©: 리λ λλ§μ μλμΌλ‘ νΈλ¦¬κ±°νλ κ²μ μμ‘΄νμ§ λ§μΈμ. μ μ ν observable ν¨ν΄μ΄λ λ³κ²½ μλ¦Ό λ©μ»€λμ¦μ μ 곡νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμΈμ.
- κ°λ³ λ°μ΄ν°μ λ²μ μ΅μν: μκ³ κ²©λ¦¬λ κ°λ³ λ°μ΄ν° μ‘°κ°μ κ΄λ¦¬νλ λ°μλ§
experimental_useMutableSourceλ₯Ό μ¬μ©νμΈμ. ν¬κ±°λ 볡μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό κ΄λ¦¬νλ λ° μ¬μ©νλ κ²μ νΌνμΈμ. - μ² μ ν ν μ€νΈ μμ±: μ½λκ° μ¬λ°λ₯΄κ² μλνκ³ κ°λ³ λ°μ΄ν°κ° μ λλ‘ κ΄λ¦¬λκ³ μλμ§ νμΈνκΈ° μν΄ μ² μ ν ν μ€νΈλ₯Ό μμ±νμΈμ.
- μ½λ λ¬Έμν: κ°λ³ λ°μ΄ν° μμ€κ° μ΄λ»κ² μ¬μ©λκ³ Reactκ° λ³κ²½μ μ΄λ»κ² λ°μνλμ§ μ€λͺ νκΈ° μν΄ μ½λλ₯Ό λͺ ννκ² λ¬ΈμννμΈμ.
- μ±λ₯ μν₯ μΈμ§:
experimental_useMutableSourceκ° μ±λ₯μ ν₯μμν¬ μ μμ§λ§, μ μ¬μ μΈ μ±λ₯ μν₯μ μΈμ§νλ κ²μ΄ μ€μν©λλ€. νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ λ³λͺ© νμμ μλ³νκ³ κ·Έμ λ°λΌ μ½λλ₯Ό μ΅μ ννμΈμ. - κ°λ₯νλ€λ©΄ λΆλ³μ± μ νΈ:
experimental_useMutableSourceλ₯Ό μ¬μ©ν λμλ κ°λ₯νλ©΄ λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νκ³ λΆλ³ λ°©μμΌλ‘ μ λ°μ΄νΈνλλ‘ λ Έλ ₯νμΈμ. μ΄λ μ½λλ₯Ό λ¨μννκ³ λ²κ·Έμ μνμ μ€μ΄λ λ° λμμ΄ λ μ μμ΅λλ€. - μ€λ μ· ν¨μ μ΄ν΄: μ€λ μ· ν¨μμ λͺ©μ κ³Ό ꡬνμ μμ ν μ΄ν΄ν΄μΌ ν©λλ€. μ¬λ°λ₯Έ μ€λ μ· ν¨μλ μ μ ν μλμ νμμ μ λλ€.
μ¬μ© μ¬λ‘: μ€μ μμ
experimental_useMutableSourceκ° νΉν μ μ©ν μ μλ λͺ κ°μ§ μ€μ μ¬μ© μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
- Three.jsμμ ν΅ν©: Reactμ Three.jsλ‘ 3D μ ν리μΌμ΄μ
μ ꡬμΆν λ
experimental_useMutableSourceλ₯Ό μ¬μ©νμ¬ Three.js μ¬ κ·Έλνμ λ³κ²½ μ¬νμ ꡬλ νκ³ νμν λλ§ React μ»΄ν¬λνΈλ₯Ό 리λ λλ§ν μ μμ΅λλ€. μ΄λ λ§€ νλ μλ§λ€ μ 체 μ¬μ 리λ λλ§νλ κ²μ λΉν΄ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. - μ€μκ° λ°μ΄ν° μκ°ν: μ€μκ° λ°μ΄ν° μκ°νλ₯Ό ꡬμΆν λ
experimental_useMutableSourceλ₯Ό μ¬μ©νμ¬ μΉμμΌμ΄λ SSE μ€νΈλ¦Όμ μ λ°μ΄νΈλ₯Ό ꡬλ νκ³ λ°μ΄ν°κ° λ³κ²½λ λλ§ μ°¨νΈλ κ·Έλνλ₯Ό 리λ λλ§ν μ μμ΅λλ€. μ΄λ λ λΆλλ½κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. μ€μκ° μνΈνν κ°κ²©μ νμνλ λμ보λλ₯Ό μμν΄ λ³΄μΈμ.experimental_useMutableSourceλ₯Ό μ¬μ©νλ©΄ κ°κ²©μ΄ λ³λν λ λΆνμν 리λ λλ§μ λ°©μ§ν μ μμ΅λλ€. - κ²μ κ°λ°: κ²μ κ°λ°μμ
experimental_useMutableSourceλ κ²μ μνλ₯Ό κ΄λ¦¬νκ³ κ²μ μνκ° λ³κ²½λ λλ§ React μ»΄ν¬λνΈλ₯Ό 리λ λλ§νλ λ° μ¬μ©λ μ μμ΅λλ€. μ΄λ μ±λ₯μ ν₯μμν€κ³ μ§μ°μ μ€μΌ μ μμ΅λλ€. μλ₯Ό λ€μ΄, κ²μ μΊλ¦ν°μ μμΉμ 체λ ₯μ κ°λ³ κ°μ²΄λ‘ κ΄λ¦¬νκ³ , μΊλ¦ν° μ 보λ₯Ό νμνλ μ»΄ν¬λνΈμμexperimental_useMutableSourceλ₯Ό μ¬μ©νλ κ²μ λλ€. - νμ
νΈμ§: νμ
νΈμ§ μ ν리μΌμ΄μ
μ ꡬμΆν λ
experimental_useMutableSourceλ₯Ό μ¬μ©νμ¬ κ³΅μ λ¬Έμμ λ³κ²½ μ¬νμ ꡬλ νκ³ λ¬Έμκ° λ³κ²½λ λλ§ React μ»΄ν¬λνΈλ₯Ό 리λ λλ§ν μ μμ΅λλ€. μ΄λ μ€μκ° νμ νΈμ§ κ²½νμ μ 곡ν μ μμ΅λλ€. μ¬λ¬ μ¬μ©μκ° λμμ λ³κ²½ μμ μ μννλ 곡μ λ¬Έμ νΈμ§κΈ°λ₯Ό μκ°ν΄ 보μΈμ.experimental_useMutableSourceλ νΈμ§μ΄ μ΄λ£¨μ΄μ§ λ 리λ λλ§μ μ΅μ ννλ λ° λμμ΄ λ μ μμ΅λλ€. - λ κ±°μ μ½λ ν΅ν©:
experimental_useMutableSourceλ κ°λ³ λ°μ΄ν° ꡬ쑰μ μμ‘΄νλ λ κ±°μ μ½λλ² μ΄μ€μ Reactλ₯Ό ν΅ν©ν λλ μ μ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λ κ²μ μ²μλΆν° λ€μ μμ±ν νμ μμ΄ μ½λλ² μ΄μ€λ₯Ό μ μ§μ μΌλ‘ Reactλ‘ λ§μ΄κ·Έλ μ΄μ ν μ μμ΅λλ€.
κ²°λ‘
experimental_useMutableSourceλ React μ ν리μΌμ΄μ
μμ κ°λ³ λ°μ΄ν° μμ€λ₯Ό κ΄λ¦¬νκΈ° μν κ°λ ₯ν λꡬμ
λλ€. κ·Έ ꡬν, μ¬μ© μ¬λ‘, μ΄μ λ° μ μ¬μ κ³Όμ λ₯Ό μ΄ν΄ν¨μΌλ‘μ¨ λ ν¨μ¨μ μ΄κ³ λ°μμ±μ΄ λ°μ΄λλ©° μ μ§λ³΄μ κ°λ₯ν μ ν리μΌμ΄μ
μ ꡬμΆνλ λ° νμ©ν μ μμ΅λλ€. μ μ ν λ³κ²½ μλ¦Ό λ©μ»€λμ¦μ μ¬μ©νκ³ , κ°λ³ λ°μ΄ν°μ λ²μλ₯Ό μ΅μννλ©°, μ½λκ° μ¬λ°λ₯΄κ² μλνλμ§ νμΈνκΈ° μν΄ μ² μ ν ν
μ€νΈλ₯Ό μμ±νλ κ²μ μμ§ λ§μΈμ. Reactκ° κ³μ λ°μ ν¨μ λ°λΌ experimental_useMutableSourceλ React κ°λ°μ λ―Έλμμ μ μ λ μ€μν μν μ ν κ°λ₯μ±μ΄ λμ΅λλ€.
μμ§ μ€ν λ¨κ³μ΄μ§λ§, experimental_useMutableSourceλ κ°λ³ λ°μ΄ν° μμ€λ₯Ό νΌν μ μλ μν©μ μ²λ¦¬νκΈ° μν μ λ§ν μ κ·Ό λ°©μμ μ 곡ν©λλ€. κ·Έ μλ―Έλ₯Ό μ μ€νκ² κ³ λ €νκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄, κ°λ°μλ€μ κ³ μ±λ₯μ λ°μν React μ ν리μΌμ΄μ
μ λ§λ€κΈ° μν΄ κ·Έ νμ νμ©ν μ μμ΅λλ€. μ΄ κ°μΉ μλ ν
μ λν μ
λ°μ΄νΈμ μ μ¬μ μΈ λ³κ²½ μ¬νμ λν΄ React λ‘λλ§΅μ μ£ΌμνμΈμ.