[React] React.Suspense๋ž€?

jinyยท2025๋…„ 1์›” 25์ผ

๊ธฐ์ˆ  ๋ฉด์ ‘

๋ชฉ๋ก ๋ณด๊ธฐ
38/78

๐Ÿ—ฃ๏ธ React.Suspense์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์˜๋„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฐ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•˜๊ณ  Suspense๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์งˆ๋ฌธ

  • ๋‚˜์˜ ๋‹ต์•ˆ

    ๋ฆฌ์•กํŠธ์˜ Suspense๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ '๋กœ๋”ฉ ์ค‘' ์ƒํƒœ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    ์ฆ‰, ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์œผ๋กœ ์ธํ•ด ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜์„ ๋•Œ, ๊ทธ๋™์•ˆ ๋ณด์—ฌ์ค„ fallback UI(๋Œ€๊ธฐ ํ™”๋ฉด)๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, Lazy Loading๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋กœ๋“œํ•  ๋•Œ React๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™„์ „ํžˆ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ ,
    Suspense๊ฐ€ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋™์•ˆ ์ง€์ •๋œ fallback UI๋ฅผ ๋จผ์ € ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
    ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹ค์ œ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค.

  • ์ฃผ์–ด์ง„ ๋‹ต์•ˆ (๋ชจ๋ฒ” ๋‹ต์•ˆ)

    ๋„ค. ๋ฆฌ์•กํŠธ์˜ Suspense๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์„ ์–ธํ˜• ์ฝ”๋“œ์˜ ์ผ์ข…์ž…๋‹ˆ๋‹ค.
    Suspense์—๋Š” fallback ์†์„ฑ์„ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ์†์„ฑ์ด ๋ฐ”๋กœ ๋กœ๋”ฉ ์ƒํƒœ์ผ ๋•Œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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


๐Ÿ“ ๊ฐœ๋… ์ •๋ฆฌ

๐ŸŒŸ React.Suspense์˜ ๊ฐœ๋…

  • React.Suspense๋Š” React์˜ ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ๋กœ, ๋น„๋™๊ธฐ ์ž‘์—…(์˜ˆ: ๋ฐ์ดํ„ฐ ๋กœ๋“œ๋‚˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋‹ค๋ฆผ์„ ๊ฒฝํ—˜ํ•˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI(์˜ˆ: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
  • ์ฃผ๋กœ React.lazy์™€ Concurrent Mode(React 18 ์ด์ƒ)์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.

๐ŸŒŸ React.Suspense์˜ ์ฃผ์š” ํŠน์ง•

  1. ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI ํ‘œ์‹œ
    Suspense๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ fallback UI๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
    ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด ๋Œ€์ฒด UI๋ฅผ ์‹ค์ œ ์ฝ˜ํ…์ธ ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

  2. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…
    React.lazy์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ์‹œ์ ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ด๋Š” ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์•ฑ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

  3. ๋™๊ธฐ์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต
    ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ๊นœ๋นก์ด๋Š” ํ™”๋ฉด ๋Œ€์‹  ์Šค๋ฌด์Šคํ•œ ๋กœ๋”ฉ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.


๐ŸŒŸ React.Suspense์˜ ๊ตฌ์กฐ

<Suspense fallback={<Loading />}>
  <MyComponent />
<Suspense/>
  • fallback: ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ํ‘œ์‹œํ•  ๋Œ€์ฒด UI์ด๋‹ค. ์ฃผ๋กœ ๋กœ๋”ฉ ์ธ๋””์ผ€์ดํ„ฐ(์Šคํ”ผ๋„ˆ, ๋กœ๋”ฉ ํ…์ŠคํŠธ ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋‚˜ ๋™์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŒŸ React.Suspense์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€

  1. React.lazy๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…
    React.lazy์™€ Suspense๋ฅผ ์กฐํ•ฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

    import React, { Suspense } from "react";
    
    const LazyComponent = React.lazy(() => import("./MyComponent"));
    
    function App() {
      return (
        <Suspense fallback={<div>Loading...</div>}>
          <LazyComponent />
        </Suspense>
      );
    }
    • LazyComponent๋Š” MyComponent๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋ฉฐ, ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ "Loading..."์„ ํ‘œ์‹œํ•œ๋‹ค.
  1. ๋ฐ์ดํ„ฐ ํŽ˜์นญ (React 18 ์ด์ƒ)
    React 18๋ถ€ํ„ฐ Suspense๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์นญํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ use() ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    import React, { Suspense } from "react";
    
    async function fetchData() {
      return new Promise((resolve) => setTimeout(() => resolve("Hello, Server Component!"), 2000));
    }
    
    function MyComponent() {
      const data = use(fetchData()); // ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ 
      return <div>{data}</div>;
    }
    
    export default function App() {
      return (
        <Suspense fallback={<div>Loading data...</div>}>
          <MyComponent />
        </Suspense>
      );
    }
    • ์ด ์ฝ”๋“œ๋Š” React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

      โญ use() ํ•จ์ˆ˜๋ž€?

      • use()๋Š” React 18๋ถ€ํ„ฐ ์ง€์›๋˜๋Š” ํ•จ์ˆ˜๋กœ, React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Component) ํ™˜๊ฒฝ์—์„œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
      • use()๋Š” Promise๋ฅผ ๋ฐ›์•„์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, React์˜ Suspense์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
      • ์ด ํ•จ์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์ „์šฉ์ด๋‹ค.

      โญ use() ํ•จ์ˆ˜์˜ ์ฃผ์š” ํŠน์ง•

      1. Promise๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
        • use() ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ๋ฐ›์€ Promise๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        • Promise๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ, React๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ค‘๋‹จ(suspend)ํ•˜๊ณ  Suspense์˜ fallback UI๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
      2. Suspense์™€์˜ ํ†ตํ•ฉ
        • use()๋Š” React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ Suspense๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.
      3. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์ „์šฉ
        • use()๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
        • React์˜ ์„œ๋ฒ„ ๋ Œ๋”๋ง ํ™˜๊ฒฝ(์˜ˆ: Next.js App Router)์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.

      โญ use() ํ•จ์ˆ˜์˜ ์ฃผ์š” ์ด์ 

      1. ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”
        ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•œ๋‹ค.
        ๊ธฐ์กด์— useEffect์™€ useState๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋˜ ๋กœ์ง์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
      2. React์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ํ†ตํ•ฉ
        React์˜ Suspense์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘ ์ ์ ˆํ•œ ๋Œ€์ฒด UI๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
      3. ์„œ๋ฒ„ ๋ Œ๋”๋ง ์ตœ์ ํ™”
        ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” HTML์ด ์ด๋ฏธ ์ค€๋น„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.

๐ŸŒŸ Suspense์˜ ๋™์ž‘ ์›๋ฆฌ

  1. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ ๊ฐ์ง€
    Suspense๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ๊ฐ์ง€ํ•˜๊ณ , ํ•ด๋‹น ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•œ๋‹ค.

  2. ๋Œ€์ฒด UI ๋ Œ๋”๋ง
    ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ fallback์œผ๋กœ ์ง€์ •๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

  3. ์ž‘์—… ์™„๋ฃŒ ํ›„ ๋ Œ๋”๋ง ์žฌ๊ฐœ
    ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด, Suspense๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์—ฌ ์ตœ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•œ๋‹ค.


๐ŸŒŸ Suspense์˜ ์ œํ•œ์‚ฌํ•ญ

  1. ๋™๊ธฐ์  ๋ฐ์ดํ„ฐ ํŽ˜์นญ์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ
    Suspense๋Š” ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์นญํ•˜๋ฉด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  2. ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š”
    Suspense ์ž์ฒด๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
    react-query, Relay, SWR ๊ฐ™์€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

  3. SSR(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง) ์ œํ•œ
    React 18 ์ด์ „๊นŒ์ง€ Suspense๋Š” SSR์—์„œ ์™„์ „ํžˆ ์ง€์›๋˜์ง€ ์•Š์•˜๋‹ค.
    React 18์—์„œ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์ด ์ œํ•œ์ด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.


๐ŸŒŸ React 18 ์ด์ƒ์—์„œ์˜ Suspense ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ์‚ฌ์šฉ

React 18์—์„œ Suspense๋Š” ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ SSR์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ: React Query์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

import { Suspense } from "react";
import { useQuery } from "react-query";

function fetchData() {
  return fetch("https://api.example.com/data").then(res => res.json());
}

function MyComponent() {
  const { data } = useQuery("myData", fetchData);
  
  return <div>{data.message}</div>;
}

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <MyComponent />
    </Suspense>
  );
}

๐ŸŒŸ Suspense๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ 

  1. ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜: ๋น„๋™๊ธฐ ์ž‘์—… ๋™์•ˆ ๋งค๋„๋Ÿฌ์šด ๋Œ€์ฒด UI ์ œ๊ณต
  2. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…: ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋“œ ์†๋„๋ฅผ ๊ฐœ์„ 
  3. ๋‹จ์ˆœํ™”๋œ ๋น„๋™๊ธฐ ๋กœ์ง: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ UI์—์„œ ์ง์ ‘ ๊ด€๋ฆฌ

0๊ฐœ์˜ ๋Œ“๊ธ€