๐กReact 19์ useTransition์ ๋น๋๊ธฐ ์ ๋ฐ์ดํธ๋ฅผ ์ฐ์ ์์๊ฐ ๋ฎ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ UI ๋ฐ์์ฑ์ ์ ์งํ๋ฉด์๋ ๋ก๋ฉ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์งํํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ฐ์ ๋๊ณ , ๋ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ฒ๋ฆฌ์ ์ํธ์์ฉ์ ์ ๊ณตํฉ๋๋ค.
React 18์์์ pending ์ฒ๋ฆฌ
React 18์์ pending ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ Suspense๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Suspense๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋ ๋ก๋ฉ ์ค์์ ๋ํ๋ด๊ธฐ ์ํด ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ ๋ก๋ฉ ์ํ๋ฅผ ๊ฐ์ธ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋, ๋ก๋ฉ ์ํ๊ฐ ๊ธธ์ด์ง๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํ์ํฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Suspense ๋ด๋ถ์์ ๋ก๋ฉ ์ค์์ ๋ํ๋ด๋ UI๋ฅผ ๋ง๋ค ๋, ๋ก๋ฉ ์๊ฐ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฌ์ ํ ๊ฐ๋ฐ์์ ๋ชซ์ ๋๋ค.
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
</div>
);
}
function App() {
// ๋ก๋ฉ ์ํ์ ๋ฐ์ดํฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ useState
const [loading, setLoading] = useState(false);
const [data, setData] = useState([]);
const loadData = () => {
setLoading(true); // ๋ก๋ฉ ์์
axios.get('find/project')
.then(res => setData(res.data))
.finally(() => setLoading(false));
};
return (
<div>
<button onClick={loadData} disabled={loading}>Load Data</button>
{loading ? (
<div>Loading...</div> // ๋ก๋ฉ ์ค์ผ ๋ ํ์
) : (
<div>Data: {data.join(', ')}</div> // ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ๋๋ฉด ํ์
)}
</div>
);
}
React 19์์ useTransition ์ฌ์ฉ
React 19์์ ๋์ ๋ useTransition์ ๋น๋๊ธฐ ์์ ์ ๋์ฑ ์ง๊ด์ ์ด๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. useTransition์ ์ํ ์ ๋ฐ์ดํธ๊ฐ "์ฐ์ ์์๊ฐ ๋ฎ์" ์์ ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์๋๋ก ํ์ฌ, ์ค์ํ ์์ ์ ์ฆ์ ์ ๋ฐ์ดํธํ๊ณ , ๊ธด ๋ก๋ฉ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋น๋๊ธฐ ์์ ์ค ๋ก๋ฉ ์ํ๋ฅผ ๋ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํฉ๋๋ค.
useTransition์ ๋ ๊ฐ์ง ๊ฐ์ ๋ฐํํฉ๋๋ค: isPending (์์ ์ด ๋๊ธฐ ์ค์ธ์ง ์ฌ๋ถ)๊ณผ startTransition (๋น๋๊ธฐ ์์ ์ ์์ํ๋ ํจ์). ์ด๋ฅผ ํตํด UI๋ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ก ์ฆ๊ฐ์ ์ธ ๋ฐ์์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
function App() {
const [isPending, startTransition] = useTransition();
const [data, setData] = useState([]);
const fetchData = () => {
startTransition(() => {
// ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ
setTimeout(() => {
setData([1, 2, 3, 4, 5]);
}, 2000);
});
};
return (
<div>
<button onClick={fetchData}>Load Data</button>
{isPending ? <div>Loading...</div> : <div>Data: {data.join(', ')}</div>}
</div>
);
}
๊ฒฐ๋ก
React 19์์ ๋์ ๋ useTransition์ ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ์์ ํฐ ๊ฐ์ ์ ์ด๋ฃจ์์ผ๋ฉฐ, ๋ก๋ฉ ์ํ ๊ด๋ฆฌ์ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Suspense์ useState๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ์ฌ์ ํ ์ ์ฉํ์ง๋ง, React 19์ useTransition์ ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.