๊ฐ์ ๋ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ธ์ง ์ฑ๋ฅ์ ์ํด React์ experimental_useOptimistic์ ์ฌ์ฉํ์ฌ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ดํดํ๊ณ ๊ตฌํํ๋ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
React experimental_useOptimistic ๊ตฌํ: ๋๊ด์ ์ ๋ฐ์ดํธ
ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ ์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ์์ฉํ ๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ๊ธฐ๋ํ๋ฉฐ, ์ธ์ง๋๋ ์ง์ฐ์ ๋ถ๋ง์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์๋ฒ๋ก๋ถํฐ ํ์ธ์ ๋ฐ๊ธฐ ์ ์๋ ์๋ฒ ์ธก ์์ ์ด ์ด๋ฏธ ์ฑ๊ณตํ ๊ฒ์ฒ๋ผ UI๋ฅผ ์ฆ์ ์ ๋ฐ์ดํธํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค.
React 18์ ๋์
๋ experimental_useOptimistic ํ
์ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ ๋๊ด์ ์
๋ฐ์ดํธ์ ๊ฐ๋
์ ๊น์ด ํ๊ณ ๋ค๊ณ , experimental_useOptimistic ํ
์ ์์ธํ ์ดํด๋ณด๋ฉฐ, React ์ ํ๋ฆฌ์ผ์ด์
์์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐ ๋์์ด ๋๋ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ ๊ณตํ ๊ฒ์
๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ๋ ๋ฌด์์ธ๊ฐ?
๋๊ด์ ์ ๋ฐ์ดํธ๋ ๋คํธ์ํฌ ์์ฒญ์ด๋ ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณตํ ๊ฒ์ด๋ผ๋ ๊ฐ์ ํ์ ์ ์ ์ ์ผ๋ก ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ UI ํจํด์ ๋๋ค. ์๋ฒ๊ฐ ์์ ์ ํ์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ , ์ฆ์ UI์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ์ฌ ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์์ ๋ฏธ๋์ด ํ๋ซํผ์์ ๊ฒ์๋ฌผ์ '์ข์์'๋ฅผ ๋๋ฅด๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์๋ค๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฉด์ '์ข์์' ์๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ์๋ฒ๊ฐ '์ข์์'๋ฅผ ํ์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค. ์ด ์ง์ฐ์ ๋จ์ง ์๋ฐฑ ๋ฐ๋ฆฌ์ด์ ๋ถ๊ณผํ๋๋ผ๋ ๋๋ฆฌ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฌ์ฉ์๊ฐ '์ข์์' ๋ฒํผ์ ํด๋ฆญํ๋ ์ฆ์ '์ข์์' ์๊ฐ ์ฆ๊ฐํฉ๋๋ค. ๋ง์ฝ ์๋ฒ๊ฐ '์ข์์'๋ฅผ ํ์ธํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฒ๊ฐ ์ค๋ฅ(์: ๋คํธ์ํฌ ๋ฌธ์ ๋๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๋ก ์ธํ)๋ฅผ ๋ฐํํ๋ฉด UI๋ ์ด์ ์ํ๋ก ๋๋์๊ฐ๋ฉฐ, ๋๊น ์๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ์ ์ฅ์ :
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฐ์์ ์ด๊ณ ์ํธ์์ฉ์ ์ผ๋ก ๋๋ผ๊ฒ ํฉ๋๋ค.
- ์ธ์ง ์ง์ฐ ๊ฐ์: ์ฌ์ฉ์๋ ์๋ฒ๊ฐ ํ์ธํ๊ธฐ ์ ์๋ ์์ ์ ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ณผ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋น ๋ฅด๋ค๊ณ ์ธ์งํฉ๋๋ค.
- ์ฐธ์ฌ๋ ์ฆ์ง: ๋ ๋ฐ์์ ์ธ UI๋ ์ฌ์ฉ์ ์ฐธ์ฌ๋์ ๋ง์กฑ๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ์ ๊ณผ์ :
- ์ค๋ฅ ์ฒ๋ฆฌ: ์๋ฒ ์ธก ์์ ์ด ์คํจํ ๊ฒฝ์ฐ UI๋ฅผ ๋๋๋ฆฌ๊ธฐ ์ํด ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ: ๋ถ์ผ์น๋ฅผ ํผํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ณต์ก์ฑ: ํนํ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ํธ์์ฉ์ ๋ค๋ฃฐ ๋ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
experimental_useOptimistic ์๊ฐ
experimental_useOptimistic๋ ๋๊ด์ ์
๋ฐ์ดํธ ๊ตฌํ์ ๋จ์ํํ๊ธฐ ์ํด ์ค๊ณ๋ React ํ
์
๋๋ค. ์ด ํ
์ ์ฌ์ฉํ๋ฉด ์ํ ๋ณ์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ๋ด์์ ๋๊ด์ ์ํ ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด ํ
์ "์คํ์ (experimental)"์ผ๋ก ํ์๋์ด ์์ผ๋ฏ๋ก ํฅํ React ๋ฆด๋ฆฌ์ค์์ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์์ ๋ช
์ฌํ์ธ์. ์ต์ ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
experimental_useOptimistic ์๋ ๋ฐฉ์:
experimental_useOptimistic ํ
์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
- ์ด๊ธฐ ์ํ: ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ค๋ ๋ฐ์ดํฐ์ ์ด๊ธฐ ์ํ์ ๋๋ค.
- ์ ๋ฐ์ดํฐ ํจ์: ํ์ฌ ์ํ์ ์ ๋ฐ์ดํธ ์ก์ ์ ๋ฐ์ ์๋ก์ด ๋๊ด์ ์ํ๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค.
์ด ํ ์ ๋ ๊ฐ์ ๊ฐ์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค:
- ๋๊ด์ ์ํ: ํ์ฌ์ ๋๊ด์ ์ํ๋ก, ์ด๊ธฐ ์ํ์ด๊ฑฐ๋ ์ ๋ฐ์ดํฐ ํจ์๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ์ ๋๋ค.
- ๋๊ด์ ์ ๋ฐ์ดํธ ์ถ๊ฐ ํจ์: ์ํ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ ๋๋ค. ์ด ํจ์๋ ์ ๋ฐ์ดํฐ ํจ์๋ก ์ ๋ฌ๋๋ "์ ๋ฐ์ดํธ"๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
๊ธฐ๋ณธ ์์ :
๊ฐ๋จํ ์นด์ดํฐ ์์ ๋ฅผ ํตํด experimental_useOptimistic์ ์ฌ์ฉ๋ฒ์ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
import { experimental_useOptimistic as useOptimistic, useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const [optimisticCount, addOptimisticCount] = useOptimistic(
count,
(currentState, update) => currentState + update
);
const increment = () => {
// Optimistically update the count
addOptimisticCount(1);
// Simulate an API call (replace with your actual API call)
setTimeout(() => {
setCount(count + 1);
}, 500); // Simulate a 500ms delay
};
return (
<div>
<p>Count: {optimisticCount}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
export default Counter;
์ด ์์ ์์:
useState๋ฅผ ์ฌ์ฉํ์ฌcount์ํ ๋ณ์๋ฅผ ์ด๊ธฐํํฉ๋๋ค.experimental_useOptimistic๋ฅผ ์ฌ์ฉํ์ฌcount๊ฐ์ผ๋ก ์ด๊ธฐํ๋optimisticCount์ํ๋ฅผ ์์ฑํฉ๋๋ค.- ์
๋ฐ์ดํฐ ํจ์๋ ๋จ์ํ
update๊ฐ(์ฆ๊ฐ๋ถ์ ๋ํ๋)์currentState์ ๋ํฉ๋๋ค. incrementํจ์๋ ๋จผ์ addOptimisticCount(1)์ ํธ์ถํ์ฌoptimisticCount๋ฅผ ์ฆ์ ์ ๋ฐ์ดํธํฉ๋๋ค.- ๊ทธ๋ฐ ๋ค์
setTimeout์ ์ฌ์ฉํ์ฌ API ํธ์ถ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. API ํธ์ถ(์ฌ๊ธฐ์๋ ์๋ฎฌ๋ ์ด์ ๋จ)์ด ์๋ฃ๋๋ฉด ์ค์ count์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ด ์ฝ๋๋ ์๋ฒ๊ฐ ์์ ์ ํ์ธํ๊ธฐ ์ ์ UI๊ฐ ์ด๋ป๊ฒ ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ด ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋์ง ๋ณด์ฌ์ค๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ๋ฒ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ
๊ธฐ๋ณธ ์์ ๋ experimental_useOptimistic์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ์ง๋ง, ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ ํฌํจํ์ฌ ๋ ์ ๊ตํ ๋๊ด์ ์
๋ฐ์ดํธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ:
๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋ค๋ฃฐ ๋, ์๋ฒ ์ธก ์์ ์ค์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฒ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด UI๋ฅผ ์ด์ ์ํ๋ก ๋๋๋ ค์ผ ํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ํ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๊ธฐ ์ ์ ์๋ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฅ๋ ์ํ๋ก ๊ฐ๋จํ ๋๋๋ฆด ์ ์์ต๋๋ค.
import { experimental_useOptimistic as useOptimistic, useState, useRef } from 'react';
function CounterWithUndo() {
const [count, setCount] = useState(0);
const [optimisticCount, addOptimisticCount] = useOptimistic(
count,
(currentState, update) => currentState + update
);
const previousCount = useRef(count);
const increment = () => {
previousCount.current = count;
// Optimistically update the count
addOptimisticCount(1);
// Simulate an API call (replace with your actual API call)
setTimeout(() => {
// Simulate a success or failure (randomly)
const success = Math.random() > 0.5;
if (success) {
setCount(count + 1);
} else {
// Revert the optimistic update
setCount(previousCount.current);
alert("Error: Operation failed!");
}
}, 500); // Simulate a 500ms delay
};
return (
<div>
<p>Count: {optimisticCount}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
export default CounterWithUndo;
์ด ๊ฐ์ ๋ ์์ ์์:
previousCountuseRef๋addOptimisticCount๊ฐ ํธ์ถ๋๊ธฐ ์ง์ ์count๊ฐ์ ์ ์ฅํฉ๋๋ค.setTimeout์์ ๋ฌด์์ ์ฑ๊ณต/์คํจ๊ฐ ์๋ฎฌ๋ ์ด์ ๋ฉ๋๋ค.- ์๋ฎฌ๋ ์ด์
๋ API ํธ์ถ์ด ์คํจํ๋ฉด, ์ํ๋
setCount(previousCount.current)๋ฅผ ์ฌ์ฉํ์ฌ ๋๋๋ ค์ง๊ณ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ด ํ์๋ฉ๋๋ค.
๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ:
๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์์ ํ ๋, ์ ๋ฐ์ดํฐ ํจ์์์ ๋ ๋ณต์กํ ๋ณํ์ ์ํํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชฉ๋ก์ ํญ๋ชฉ์ ๋๊ด์ ์ผ๋ก ์ถ๊ฐํ๋ ค๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์.
import { experimental_useOptimistic as useOptimistic, useState } from 'react';
function ItemList() {
const [items, setItems] = useState(['Item 1', 'Item 2']);
const [optimisticItems, addOptimisticItem] = useOptimistic(
items,
(currentState, newItem) => [...currentState, newItem]
);
const addItem = () => {
const newItem = `Item ${items.length + 1}`;
// Optimistically add the item
addOptimisticItem(newItem);
// Simulate an API call (replace with your actual API call)
setTimeout(() => {
setItems([...items, newItem]);
}, 500);
};
return (
<div>
<ul>
{optimisticItems.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
<button onClick={addItem}>Add Item</button>
</div>
);
}
export default ItemList;
์ด ์์ ์์ ์
๋ฐ์ดํฐ ํจ์๋ ์ ๊ฐ ๊ตฌ๋ฌธ(...)์ ์ฌ์ฉํ์ฌ newItem์ด ๋์ ์ถ๊ฐ๋ ์ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค. ์ด๋ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋์๋ ๋๊ด์ ์
๋ฐ์ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
experimental_useOptimistic ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
experimental_useOptimistic๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ: ์ ๋ฐ์ดํฐ ํจ์์์ ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ๋ณํ์ ์ํํ์ง ๋ง์ธ์. ์ค๋ฅ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ์ ์ํ์ ์ต์ํํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฅํ ํ ๋จ์ํ๊ณ ๊ฐ๋จํ๊ฒ ์ ์งํ์ธ์.
- ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌํํ๊ธฐ: ์๋ฒ ์ธก ์์ ์ด ์คํจํ ๊ฒฝ์ฐ UI๋ฅผ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๊ธฐ ์ํด ํญ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ธ์. ์์ ์ด ์คํจํ ์ด์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉ์์๊ฒ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅํ๊ธฐ: ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ์ธ์. ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๊ณ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ธ์.
- ์๊ฐ์ ํผ๋๋ฐฑ ์ ๊ณตํ๊ธฐ: ๋ก๋ฉ ํ์๊ธฐ๋ ์งํ๋ฅ ํ์์ค๊ณผ ๊ฐ์ ์๊ฐ์ ์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด ์งํ ์ค์์ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ์ธ์. ์ด๋ ์ฌ์ฉ์ ๊ธฐ๋๋ฅผ ๊ด๋ฆฌํ๊ณ ํผ๋์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฒ ์ ํ๊ฒ ํ ์คํธํ๊ธฐ: ๋คํธ์ํฌ ์ฅ์ , ์๋ฒ ์ค๋ฅ ๋ฐ ๋์ ์ ๋ฐ์ดํธ๋ฅผ ํฌํจํ ๋ค์ํ ์๋๋ฆฌ์ค์์ ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ์ฒ ์ ํ๊ฒ ํ ์คํธํ์ธ์.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ๊ณ ๋ คํ๊ธฐ: ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ค๊ณํ ๋ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ์ผ๋์ ๋์ธ์. ์ง์ฐ ์๊ฐ์ด ๋๋ฌด ๊ธธ๋ฉด ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฆฌ๊ฑฐ๋ ๋ฐ์์ด ์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง ์ ์์ต๋๋ค. ๋ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ ํ์ด๋ฐ์ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค.
- ์บ์ฑ์ ์ ๋ต์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ: ๋คํธ์ํฌ ์์ฒญ ์๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์บ์ฑ ๊ธฐ์ ์ ํ์ฉํ์ธ์. ์๋ฒ ์์กด๋๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์บ์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋งํ๊ธฐ: ๋๊ด์ ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ๋ณ๋ชฉ ํ์์ด๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ธ์. ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต ์๊ฐ, ์ค๋ฅ์จ, ์ฌ์ฉ์ ์ฐธ์ฌ๋์ ๊ฐ์ ์ฃผ์ ๋ฉํธ๋ฆญ์ ์ถ์ ํ์ธ์.
์ค์ ์ ์ฉ ์ฌ๋ก
๋๊ด์ ์ ๋ฐ์ดํธ๋ ๊ด๋ฒ์ํ ์๋๋ฆฌ์ค์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ค์ ์ ์ฉ ์ฌ๋ก์ ๋๋ค:
- ์์ ๋ฏธ๋์ด ํ๋ซํผ: ๊ฒ์๋ฌผ์ '์ข์์' ๋๋ฅด๊ธฐ, ๋๊ธ ์ถ๊ฐํ๊ธฐ, ๋ฉ์์ง ๋ณด๋ด๊ธฐ.
- ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ : ์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐํ๊ธฐ, ์ํ ์๋ ์ ๋ฐ์ดํธํ๊ธฐ, ์ฃผ๋ฌธํ๊ธฐ.
- ์์ ๊ด๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ : ์ ์์ ์์ฑํ๊ธฐ, ์์ ์ ์๋ฃ๋ก ํ์ํ๊ธฐ, ์ฌ์ฉ์์๊ฒ ์์ ํ ๋นํ๊ธฐ.
- ํ์ ๋๊ตฌ: ๋ฌธ์ ํธ์งํ๊ธฐ, ํ์ผ ๊ณต์ ํ๊ธฐ, ํ๋ก์ ํธ์ ์ฌ์ฉ์ ์ด๋ํ๊ธฐ.
์ด๋ฌํ ๊ฐ ์๋๋ฆฌ์ค์์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ณ ์ธ์ง๋๋ ์ง์ฐ์ ์ค์์ผ๋ก์จ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
experimental_useOptimistic์ ๋์
experimental_useOptimistic๋ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ํน์ ์๊ตฌ ์ฌํญ๊ณผ ์ ํธ๋์ ๋ฐ๋ผ ๊ณ ๋ คํ ์ ์๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
- ์๋ ์ํ ๊ด๋ฆฌ:
useState๋ฐ ๋ค๋ฅธ React ํ ์ ์ฌ์ฉํ์ฌ ์ํ ๋ณ์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง ๋ ๋ง์ ์ฝ๋์ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค. - Redux ๋๋ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Redux์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋๊ด์ ์ ๋ฐ์ดํธ ์ง์์ ํฌํจํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณต์กํ ์ํ ์๊ตฌ ์ฌํญ์ด ์๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํ ์ ์์ต๋๋ค. React Query๋ SWR๊ณผ ๊ฐ์ด ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ํน๋ณํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข ์ข ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ๋ด์ฅ ๊ธฐ๋ฅ์ด๋ ํจํด์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ์ ํ : ๋๊ด์ ์ ๋ฐ์ดํธ ๊ด๋ฆฌ ๋ก์ง์ ์บก์ํํ๊ธฐ ์ํด ์์ ๋ง์ ์ฌ์ฉ์ ์ ์ ํ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ณ ์ฝ๋๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๋๊ด์ ์
๋ฐ์ดํธ๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ธ์ง ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉํ ๊ธฐ์ ์
๋๋ค. experimental_useOptimistic ํ
์ ์ปดํฌ๋ํธ ๋ด์์ ๋๊ด์ ์ํ ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋๊ด์ ์
๋ฐ์ดํธ ๊ตฌํ์ ๋จ์ํํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์ ๋
ผ์๋ ๊ฐ๋
, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๋์์ ์ดํดํจ์ผ๋ก์จ, ๋ ๋ฐ์์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
experimental_useOptimistic์ API๋ ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ฐ์ ํ ์ ์์ผ๋ฏ๋ก, ๊ด๋ จ ์ต์ ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํด์๋ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ํน์ ์ ํ๋ฆฌ์ผ์ด์
์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ์๋ฃจ์
์ ์ฐพ๊ธฐ ์ํด ๋ค์ํ ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ธฐ์ ์ ์คํํด ๋ณด์ธ์. ์ํํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ
์คํธํ์ธ์.