๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev

โš›๏ธ <Suspense>๋ž€?

 

๐Ÿ—ฃ๏ธ 'Suspense'๋ฅผ ์จ๋ณด์‹  ์  ์žˆ๋‚˜์š”? ์žˆ๋‹ค๋ฉด ์–ธ์ œ, ์™œ ์“ฐ์‹œ๋‚˜์š”? ์•ˆ ์“ฐ๋ฉด ์–ด๋–ค ์ ์ด ๋ถˆํŽธํ•˜๋‚˜์š”?

 

์“ฐ๊ธด ์“ฐ๋Š”๋ฐ..๋กœ๋”ฉ ์ค‘์— ๋Œ€์‹  ๋ณด์—ฌ์ค„ UI๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋‹Œ๊ฐ€? 

 

๋ฆฌ์•กํŠธ์˜ ๊ณต์‹๋ฌธ์„œ์— ์˜ํ•˜๋ฉด <Suspense>๋Š” children์ด ๋กœ๋”ฉ ์ „๊นŒ์ง€ ๋ณด์—ฌ์ค„ fallback ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

๋ฆฌ์•กํŠธ์˜ <Suspense>์— ๋Œ€ํ•ด์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ธฐ ์ „์—,

Suspend๋ผ๋Š” ๋‹จ์–ด์˜ ๋œป์„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด๊ณ  ๊ฐ€๋ฉด <Suspense>๋ฅผ ์™œ ์“ฐ๊ณ , ์–ธ์ œ ์“ฐ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค.

 

Suspend๋Š” ์ผ์‹œ์ ์œผ๋กœ ์–ด๋–ค ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๋Š” ๊ฒƒ (temporarily prevent from continuing or being in force or effect)์ด๋‹ค.

 

๊ทธ๋Ÿผ ๋ฆฌ์•กํŠธ์˜ <Suspense>๋Š” ์–ด๋–ค ๋™์ž‘์„ ์–ธ์ œ ์ž ์‹œ ๋ฉˆ์ถฐ์ฃผ๋Š” ๊ฑธ๊นŒ?

Suspense์˜ props

Suspense๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ์–ธ์ œ ์ž ์‹œ ๋ฉˆ์ถ”๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ๋จผ์ € Suspense์˜ props๋ฅผ ์‚ดํŽด๋ณด์ž.

๋‹ค์Œ์€ ์ผ๋ฐ˜์ ์ธ Suspense์˜ ํ˜•ํƒœ๋‹ค.

<Suspense fallback={<Loading />}>
  <SomeComponent />
</Suspense>
  • children ( <SomeComponent />) : ์‹ค์ œ๋กœ ๋ Œ๋”๋งํ•˜๊ณ ์žํ•˜๋Š” UI. children์ด ๋ Œ๋”๋ง ๋„์ค‘ suspend๋˜์–ด ์žˆ๋‹ค๋ฉด, Suspense boundary๋Š” fallback์„ ๋Œ€์‹  ๋ Œ๋”๋งํ•œ๋‹ค.
  • fallback (fallback={<Loading />}) : ์‹ค์ œ UI๊ฐ€ ๋กœ๋”ฉ์„ ์™„๋ฃŒํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๋Œ€์‹ ํ•  UI. React node๋ผ๋ฉด ์–ด๋– ํ•œ ๊ฐ’๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์Šค์ผˆ๋ ˆํ†ค์ด๋‚˜ ์Šคํ”ผ๋„ˆ์ฒ˜๋Ÿผ ๊ฒฝ๋Ÿ‰ placeholder UI๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. children์ด suspend ๋˜๋ฉด fallback์œผ๋กœ ์ž๋™์ ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋‹ค๋ฉด children์œผ๋กœ ์ž๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐํ•œ๋‹ค. fallback์ด ๋ Œ๋”๋ง ๋„์ค‘์— suspend ๋œ๋‹ค๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ Suspense boundary๋ฅผ ์ž‘๋™ํ•œ๋‹ค.

โš ๏ธ ์ฃผ์˜ํ•  ์ 

  • ๋ฆฌ์•กํŠธ๋Š” ์ฒซ ๋งˆ์šดํŠธ ์ด์ „์— suspend๋œ ๋ Œ๋”์˜ state์„ ๋ณด์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋˜๋ฉด, ๋ฆฌ์•กํŠธ๋Š” suspend ๋œ ํŠธ๋ฆฌ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์„ ์žฌ์‹œ๋„ํ•œ๋‹ค.
  • startTransition๋‚˜ useDeferredValue๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ผ์œผํ‚จ ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด, Suspense๊ฐ€ tree์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋„์ค‘์— ๋˜ suspend๊ฐ€ ๋œ๋‹ค๋ฉด fallback์ด ๋‹ค์‹œ ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค. 
  • ๋‹ค์‹œ suspend๋˜์–ด์„œ ์ด๋ฏธ ๋…ธ์ถœ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•œ๋‹ค๋ฉด, ๋ฆฌ์•กํŠธ๋Š” content tree์˜ layout Effects๋ฅผ  ํด๋ฆฐ ์—…ํ•œ๋‹ค. ๋‹ค์‹œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค„ ์ค€๋น„๊ฐ€ ๋œ๋‹ค๋ฉด ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์‹œ layout Effects๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ์ˆจ๊ฒจ์ง„ ๋„์ค‘์— Effects๊ฐ€ DOM ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฆฌ์•กํŠธ๋Š” Suspense์™€ ํ•จ๊ป˜ Streaming Server Rendering์™€ Selective Hydration๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ด ์ตœ์ ํ™”๋ฅผ ํ•œ๋‹ค. (an architectural overview์™€ a technical talk์—์„œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃฌ๋‹ค)

Suspense ํ™œ์šฉ

  1. ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋”ฉ๋˜๊ณ  ์žˆ๋Š” ๋™์•ˆ ๋ณด์—ฌ์ค„ fallback์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ
  2. ํ•œ๊บผ๋ฒˆ์— ์ฝ˜ํ…์ธ ๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  3. ๋กœ๋”ฉ๋˜๊ณ  ์žˆ๋Š” ๋™์•ˆ ์ค‘์ฒฉ(nested)๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  4. ์ƒˆ (fresh) ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์žˆ๋Š” ๋™์•ˆ ์ง์ „(stale) ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ
  5. ์ด๋ฏธ ๋…ธ์ถœ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  6. Transition์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ
  7. navigation์ด ๋ฐœ์ƒํ•  ๋•Œ Suspense boundary๋“ค์„ ๋ฆฌ์…‹ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  8. ์„œ๋ฒ„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์™€ ํด๋ผ์ด์–ธํŠธ์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค„ fallback์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ

๐Ÿ“š References

 

<Suspense> – React

The library for web and native user interfaces

react.dev

 

 

๐Ÿค” TMI, ๋Š๋‚€ ์ 

๊ฐ„๋‹จํ•  ์ค„ ์•Œ์•˜๋˜ suspense.. ๊ณต์‹๋ฌธ์„œ ํ•œ๊ธ€ ๋ฒ„์ „์€ ์•„์ง์ด๊ณ , suspense ๊ณต์‹ ์ง€์›๋„ ์•„์ง์ธ ๋“ฏ

๊ธ€์˜ ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๊ฒŒ ๋˜์–ด suspense์˜ ํ™œ์šฉ์— ๊ด€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ๋‹ค๋ฃจ๊ธฐ๋กœ ํ–ˆ๋‹ค.