<aside> 💡 Suspense를 사용하면 컴포넌트가 렌더링하기 전에 다른 작업이 먼저 이루어지도록 “대기합니다”.

</aside>

컴포넌트 자체를 비동기적으로 불러오기

import { Suspense, lazy } from 'react';
// 사이즈가 엄청 큰 컴포넌트를 비동기로 불러오기로했다.
const HugeComponent = lazy(() => import('./HugeComponent'));

const ComponentWithSuspense = () => {
  return (
    <Suspense fallback={<Spinner />}>
      <HugeComponent />
    </Suspense>
  );
};

export default ComponentWithSuspense;

<aside> 💡 (Reprise) 선언형 컴포넌트를 사용한 컴포넌트는 「무엇을(WHAT) 보여줄 것이냐」에 집중합니다.

</aside>

위 예시의 Suspense와 Lazy를 사용한 “동적으로 컴포넌트 불러오기”는 Router와 함께 Code Splitting에 주로 사용됩니다.

데이터 불러오기를 위한 Suspense

import { Suspense } from 'react';

const User = () => {
  return (
    // UserProfile에서 비동기 데이터를 로딩하고 있는 경우
    // Suspense의 fallback을 통해 Spinner를 보여줍니다.
    <Suspense fallback={<Spinner />}>
      <UserProfile />
    </Suspense>
  );
};

const UserProfile = () => {
  // userProfileRepository는 Suspense를 지원하는 "특별한 객체"
  const { data } = userProfileRepository();

  return (
    // 마치 데이터가 "이미 존재하는 것처럼" 사용합니다.
    <span>
      {data.name} / {data.birthDay}
    </span>
  );
};

export default User;

<aside> 💡 Suspense를 지원하는 특별한 객체를 사용하면 비동기 데이터 불러오기도 Suspense를 통해 처리할 수 있다가 핵심입니다.

</aside>