컴포넌트가 데이터를 기다리고 있음
데이터를 기다리는 동안 fallback 컴포넌트를 선언적으로 렌더링
선언적이라는 개념은 명령형과 비교하여 아래에서 설명해보도록 하겠다.
| 명령형 프로그래밍 | 선언형 프로그래밍 | 
|---|---|
| HOW | WHAT | 
| 무엇을 어떻게(HOW) 할까 | 무엇(WHAT) 을 할 것인가 | 
말로만 보면 둘이 정확히 어떤 차이가 있는지 좀 모호하기 때문에 동일한 예시를 각 방법으로 코드로 표현한 것을 통해 차이를 알아보도록 하자.
배열 요소들의 합을 구하는 예제이다. 명령형, 선언형으로 어떻게 구현할 수 있는지 나타내보았다. 
| 명령형 프로그래밍 | 선언형 프로그래밍 | 
|---|---|
| 어떻게(HOW) 배열의 합을 구할지 설명 | 무엇(WHAT)을 하는지 작성(배열의 합 구하기) | 
| 명령형의 추상화된 형태 | |
|  |  | 
import { useState, useEffect } from "react";
import OtherComponent from "./OtherComponent";
import LoadingComponent from "./LoadingComponent";
function App(){
    const [data, setData] = useState(null)
  
    useEffect(() => {
        fetch(API_URL)
        .then(res => res.json())
        .then(setData)
    }, [])
    return (
        { data ? <LoadingComponent /> : <OtherComponent data={data}/>}
    )
}fallback 속성으로 넘긴 컴포넌트를 대신 보여준다.fallback 인자로 스켈레톤 UI를 호출하여 좋은 사용자 경험을 제공할 수도 있다.lazy()를 사용해 불러오는 컴포넌트는 default export 되어야 한다.import React from "react";
const OtherComponent = React.lazy() => import("./OtherComponent"));
import LoadingComponent from "./LoadingComponent";
function App() {
    return (
        <React.Suspense fallback={<LoadingComponent />} />
            <OtherComponent />
        </React.Suspense>
    )
}이렇게 Suspense로 감싸주면 OtherComponent가 로딩되는 동안에 fallback에 있는 <LoadingComponent />이 렌더링되어 로딩 상태를 보여줄 수 있다.
더 좋은 사용자 경험과 Code Spliting에 유용한 기능인 것 같다. 지금까지는 명령형 방식으로만 짜면서 로딩컴포넌트 UI의 일관성을 유지하는 게 쉽지 않았는데 다음에는 스켈레톤 UI랑 함께 사용해봐야겠다!😲