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

'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ œ์–ด ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ  (0) 2025.01.11