useTransition ์ธ์ ์ธ๊น?
useTransition์ UI๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ React Hook์ด๋ค.
Q. ์ฌ๊ธฐ์ UI๋ฅผ ์ฐจ๋จํ์ง ์๋๋ค๋ ๊ฒ์ ๋ฌด์จ ์๋ฏธ์ผ๊น?
A. ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ์์ฉํ๋ ๋์ ๋ฆฌ์กํธ๊ฐ ๋น๋๊ธฐ ์์ ์ด๋ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋๋ผ๋, ์ธํฐํ์ด์ค๊ฐ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ ์ ์๋๋ก ๋ณด์ฅํ๋ค๋ ์๋ฏธ์ด๋ค. ( ์ถ์ฒ:GPT )
์์๋ก ์๋์ ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ์๊ฐํด๋ณด์.
์ ์์๋ Posts์ ์๋๋ฅผ ์ผ๋ถ๋ฌ ์ ํ์ํจ ๊ฒ์ด๋ค.
Posts ๋ฒํผ์ ํด๋ฆญํ๋ฉด post ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ๋ ๋๋งํ๋ค. ์ด๋ Contact ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ผ์ ์๊ฐ์ด ์ง๋ ํ ๋์ํ๋ค.
์ฆ, post ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ๋ถ๋ฌ์ฌ ๋ ๊น์ง ํ๋ฉด์ด ๋ฉ์ถ๊ฒ ๋๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ๋ถ๋ฌ์จ ํ Contact ๋ฒํผ์ด ํ์ฑํ ๋๋ค.
์ ๋ฒํผ์ด ๋ฐ๋ก ๋์ํ์ง ์์๊น?
๋ธ๋ผ์ฐ์ ์์ ๋ฆฌ์กํธ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์ฑ๊ธ ์ค๋ ๋(single-threaded)์ด๊ธฐ ๋๋ฌธ์, ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์๋ค. ์ด ๋ง์, ๋จผ์ ๋ฐ์ํ ์์ ์ ๋ชจ๋ ์๋ฃํ ํ์์ผ ๋ค์ ์์ ์ผ๋ก ๋์ด๊ฐ ์ ์๋ค๋ ๋ป์ด๋ค.
์์์ Posts ๋ฒํผ์ ํด๋ฆญํ๋ฉด, post ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์์ ์ด ์ฐ์ ์คํ๋๊ณ ์๋ฃ๋ ๋๊น์ง ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ์์ ์ ์ฐจ๋จํ๊ฒ ๋๋ค. ์ด๋ก ์ธํด ์ฌ์ฉ์๊ฐ Contact ๋ฒํผ์ ํด๋ฆญํ๋๋ผ๋, post ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
๋ฆฌ์กํธ๋ ์ผ๋ฐ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ต์ฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ณต์กํ ์์ ์ด ์คํ ์ค์ผ ๋ ๋ค๋ฅธ ์ํธ์์ฉ์ด ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ธํฐํ์ด์ค๊ฐ ์ฆ๊ฐ ๋ฐ์ํ์ง ๋ชปํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
์ด๋ป๊ฒ ํด๊ฒฐํ๋ฉด ์ข์๊น?
์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด React์์๋ useTrancition
์ ์ฌ์ฉํด ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
์ฐ์ ์์๊ฐ ๋ฎ์ ์์ ์ transition์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํจ์ผ๋ก์จ, ์ค์ํ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ฐ์ ์ํ๊ณ UI๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๊ฒ ํ ์ ์๋ค.
React์ ๋ฉ์ธ ์ค๋ ๋์์ ์์ ํ๋ค๊ฐ, ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ transition ์ค๋ ๋๋ก ๋๊ฒจ ์ฒ๋ฆฌํ๊ณ , ์ฌ์ฉ์ ์ํธ์์ฉ์ด ๋ฐ์ํ๋ฉด ๊ธฐ์กด ์์ ์ ๋ฉ์ถ๊ณ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ์ด๋ฅผ ํตํด React๋ ๊ธด ์์ ์ด UI ์๋ต์ฑ์ ์ ํดํ์ง ์๋๋ก ๊ด๋ฆฌํ๋ค.
ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ
- transition ์ค๋ ๋๋ ๋ณ๋์ ์ ์ฉ ์ค๋ ๋๊ฐ ์กด์ฌํ๋ ๊ฒ์ด ์๋๊ณ React ์ค๋ ๋์์ ์ญํ ๋ถ๋ด์ผ๋ก ๋์ํ๋ ๊ฐ๋ ์ด๋ค.
- ๋จ์ํ ์ฐ์ ์์๋ฅผ ์กฐ์ ํ์ฌ ๋ ์ค์ํ ์์ ์ด ๋จผ์ ์ฒ๋ฆฌ๋๋๋ก ํ๋ ๊ฒ์ด๋ค.
Transition ์ฌ์ฉํ๊ธฐ
...
const [deferredFilter, setDeferredFilter] = useState("");
const [isPending, startTransition] = useTransition();
const handleChange = ({target:{value}}) => {
...
// ์ฐ์ ์์๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด startTransition์ผ๋ก ๋ํ
startTransition(() => {
setDeferredFilter(value); // ๋ณ๊ฒฝ๋ ๊ฐ์ ์ง์ฐ ์ํ๋ก ์ค์
})
};
return (<>
// ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ณณ์ ์ง์ฐ๋ ๊ฐ์ ๋ฃ๋๋ค.
<Words filter={deferredFilter}></Words>
// ์ง์ฐ๋๊ณ ์๋ค๋ฉด '๋ก๋ฉ'์ด ๋ฌ๋ค.
{isPending ? (<p>๋ก๋ฉ</p>) : (<p>์ถ๋ ฅ</p>)}
</>);
์ฝ๋ ์ค๋ช
startTransition
์ผ๋ก ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ํํ์ฌ ์ด ์์ ์ ์ฐ์ ์์๋ฅผ ๋ฎ์ถ๋ค. ์ด๋ฅผ ํตํด ์ฃผ์ UI ์ํธ์์ฉ์ด ์ฐจ๋จ๋์ง ์๋๋ก ์ ์งํ ์ ์๋ค.isPending
์ transition์ด ์งํ ์ค์๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด๋ฅผ ์ด์ฉํด UI์ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ : https://ko.react.dev/reference/react/useTransition