React18์—์„œ์˜ Concurrent, Transition

Concurrent, Transition์— ๋Œ€ํ•˜์—ฌ

Mar 25, 2023

๊น€ํ˜„๊ธฐ

#REACT

๋“ค์–ด๊ฐ€๋ฉฐ

React18์ด ๋‚˜์˜จ์ง€ 1๋…„์ด ๋˜์–ด๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ React18์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ 18๋ฒ„์ „์—์„œ React ํŒ€์ด ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ๊ณผ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์†Œ๊ฐœํ•˜๋Š” ๊ณต์‹ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์†Œ๊ฐœํ•˜๋ฉด์„œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ธ useTransition๋„ ๊ฐ™์ด ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ์„ฑ

React18์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๋™์‹œ์„ฑ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ์€ ๊ทธ ์ž์ฒด๋กœ ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. React๊ฐ€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ UI๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฐํ›„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. (์ค‘๋žต) React ๊ฐœ๋ฐœ์ž๊ฐ€ React ๋‚ด๋ถ€์—์„œ ๋™์‹œ์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ด ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. React์—์„œ ๋™์‹œ์„ฑ์€ ํ•ต์‹ฌ ๋ Œ๋”๋ง ๋ชจ๋ธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์‹œ์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•„๋Š”๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋†’์€ ์ˆ˜์ค€์—์„œ ๋™์‹œ์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ์•„๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Concurrent React์˜ ํ•ต์‹ฌ ์†์„ฑ์€ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. React 18๋กœ ์ฒ˜์Œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋™์‹œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด์ „ ๋ฒ„์ „์˜ React์™€ ๋™์ผํ•˜๊ฒŒ ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ๋‹จ์ผ ๋™๊ธฐ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ์‹ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ์ค‘๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋™์‹œ ๋ Œ๋”๋ง์—์„œ๋Š” ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. React๋Š” ์—…๋ฐ์ดํŠธ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๊ณ  ์ค‘๊ฐ„์— ์ผ์‹œ ์ค‘์ง€ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. React๋Š” ๋ Œ๋”๋ง์ด ์ค‘๋‹จ๋˜๋”๋ผ๋„ UI๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ํ‘œ์‹œ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ „์ฒด ํŠธ๋ฆฌ๊ฐ€ ํ‰๊ฐ€๋˜๋ฉด ๋๋‚  ๋•Œ๊นŒ์ง€ DOM ๋ณ€ํ˜•์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด React๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ƒˆ ํ™”๋ฉด์„ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” UI๊ฐ€ ๋Œ€๊ทœ๋ชจ ๋ Œ๋”๋ง ์ž‘์—… ์ค‘์— ์žˆ๋”๋ผ๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์ฆ‰์‹œ ์‘๋‹ตํ•˜์—ฌ ์œ ๋™์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„๋Š” React18์—์„œ ๋™์‹œ์„ฑ์„ ์„ค๋ช…ํ•˜๋Š” ๊ธ€์ธ๋ฐ์š” ์š”์•ฝํ•ด๋ณด์ž๋ฉด React18์—์„œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ํฌ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. useTransition์„ ํ†ตํ•ด ์–ด๋–ค ๊ธฐ๋Šฅ์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

Transition

์ „ํ™˜(Transition)์€ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ React์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.


  • ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ๋Š” ์ž…๋ ฅ, ํด๋ฆญ, ๋ˆ„๋ฅด๊ธฐ ๋“ฑ๊ณผ ๊ฐ™์€ ์ง์ ‘์ ์ธ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „ํ™˜ ์—…๋ฐ์ดํŠธ๋Š” UI๋ฅผ ํ•˜๋‚˜์˜ ๋ทฐ์—์„œ ๋‹ค๋ฅธ ๋ทฐ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ดํ•‘, ํด๋ฆญ ๋˜๋Š” ๋ˆ„๋ฅด๊ธฐ์™€ ๊ฐ™์€ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ๋Š” ๋ฌผ๋ฆฌ์  ๊ฐœ์ฒด์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ง๊ด€๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ฆ‰๊ฐ์ ์ธ ์‘๋‹ต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๋“ค์€ โ€œํ‹€๋ ธ๋‹คโ€๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „ํ™˜(transition)์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์—์„œ ๋ชจ๋“  ๊ฐ’์ด ํ‘œ์‹œ๋˜๊ธฐ ์ „์— ๋ณด์—ฌ์ง€๋Š” ์ค‘๊ฐ„๊ฐ’์„ ์ตœ์ข…๊ฐ’์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ƒ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ผ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชจ๋‘ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ์ด๋ฒคํŠธ ๋‚ด์—์„œ startTransition API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ธด๊ธ‰ํ•˜๊ณ  โ€œ์ „ํ™˜(transition)โ€œ์ธ์ง€ React์— ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ๋ธ”๋กœ๊ทธ์— ์†Œ๊ฐœ๋œ Transition์— ๊ด€ํ•œ ์„ค๋ช…์ด์—ˆ๋Š”๋ฐ์š” ํ•ต์‹ฌ์€ ์ตœ์ƒ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ค ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ธด๊ธ‰ํ•œ์ง€ ์ „ํ™˜(transition)์ธ์ง€ ์•„๋Š”๊ฒŒ ํ•„์š”ํ•˜๋ฉฐ React18์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด์„œ ํ•œ๋ฒˆ ๋” ์ดํ•ดํ•ด ๋ณผ๊นŒ์š”?

์˜ˆ์ œ(๊ฒ€์ƒ‰)

1๋งŒ๊ฐœ์˜ ๋”๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  input value๋ฅผ ํ†ตํ•ด filter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•œ๋ฒˆ 1๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ์ง์ ‘์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ (ํŽ˜์ด์ง€ ๋„ค์ด์…˜ ์ด์šฉ, ํ˜น์€ ์„œ๋ฒ„์ธก์—์„œ ํ•„ํ„ฐ ์ž‘์—…)

React18์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ useTransition์„ ์ด์šฉํ•ด ์ด๋Ÿฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋™์‹œ์„ฑ์„ ํ†ตํ•ด ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

code-sandbox

์˜ˆ์ œ์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜

์˜ˆ์ œ๊ฐ€ code-sandbox๋กœ ๊ตฌํ˜„๋˜์–ด์„œ ์™„๋ฒฝํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฒ€์ƒ‰์ฐฝ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ…์ŠคํŠธ๋ฅผ ์ง€์šฐ๋ฉด ๋ฌธ์ œ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ filter ํ•ด์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ ๋”œ๋ ˆ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” input์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ…์ŠคํŠธ๋ฅผ ์ง€์šฐ๊ธฐ ์œ„ํ•ด delete ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ํ–‰์œ„๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ urgent update(๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ)์— ํ•ด๋‹นํ•˜๋Š” ์•ก์…˜์ด๋ฉฐ ์ด๋Ÿฐ ์•ก์…˜์—์„œ์˜ ๋”œ๋ ˆ์ด ๋ฐœ์ƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ์—์„œ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜

์œ„์—์„œ ์„ค๋ช…ํ•œ Transition์„ ์‚ฌ์šฉํ•˜์—ฌ React์—๊ฒŒ ์–ด๋–ค ์—…๋ฐ์ดํŠธ๊ฐ€ urgent update์ธ์ง€ Transition์ธ์ง€ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ์—์„œ urgent update๋Š” input์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์•ก์…˜์ด๊ณ  urgent update์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๋กœ์ง์€ input์—์„œ ๋ฐ›์€ ๊ฐ’์„ ํ†ตํ•ด filtering ํ•ด์ฃผ๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” filtering ํ•ด์ฃผ๋Š” ๋กœ์ง์„ React์—๊ฒŒ urgent update๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import { useTransition } from "react";
const [isPending, startTransition] = useTransition();

startTransition(() => {
  setFilterTerm(e.target.value);
});

isPending์€ urgent update๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ •์˜ํ•œ ๋กœ์ง์ด ์—ฌ์ „ํžˆ ์‹คํ–‰ ๋ณด๋ฅ˜์ค‘ ์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ๋ ค์ฃผ๋Š” boolean ๊ฐ’์ž…๋‹ˆ๋‹ค. useTransition hook์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ isPending ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”๋ฐ

๋งŒ์•ฝ hook์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ํ•˜๋ฉด React์—์„œ ์•„๋ž˜ ์ฒ˜๋Ÿผ startTransition๋งŒ importํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { startTransition } from 'react';

startTransition(() => {
  setFilterTerm(e.target.value);
});

๊ฐœ์„  ํ™•์ธ

code-sandbox

๊ฐœ์„  ์ „, ๊ฐœ์„ ํ›„ ์˜ ์ฐจ์ด์ 

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ input์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. React์—๊ฒŒ filterTerm์˜ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๊ณ  input์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ urgent update๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์„  ์ „๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฆฌ์ŠคํŠธ ์—…๋ฐ์ดํŠธ์˜ ์†๋„๊ฐ€ input ๋ณด๋‹ค๋Š” ์ง€์—ฐ๋˜์–ด ์—…๋ฐ์ดํŠธ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ถ€๋ถ„์ด React18์—์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๋™์‹œ์„ฑ์˜ ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ „ํ™˜์ด ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ค‘๋‹จ๋˜๋ฉด(์˜ˆ: ์—ฌ๋Ÿฌ ๋ฌธ์ž๋ฅผ ์—ฐ์†์œผ๋กœ ์ž…๋ ฅ) React๋Š” ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์˜ค๋ž˜๋œ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ œ๊ฑฐํ•˜๊ณ  ์ตœ์‹  ์—…๋ฐ์ดํŠธ๋งŒ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๊ธ€ ์ดˆ๋ฐ˜์— ๋‚˜์˜จ

Concurrent React์˜ ํ•ต์‹ฌ ์†์„ฑ์€ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด์šฉ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜

ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ useTransition์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠน๋ณ„ํ•˜๊ฒŒ ๋А๋ฆฐ ๋กœ์ง์—์„œ ์˜ค๋ž˜๋œ ๊ธฐ๊ธฐ์— ๋Œ€์‘ํ•ด์•ผ ํ•˜๊ณ  ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์„๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ๋Š” useTransition์˜ ์‚ฌ์šฉ ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•œ

๊ทน๋‹จ์ ์ธ ์˜ˆ์ผ ๋ฟ์ด๋ฉฐ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ํ†ตํ•ด์„œ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. useMemo์™€ useCallback์„ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ

useTransition ๋˜ํ•œ React๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋กœ์ง ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ ์˜คํžˆ๋ ค ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ๋  ๊ณณ์— ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋” ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

React18์—์„œ ์ฃผ์š” ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ์ธ ๋™์‹œ์„ฑ๊ณผ useTransition์— ๋Œ€ํ•ด ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฉ”์ด์ €ํ•œ ์—…๋ฐ์ดํŠธ๋Š” ์•„๋‹ˆ์˜€์ง€๋งŒ

์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ์„ ๋А๋‚„ ์ˆ˜ ์žˆ๋Š” React ํŒ€์˜ ์ƒ๊ฐ์„ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋˜๋„๋ก์ด๋ฉด ์˜ˆ์ œ๋Š” code-sandbox๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ์—์„œ ์ง์ ‘ ๊ตฌ๋™ํ•ด ๋ณด์‹œ๋ฉด์„œ ์ง„ํ–‰ํ•˜์‹œ๊ธธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋ฌธ์„œ

Grow & Glow ยฉ 2025

Banner images by undraw.co