[React] Suspense

2023. 1. 28. 16:00·React/실험실
반응형

React 18 버전이 정식 릴리스가 되면서 추가된 Suspense에 대해서 알아보자 

 

Suspense? 

Suspense는 React에서 컴포넌트의 렌더링을 특정 작업이 끝날 때까지 중단시키고 

다른 컴포넌트를 먼저 렌더링 하는 기능이다. 

 

일반적으로 REST API나 GraphQL을 호출하여 네트워크를 통해 비동기로 데이터를 가져오는 경우에 

사용하면 유용할 것 같다. 

 

<UserList />

유저의 리스트를 출력하는 UserList 컴포넌트가 있다고 생각해보자.

당연히 컴포넌트를 호출하면 화면에 UserList 컴포넌트가 나타날 것이다.

하지만 아직 비동기 데이터인 유저 정보를 가지고 오지 않았다면 로딩 화면이 출력돼야 할 것이다. 

import { useState, useEffect } from "react";

function User({ userId }) {
  const [loading, setLoading] = useState(true);
  const [user, setUser] = useState([]);

  // ...

  if (loading) return <p>사용자 정보 로딩중...</p>;
  return (
    <div>
      <p>{user.name} 님</p>
    </div>
  );
}

export default User;

일반적으로는 loading과 같은 State를 통해서 Loading 화면을 출력했을 겁니다. 

 

Suspense는 어떤 방식으로 사용하는가? 

function fetchUser(userId) {
  let user = null;
  const suspender = fetch(
    `https://jsonplaceholder.typicode.com/users/${userId}`
  )
    .then((response) => response.json())
    .then((data) => {
      setTimeout(() => {
        user = data;
      }, 3000);
    });
  return {
    read() {
      if (user === null) {
        throw suspender;
      } else {
        return user;
      }
    },
  };
}

export default fetchUser;

먼저 UserList 컴포넌트에서 데이터를 불러오는 로직을 분리합니다. 

read 함수는 데이터를 수신 중에는 API를 호출하는 Promise를 반환하고 수신이 완료되면 데이터를 반환합니다. 

 

import { Suspense } from "react";
import User from "./pages/user";
import fetchUser from "./pages/user/fetchUser";

function App() {
  return (
    <Suspense fallback={<p>사용자 정보 로딩중...</p>}>
      <User data={fetchUser("1")} />
    </Suspense>
  );
}

export default App;

Suspense를 사용해서 fallback에 Loading 화면을 넣어주고 data에서 API를 호출해서 넘겨준다. 

 

import { useState } from "react";

function User({ data }) {
  const [user, setUser] = useState(data.read());
  
  return (
    <div>
      <p>{user.name} 님</p>
    </div>
  );
}

export default User;

UserList 컴포넌트에서는 불러온 데이터를 state에 넣어서 사용하는 방식이다. 

Suspense를 사용하면 데이터를 불러오는 부분과 UI 렌더링 부분을 분리할 수 있어서 코드 가독성이 향상된다. 

가독성이 향상되므로 유지 보수성도 향상된다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] Context API 언제 사용해야할까?  (0) 2023.01.31
[React] 독립된 React 컴포넌트의 이점  (0) 2023.01.29
[React] Derived State  (0) 2023.01.25
[React] 컴포넌트를 Dry 하게 작성하기  (0) 2023.01.22
[React] styled-reset  (0) 2023.01.15
'React/실험실' 카테고리의 다른 글
  • [React] Context API 언제 사용해야할까?
  • [React] 독립된 React 컴포넌트의 이점
  • [React] Derived State
  • [React] 컴포넌트를 Dry 하게 작성하기
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    식물
    ReactNative
    next.js
    Docker
    타일러영어
    webpack
    바질
    리얼클래스
    프로그래머스
    typescript
    ChatGPT
    CCNA
    영어독학
    다이소
    바질 키우기
    영어회화
    리액트
    redux
    덤프
    react
    리얼학습일기
    자바스크립트
    네이버 부스트캠프
    네트워크
    알고리즘
    Node.js
    Babel
    javascript
    타입스크립트
    CSS
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] Suspense
상단으로

티스토리툴바