Skip to main content

9. React Version

React Version 18#

๋ฆฌ์•กํŠธ 18 ๋ฒ„์ „#

  1. ๋ฆฌ์•กํŠธ 18์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?
  2. ๋ฆฌ์•กํŠธ 18๋กœ ์–ด๋–ป๊ฒŒ ์—…๊ทธ๋ ˆ์ด๋“œ ํ• ์ˆ˜์žˆ๋‚˜์š”?

๋ฆฌ์•กํŠธ 18 ๋ฒ„์ „์— ์ƒˆ๋กœ์šด ๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€์š” ?!#

  1. Automatic batching
  2. Suspense on the server
  3. New APIs for app and library developers
  4. Transition

Automatic batching#

๋ฐฐ์นญ(batching) ์€ ์—…๋ฐ์ดํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ์ƒํƒœ๊ฐ’๋“ค์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ํ•œ๋ฒˆ์˜ ๋ฆฌ๋ Œ๋”๋ง ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชจ๋‘ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•œ ํ•จ์ˆ˜ ์•ˆ์—์„œ setState๋ฅผ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ํ˜ธ์ถœ์‹œํ‚ค๋”๋ผ๋„ ๋ฆฌ๋ Œ๋”๋ง์€ ๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์— ๋์—์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉฐ ๋ฆฌ์•กํŠธ๋Š” ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ๋งŒ ๋ฆฌ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๋Š”๊ฒƒ์„ ๋ง‰๊ธฐ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ์ข‹์€ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

batch update๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์„œ ํผํฌ๋จผ์Šค์ ์œผ๋กœ ํฐ ์ด์ ์„ ์–ป ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ์ด์ „ ๋ฒ„์ „์—์„œ๋„ ์ด๋Ÿฐ batch update๊ฐ€ ์ง€์›๋˜์—ˆ์ง€๋งŒ ํด๋ฆญ๊ณผ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์ด ๋ฒคํŠธ์—์„œ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  api ํ˜ธ์ถœ์— ์ฝœ๋ฐฑ์œผ๋กœ ๋„ฃ์€ ํ•จ์ˆ˜๋‚˜ timeouts ํ•จ์ˆ˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

batch ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?#

์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋Š” ์•ˆ์ „ํ•˜์ง€๋งŒ ์ผ๋ถ€ ์ฝ”๋“œ๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ์งํ›„ DOM์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฝ๋Š” ๋ฐ ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ReactDOM.flushSync()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ 18 ๋ฒ„์ „์—์„œ Automatic batching#

  1. ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๋” ์ ์€ ๋ฆฌ ๋ Œ๋”๋ง์„ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฐ–์—์„œ๋„ ์ž‘๋™
  3. ํ•„์š”ํ•  ๋•Œ๋Š” ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

Suspense on the server (๊ฐ„๋‹จํ•˜๊ฒŒ)#

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง#

๋ฆฌ์—‘ํŠธ์˜ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ๋‹ค์Œ์˜ ์Šคํ…์œผ๋กœ ์ด๋ค„์ง‘๋‹ˆ๋‹ค.

  1. ์„œ๋ฒ„์—์„œ ์ „์ฒด ์•ฑ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋ฒ„์—์„œ ์ „์ฒด ์•ฑ์„ HTML๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์ฒด ์•ฑ์— ๋Œ€ํ•œ JavaScript ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ์—์„œ JavaScript ๋…ผ๋ฆฌ๋ฅผ ์ „์ฒด ์•ฑ์— ๋Œ€ํ•ด ์„œ๋ฒ„ ์ƒ์„ฑ HTML์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์ด "hydration"์ž…๋‹ˆ๋‹ค).

Hydration์€ Dryํ•œ HTML์— ์ˆ˜๋ถ„(Javascript) ๊ณต๊ธ‰์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?!!!#

  • ํ•ต์‹ฌ ๋ถ€๋ถ„์€ ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์ „์ฒด ์•ฑ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.(๋™๊ธฐ ๋ฐฉ์‹ ๋ฐ Waterfall ๋ฐฉ์‹) ๊ฑฐ์˜ ๋ชจ๋“  ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์•ฑ์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์•ฑ์˜ ์ผ๋ถ€๊ฐ€ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋ณด๋‹ค ๋Š๋ฆฐ ๊ฒฝ์šฐ ์ด๋Š” ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์™œ๋ƒ๋ฉด ํ•œ ํŽ˜์ด์ง€์— ์—ฌ๋Ÿฌ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์„ ๋•Œ HTML ์ƒ์„ฑ์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ปดํฌ๋„ˆํŠธ๊ฐ€ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ ๋นจ๋ฆฌ ์ƒ์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•ด์„œ ๊ณ„์† ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ 18์—์„œ Suspense๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ#

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

Suspense on the server (์ž์„ธํ•˜๊ฒŒ)#

์„œ๋ฒ„ ๋ Œ๋”๋ง์˜ ์žฅ์ #

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

์˜ค๋Š˜๋‚  ์„œ๋ฒ„ ๋ Œ๋”๋ง์˜ ๋‹จ์ ์€ ?#

  • ์–ด๋– ํ•œ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  ๊ฒƒ์„ Fetch ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Hydrate ์„ ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๊ฒƒ์„ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๊ฒƒ์„ Hydrate ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ All or Nothing !!!

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ React 18์—์„œ ํ•˜๋Š” ๊ฒƒ์€ ?#

  1. Streaming HTML (Server)
  2. Selective Hydration (Client)

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— HTML ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฐฉ๋ฒ•#

  • renderToString ๋Œ€์‹ ์— renderToPipeableStream ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉ
  • <Suspense>๋กœ <Comments>๋ฅผ ๊ฐ์‹ธ๋ฉด React๊ฐ€ ํŽ˜์ด์ง€์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋Œ€ํ•ด HTML ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  React์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋Œ€์‹  React๋Š” ์ฃผ์„ ๋Œ€์‹  ์ž๋ฆฌ ํ‘œ์‹œ์ž(์Šคํ”ผ๋„ˆ)๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์ดํ›„์— ๋Œ“๊ธ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์—์„œ ์ค€๋น„๋˜๋ฉด React๋Š” ์ถ”๊ฐ€ HTML์„ ๋™์ผํ•œ ์ŠคํŠธ๋ฆผ์— ๋ณด๋‚ด๊ณ  ํ•ด๋‹น HTML์„ "์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜"์— ๋„ฃ๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์ธ๋ผ์ธ <script> ํƒœ๊ทธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ React ์ž์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋กœ๋“œ๋˜๊ธฐ ์ „์—๋„ ๋’ค๋Šฆ์€ ๋Œ“๊ธ€ HTML์ด "ํŒ์—…"๋ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์˜ ์ผ๋ถ€๊ฐ€ ์ดˆ๊ธฐ HTML์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  HTML์„ ์ง€์—ฐํ•˜๊ฑฐ๋‚˜ HTML์—์„œ ์ œ์™ธํ• ์ง€ ์„ ํƒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— HTML ์ŠคํŠธ๋ฆผ์—์„œ ํ•ด๋‹น ๋ถ€๋ถ„์ด "Pop in"๋˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด HTML ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ๋‹ฌ๋ฆฌ ํ•˜ํ–ฅ์‹(top-down) ์ˆœ์„œ๋กœ ๋ฐœ์ƒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „์— Hydrate ํ•˜๋Š” ๋ฐฉ๋ฒ•#

  • ํ˜„์žฌ๋Š” ์ดˆ๊ธฐ HTML์„ ๋” ์ผ์ฐ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€ ์œ„์ ฏ์— ๋Œ€ํ•œ JavaScript ์ฝ”๋“œ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์•ฑ์„ Hydrate ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ํฌ๋ฉด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฐ ๋ฒˆ๋“ค์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ "์ฝ”๋“œ ๋ถ„ํ• "์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ์ง€์ •ํ•˜๋ฉด ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ด๋ฅผ ๋ณ„๋„์˜ <script> ํƒœ๊ทธ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
  • React.lazy๋กœ ์ฝ”๋“œ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฒˆ๋“ค์—์„œ ๋Œ“๊ธ€ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ „์—๋Š” ์ด ๋ฐฉ๋ฒ•์€ ์„œ๋ฒ„ ๋ Œ๋”๋ง์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

React.lazy

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋‹จ๊ณ„์—์„œ ํฐ ๋ฒˆ๋“ค์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋“ค์„ ์ž‘์€ ์ฒญํฌ๋“ค๋กœ ๋‚˜๋ˆ„์–ด ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ•  (๋ฆฌ์•กํŠธ 18๋ถ€ํ„ฐ๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ๋„ ๊ฐ€๋Šฅ)

์„œ๋ฒ„ ๋ Œ๋”๋ง์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ Hydrating ํ•˜๋Š” ์ˆœ์„œ#

  • HTML์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๋น„์šฉ์ด ํฐ ์ปดํฌ๋„ŒํŠธ๋“ค์€ <Suspense> ๋กœ ๊ฐ์Œˆ์œผ๋กœ ์ธํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์ด ์—ฌ์ „ํžˆ ํด๋ฐฑ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ์–ด๋„ ๊ทธ์™€ ์ƒ๊ด€์—†์ด ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ Hydrating์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ ๊นŒ์ง€ HTML ์ŠคํŠธ๋ฆฌ๋ฐ ๋œ ํ›„ JS ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋œ ์ปดํฌ๋„ŒํŠธ ๋“ค์€ ๊ทธ ๋ถ€๋ถ„ ๋˜ํ•œ Hydrating ํ•ด์ค๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ ‰์…˜์— ๋”ฐ๋ผ ์–ด๋–ค ๊ฒƒ์„ ๋จผ์ € hydration์‹œํ‚ฌ์ง€์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. React๋Š” ํด๋ฆญ์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ๊ธฐ๋กํ•˜๊ณ  ๋Œ€์‹  ๋” ๊ธด๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ“๊ธ€์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค

Transition#

startTransition#

  • React 18์—์„œ๋Š” ์—…๋ฐ์ดํŠธ ์ค‘์—๋„ ์•ฑ์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ƒˆ๋กœ์šด API๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์—…๋ฐ์ดํŠธ๋ฅผ "Transition"์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ ์ „ํ™˜ ์ค‘์— ์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์ „ํ™˜์ด ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์€ ๋ฆฌ์•กํŠธ์—์„œ ์–ด๋– ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ Urgent ํ•˜๋ฉฐ ์–ด๋– ํ•œ๊ฒŒ ๊ทธ๋Ÿฌํ•˜์ง€ ์•Š์€์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Š”๋ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฒ€์ƒ‰ํ•˜๋Š” Input ์€ ์ด๋ฒคํŠธ์— ๋”ฐ๋ผ์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ํ•ด๋‹นํ™”๋ฉด์— ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์•„๋ž˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋„ ์ด์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋Š”๋ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋งŽ์ง€ ์•Š๋”๋ผ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ๋งŽ์€ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๊ฒ€์ƒ‰์ฐฝ์— ํƒ€์ดํ•‘์„ ํ•˜๋Š”๊ฒƒ์— ๋”ฐ๋ผ ๋ฐ”๋กœ ๋ฐ”๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋„ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ฉด ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌํ•˜๊ธฐ์— ์ด ๋ถ€๋ถ„์€ ๊ฒ€์ƒ‰ ์ฐฝ๊ณผ ๊ฒฐ๊ณผ ์ฐฝ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์œ ์ €๊ฐ€ ํƒ€์ดํ•‘ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ์ฆ‰๊ฐ ๋ฐ˜์˜๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒ€์ƒ‰์ฐฝ, ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ƒ‰ ์ฐฝ๋ณด๋‹ค๋Š” UI ์—…๋ฐ์ดํŠธ๊ฐ€ ๋Š๋ฆฐ ๊ฒƒ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์ ธ์•ผ ํ•˜๋Š” ๊ฒฐ๊ณผ ์ฐฝ์œผ๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Urgent Updates, ๊ฒ€์ƒ‰ ์ฐฝ#

  • ๋ฒ„ํŠผ ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๊ณผ ๊ฐ™์ด ์ง๊ด€์ ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํƒœ ๊ฐ’๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Transition Updates, ๊ฒฐ๊ณผ ์ฐฝ#

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํƒœ ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ทฐ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?#

  • ์ƒˆ๋กœ์šด startTransition API๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ "Transition"์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด API๋กœ ๋ฆฌ์•กํŠธ์—๊ฒŒ ์ƒํƒœ ์—…๋ฐ์ดํŠธํ•˜๋Š”๋ฐ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • startTransition์— ๋ž˜ํ•‘๋œ ์—…๋ฐ์ดํŠธ๋Š” ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํด๋ฆญ์ด๋‚˜ ํ‚ค ๋ˆ„๋ฆ„๊ณผ ๊ฐ™์€ ๋” ๊ธด๊ธ‰ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ „ํ™˜์ด ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ค‘๋‹จ๋˜๋ฉด(์˜ˆ: ์—ฌ๋Ÿฌ ๋ฌธ์ž๋ฅผ ์—ฐ์†์œผ๋กœ ์ž…๋ ฅ) React๋Š” ๋‹ค์Œ์„ throwํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์˜ค๋ž˜๋œ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ œ๊ฑฐํ•˜๊ณ  ์ตœ์‹  ์—…๋ฐ์ดํŠธ๋งŒ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • Transition์„ ์‚ฌ์šฉํ•˜๋ฉด UI๊ฐ€ ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋” ์ด์ƒ ๊ด€๋ จ์ด ์—†๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

Transition์ด ๋ณด๋ฅ˜ ์ค‘์ธ ๋™์•ˆ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?#

  • ๊ฒ€์ƒ‰ ์ฐฝ์— ํƒ€์ดํ•‘์„ ํ–ˆ์„ ๋•Œ startTransition API๋กœ ์ธํ•ด ๊ฒฐ๊ณผ ์ฐฝ์—๋Š” UI ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋ฐ€๋ ค์„œ ์—…๋ฐ์ดํŠธ ๋ณด๋ฅ˜๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด isPending์ด true๋กœ ๋˜๊ธฐ์— isPending์ด true์ผ ์‹œ์— Spinner ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ 18 ์ด์ „์—๋Š” ์–ด๋–ป๊ฒŒ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋‚˜์š”?#

startTransition์ด ์—†์„ ๋•Œ๋Š”

  1. State๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ฑฐ๋‚˜ state๊ฐ€ ๋‘ ๊ฐœ๋‹ˆ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด ์คŒ
  2. debounce๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜
  3. setTimeout์„ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • debounce ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ setTimeout ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ชจ๋“  ์ด๋ฒคํŠธ๊ฐ€ Schedule ๋˜์–ด์žˆ๊ณ  ๋’ค๋กœ ๋ฐ€๋ฆฌ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ๊ฐ€ ๋๋‚˜๋„ ๊ณ„์† ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

React Version 18๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๊ธฐ#

๋ฆฌ์•กํŠธ ๋ฒ„์ „ 18๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๋Š” ๋ฐฉ๋ฒ•#

  1. react์™€ react-dom์„ npm ์œผ๋กœ ๋ถ€ํ„ฐ ์„ค์น˜ํ•˜๊ธฐ
  • npm install react react-dom
  1. ReactDOM.render ====> ReactDOM.createRoot ๋ณ€๊ฒฝํ•˜๊ธฐ
Last updated on