[250714] TIL

Today I Learned (2025-07-14)

Suspense

  • ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๋™์ ์œผ๋กœ ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ์šฉ๋„
  • suspense๋Š” ๋น„๋™๊ธฐ์ , ์ง€์—ฐ์ด ๋ถˆ๊ฐ€ํ”ผํ•œ ๋ถ€๋ถ„์—์„œ๋งŒ ์ง‘์ค‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋ฒ„ suspense

  • ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ํŒจ์นญ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€
  • ๋…๋ฆฝ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์˜์—ญ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ

ํด๋ผ์ด์–ธํŠธ suspense

  • ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋“ฑ
  • fetch๋ณด๋‹ค๋Š” ์ฃผ๋กœ import๋กœ ๋™์  (lazy) ์ปดํฌ๋„ŒํŠธ, swr , react query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ

๋‘˜ ๋‹ค โ€œ์ค€๋น„ ์•ˆ ๋œ ๋ถ€๋ถ„์˜ ๊ฒฝ๊ณ„โ€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ๋˜‘๊ฐ™์ง€๋งŒ, ์‹คํ–‰ ํ™˜๊ฒฝ/์šฉ๋„/๋ Œ๋”๋ง ์ฃผ์ฒด๊ฐ€ ๋‹ค๋ฆ„!

use

https://ko.react.dev/reference/react/use#usage

  • if ๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • use Hook์€ Promise๋‚˜ Context์—์„œ ์ฐธ์กฐํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” use ๋ณด๋‹ค async await ๋ฅผ ์‚ฌ์šฉ
    • async await ์ด ํ˜ธ์ถœ๋œ ์‹œ์ ๋ถ€ํ„ฐ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ˜๋ฉด, use๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌ์กธ๋ธŒ๋œ ํ›„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•จ
      • ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ๋ƒ, await ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ Œ๋”๋ง ์ž์ฒด๊ฐ€ ๋ฉˆ์ถค
      • use๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ ์ „์—๋„ ๋ฆฌ๋ Œ๋”๋ง
  • ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ promise ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์ข‹์Œ. ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒ์„ฑ๋œ promise๋Š” ๋ Œ๋”๋ง๋–„๋งˆ๋‹ค ๋‹ค์‹œ ์ƒ์„ฑ๋จ
    • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋Š” Props ๋กœ ํด๋ผ์ด์–ธํŠธ์— ํ•œ ๋ฒˆ ์ „๋‹ฌ ๋˜๋ฉด ๊ทธ๊ฑธ ๋ฐ›๋Š” ์ชฝ์—์„œ ์•„๋ฌด๋ฆฌ ๋ฆฌ๋ Œ๋”ํ•ด๋„ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์Œ
    • ๋Œ€์‹  ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒํƒœ๊ฐ€ ์ „๋‹ฌ ๋˜๋ฉด ์•„๋ž˜๊ฐ€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—ฌ๋„ ๋ฆฌ๋ Œ๋”๋ง ๋จ
  • useContext ๋Œ€์‹  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ•˜๊ธฐ
"use client";

import { use, Suspense } from "react";

function Message({ messagePromise }) {
  const messageContent = use(messagePromise);
  return <p>Here is the message: {messageContent}</p>;
}

export function MessageContainer({ messagePromise }) {
  return (
    <Suspense fallback={<p>โŒ›Downloading message...</p>}>
      <Message messagePromise={messagePromise} />
    </Suspense>
  );
}
"use client";

import { use, Suspense } from "react";
import { ErrorBoundary } from "react-error-boundary";

export function MessageContainer({ messagePromise }) {
  return (
    <ErrorBoundary fallback={<p>โš ๏ธSomething went wrong</p>}>
      <Suspense fallback={<p>โŒ›Downloading message...</p>}>
        <Message messagePromise={messagePromise} />
      </Suspense>
    </ErrorBoundary>
  );
}

function Message({ messagePromise }) {
  const content = use(messagePromise);
  return <p>Here is the message: {content}</p>;
}

Categories:

Updated:

Leave a comment