Front-end/React

[React] Transition์˜ ๋‹จ๊ณ„์™€ ๋™์ž‘ ์›๋ฆฌ ํ†บ์•„๋ณด๊ธฐ!๐ŸŒŸ

xeunnie 2025. 1. 31. 01:00
728x90
๋ฐ˜์‘ํ˜•

React Transition ํ†บ์•„๋ณด๊ธฐ! ๐ŸŒŸ

React์—์„œ useTransition๊ณผ ๊ฐ™์€ Transition ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ์—†์ด ๋งค๋„๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ณ ๋ฏผ์ด๋ผ๋ฉด ๊ผญ ์•Œ์•„๋ณด๋ฉด ์ข‹์„ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

 

Transition์„ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ทธ ๋‹จ๊ณ„์™€ React์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ํ•„์š”ํ•œ๋ฐ์š”, Rendering, Pending, ๊ทธ๋ฆฌ๊ณ  Completed๋‹จ๊ณ„๋“ค์„ ์ค‘์‹ฌ์œผ๋กœ ํ†บ์•„๋ณด๋„๋ก ํ• ๊ป˜์š”.


๐ŸŒˆ Transition์˜ ๋‹จ๊ณ„์™€ ํ๋ฆ„

React Transition์€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๐Ÿ”ด ๊ธด๊ธ‰ ์ž‘์—…(Urgent)๊ณผ ๐Ÿ”ต ๋น„๊ธด๊ธ‰ ์ž‘์—…(Non-Urgent)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๊ณผ์ •์—์„œ ์ฃผ์š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1๏ธโƒฃ Transition Start: ์ž‘์—… ์‹œ์ž‘
2๏ธโƒฃ Pending State: ๋Œ€๊ธฐ ์ค‘
3๏ธโƒฃ Render: ์ƒˆ๋กœ์šด ์ƒํƒœ ๋ Œ๋”๋ง
4๏ธโƒฃ Completed State: ์™„๋ฃŒ 

1๏ธโƒฃ Transition Start: ์ž‘์—… ์‹œ์ž‘

์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ:

์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅ์„ ํ•  ๋•Œ, React๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•ด ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. (์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ์˜ ์˜ˆ: ๋ฒ„ํŠผ ํด๋ฆญ, ์ž…๋ ฅ ๋“ฑ)

 

React ์Šค์ผ€์ค„๋ง

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด, React๋Š” startTransition์œผ๋กœ ๋ž˜ํ•‘๋œ ์ž‘์—…์„ ๐Ÿ”ต ๋น„๊ธด๊ธ‰์œผ๋กœ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

(๐Ÿ”ด ๊ธด๊ธ‰ ์ž‘์—…๊ณผ ๐Ÿ”ต ๋น„๊ธด๊ธ‰ ์ž‘์—…์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ)

 

์ฆ‰๊ฐ์ ์ธ UI ์—…๋ฐ์ดํŠธ

๐Ÿ”ด ๊ธด๊ธ‰ ์ƒํƒœ๋Š” ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋˜์–ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์‹ ์†ํ•˜๊ฒŒ ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค.

(์ฆ‰, ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ ๋ฐ”๋กœ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋А๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ)

startTransition(() => {
  // ๋น„๊ธด๊ธ‰ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
  setData(newData);
});

2๏ธโƒฃ Pending State: ๋Œ€๊ธฐ ์ค‘

Transition์ด ์ง„ํ–‰ ์ค‘์ด๋ฉด

React๋Š” isPending์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ํ˜„์žฌ Transition์ด ์ง„ํ–‰ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ UI์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ณ , React๋Š” ๋Œ€๊ธฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

๊ธด๊ธ‰ ์ž‘์—… ์ฒ˜๋ฆฌ ํ›„ ๋น„๊ธด๊ธ‰ ์ž‘์—… ์‹œ์ž‘

์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ชจ๋“  ๐Ÿ”ด ๊ธด๊ธ‰ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ๐Ÿ”ต ๋น„๊ธด๊ธ‰ ์ž‘์—…์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์— ๋กœ๋”ฉ UI๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{isPending && <p>Loading...</p>}

3๏ธโƒฃ Render: ์ƒˆ๋กœ์šด ์ƒํƒœ ๋ Œ๋”๋ง

๋น„๊ธด๊ธ‰ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ

๋น„๊ธด๊ธ‰ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, React๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ React๋Š” ์ด์ „ ์ƒํƒœ์™€ ์ƒˆ ์ƒํƒœ๋ฅผ ๋น„๊ต(diffing)ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ DOM์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. (์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ค‘์š”ํ•œ ๋‹จ๊ณ„)

 

Rendering ์ค‘ ํŠน์ง•:

  • Concurrent Rendering
    • React๋Š” UI๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•จ
    • ์‚ฌ์šฉ์ž๋Š” ์ค‘๊ฐ„์— UI๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ํ๋ฆ„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
  • Batching
    • ์—ฌ๋Ÿฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ ๋ฒˆ์˜ ๋ Œ๋”๋ง ์ž‘์—…์œผ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ž„(๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๐Ÿ”บ, ์„ฑ๋Šฅ๐Ÿ”ป)

4๏ธโƒฃ Completed State: ์™„๋ฃŒ

Transition์ด ์™„๋ฃŒ

Transition์ด ์™„๋ฃŒ๋˜๋ฉด isPending์ด false๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๋กœ๋”ฉ UI๋Š” ์‚ฌ๋ผ์ง€๊ณ , ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋ฐ˜์˜๋œ ํ™”๋ฉด์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ ธ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{!isPending && <ul>{data.map(item => <li key={item}>{item}</li>)}</ul>}

 

๐Ÿ‘‰ ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


๐Ÿ”„ Transition ๋™์ž‘ ์›๋ฆฌ

 

React Transition์€ ์Šค์ผ€์ค„๋ง๊ณผ ์šฐ์„ ์ˆœ์œ„ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

1๏ธโƒฃ  ๐Ÿ”ด ๊ธด๊ธ‰ ์ž‘์—… vs ๐Ÿ”ต ๋น„๊ธด๊ธ‰ ์ž‘์—…

React๋Š” Transition์—์„œ ๐Ÿ”ด ๊ธด๊ธ‰ ์ž‘์—…๊ณผ ๐Ÿ”ต  ๋น„๊ธด๊ธ‰ ์ž‘์—…์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  • ๐Ÿ”ด ๊ธด๊ธ‰ ์ž‘์—…
    • ์‚ฌ์šฉ์ž ์ž…๋ ฅ, ํด๋ฆญ ๋“ฑ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์ด ํ•„์š”ํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ(๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ๋ฆฌ์•กํŠธ๋Š” ์ด ์ž‘์—…์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.)
  • ๐Ÿ”ต ๋น„๊ธด๊ธ‰ ์ž‘์—…
    • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง, ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ์ž‘์—…(์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋™์•ˆ ๋ฐฐ๊ฒฝ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.)
setImmediateState("urgent"); // ๊ธด๊ธ‰
startTransition(() => setNonImmediateState("non-urgent")); // ๋น„๊ธด๊ธ‰

 

2๏ธโƒฃ Concurrent Rendering

React๋Š” ๋Š๊น€ ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณต๋˜๋„๋ก ๐Ÿ”ต ๋น„๊ธด๊ธ‰ ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•˜์—ฌ UI๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ๊ธด๊ธ‰ ์ž‘์—… ์šฐ์„  ์ฒ˜๋ฆฌ  ์ดํ›„ ๋‚จ์€ ์‹œ๊ฐ„ ๋™์•ˆโณ ๋น„๊ธด๊ธ‰ ์ž‘์—… ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰ ์ด๋•Œ UI๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—…๋ฐ์ดํŠธ ๋˜๊ณ  ์ฆ‰์‹œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“  ์ƒํƒœ๋ณ„ React์˜ ํ–‰๋™ ์š”์•ฝ

์ƒํƒœ React ํ–‰๋™
Initial Transition ์‹œ์ž‘ ์ „. ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.
Pending ๋น„๊ธด๊ธ‰ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ง„ํ–‰ ์ค‘. UI๋Š” ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Rendering ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ธด๊ธ‰ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
Completed Transition ์™„๋ฃŒ. ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•˜๋ฉฐ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Ÿ Redendering ์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ๊ณผ ๋ฌธ์ œ

Transition ์ž‘์—… ์ค‘ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€์™€ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1๏ธโƒฃ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์ค‘๋‹จ ๋ฌธ์ œ

๐Ÿ”’ ๋ธ”๋กœํ‚น ์ด์Šˆ:

Transition ์ค‘ ๊ธด๊ธ‰ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ธ”๋กœํ‚น๋˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ฐ˜์‘์ด ๋А๋ฆฌ๊ฑฐ๋‚˜, ํ™”๋ฉด์ด ๋ฉˆ์ถ˜ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ก ํ•ด๊ฒฐ์ฑ…:

startTransition ์œผ๋กœ ๋น„๊ธด๊ธ‰ ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

(๊ธด๊ธ‰ ์ž‘์—…์ด ์šฐ์„  ์ฒ˜๋ฆฌ, ๋น„๊ธด๊ธ‰ ์ž‘์—…์€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์ด ์™„๋ฃŒ๋œ ํ›„์— ์ฒ˜๋ฆฌ ๋˜๋„๋ก ํ•ด์คŒ)

 

2๏ธโƒฃ isPending ์ƒํƒœ ๊ด€๋ฆฌ

โš ๏ธ ๊ฒน์น˜๋Š” Transition ๋ฌธ์ œ:

์—ฌ๋Ÿฌ Transition ์ž‘์—…์ด ๋™์‹œ์— ๋ฐœ์ƒํ•˜๋ฉด, ๋กœ๋”ฉ ์ƒํƒœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ๋น ๋ฅด๊ฒŒ ํด๋ฆญํ•˜๋ฉด, ๊ฐ ํด๋ฆญ์— ๋Œ€ํ•œ ๋กœ๋”ฉ ์ƒํƒœ๊ฐ€ ๋‚œ๋ฆฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”‘ ํ•ด๊ฒฐ์ฑ…:

์ƒํƒœ๋ณ„๋กœ isPending ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ๊ณ ์œ  ์ž‘์—… ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const [isPending1, startTransition1] = useTransition();
const [isPending2, startTransition2] = useTransition();

๐Ÿ’ผ ์‹ค์šฉ์ ์ธ Transition ์˜ˆ์ œ

1๏ธโƒฃ ํ•„ํ„ฐ๋ง ์ž‘์—…์—์„œ์˜ ํ™œ์šฉ

function FilterExample() {
  const [query, setQuery] = useState("");
  const [results, setResults] = useState([]);
  const [isPending, startTransition] = useTransition();

  const handleInputChange = (e) => {
    const input = e.target.value;
    setQuery(input);

    startTransition(() => {
      const filtered = mockData.filter(item => item.includes(input));
      setResults(filtered);
    });
  };

  return (
    <div>
      <input type="text" value={query} onChange={handleInputChange} />
      {isPending ? <p>Loading...</p> : <ul>{results.map(r => <li key={r}>{r}</li>)}</ul>}
    </div>
  );
}

2๏ธโƒฃ ๋ชจ๋‹ฌ ์ฐฝ์„ ํ†ตํ•œ Transition ์˜ˆ์ œ

import React, { useState, useTransition } from 'react';

const Modal = ({ onClose }) => {
  return (
    <div style={modalStyles}>
      <h2>๋ฟ…</h2>
      <p>์ด๊ณณ์€ Transition์„ ํ†ตํ•ด ์—ด๋ฆฌ๋Š” ๋ชจ๋‹ฌ์ž…๋‹ˆ๋™!</p>
      <button onClick={onClose}>๋‹ซ๊ธฐ</button>
    </div>
  );
};

const App = () => {
  const [isOpen, setIsOpen] = useState(false);
  const [isPending, startTransition] = useTransition();

  const openModal = () => {
    startTransition(() => {
      setIsOpen(true);
    });
  };

  const closeModal = () => {
    startTransition(() => {
      setIsOpen(false);
    });
  };

  return (
    <div>
      <h1>React Transition ์˜ˆ์ œ</h1>
      <button onClick={openModal}>๋ชจ๋‹ฌ ์—ด๊ธฐ</button>
      {isOpen && <Modal onClose={closeModal} />}
      {isPending && <p>๋ชจ๋‹ฌ์„ ์—ฌ๋Š” ๋“•...</p>}
    </div>
  );
};

export default App;

์‹ค๋ฌด์—์„œ์˜ ํŒ ๐ŸŒŸ

1๏ธโƒฃ ๋กœ๋”ฉ UI๋ฅผ ๋ช…ํ™•ํžˆ

๐Ÿ” ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต:

Transition ์ค‘์—๋Š” isPending์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ž‘์—…์˜ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋‹ฌ์„ ์—ฌ๋Š” ๋™์•ˆ "๋กœ๋”ฉ ์ค‘..." ๋ฉ”์‹œ์ง€๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๐ŸŽจ ์‹œ๊ฐ์  ์š”์†Œ ํ™œ์šฉ

๋กœ๋”ฉ UI๋Š” ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์Šคํ”ผ๋„ˆ, ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ” ๋“ฑ ๋‹ค์–‘ํ•œ ์ง๊ด€์  ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

2๏ธโƒฃ ๊ธด๊ธ‰ ์ƒํƒœ ์šฐ์„  ์ฒ˜๋ฆฌ

โšก๏ธ ๋น ๋ฅธ ๋ฐ˜์‘์„ฑ ์œ ์ง€:

startTransition์„ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜์—ฌ ๊ธด๊ธ‰ ์ƒํƒœ๊ฐ€ ์ง€์—ฐ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค..

์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅ์„ ํ•  ๋•Œ์™€ ๊ฐ™์€ ๊ธด๊ธ‰ ์ž‘์—…์€ ์ฆ‰์‹œ ๋ฐ˜์‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ผญ! ๋น„๊ธด๊ธ‰ ์ž‘์—…์ด ๊ธด๊ธ‰ ์ž‘์—…์„ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ ์ž‘์—… ํ๋ฆ„ ์ตœ์ ํ™”

๊ธด๊ธ‰ ์ž‘์—…์„ ์šฐ์„ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋น„๊ธด๊ธ‰ ์ž‘์—…์€ ์ดํ›„์— ์ˆ˜ํ–‰ํ•˜๋„๋ก ์Šค์ผ€์ค„๋งํ•˜๋Š” ๊ฒƒ์ด ํ•˜๋‚˜์˜ ๊ฟ€ํŒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์ž‘์—…์ด ์žˆ์„ ๋•Œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ์™„๋ฃŒ๋œ ํ›„์— ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์—ฌ UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค!

 

3๏ธโƒฃ ํฐ ์ž‘์—…์€ ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆ„๊ธฐ

๐Ÿ“ฆ ๋น„๊ธด๊ธ‰ ์ž‘์—… ์„ธ๋ถ„ํ™”

๋น„๊ธด๊ธ‰ ์ž‘์—…์ด ํด ๊ฒฝ์šฐ, ์ด๋ฅผ ์ž‘์€ ์ž‘์—…์œผ๋กœ ์ ์ ˆํžˆ ๋‚˜๋ˆ ์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ํ•œ ๋ฒˆ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


๐Ÿ”„ ์˜ˆ์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค๋Š”

๋ช‡ ๊ฐœ์˜ ์ž‘์€ ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋ฉด UI๊ฐ€ ๋” ๋งค๋„๋Ÿฝ๊ฒŒ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์˜ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•