[React] ๐Ÿ”ซSuspense ์‚ฌ์šฉ๋ฒ•

TATAยท2023๋…„ 3์›” 22์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
21/32

โ–ท Suspense

Suspense(๋Œ€๊ธฐ)๋Š” React v18๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ,
๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ ,
๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋ง
ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

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

โ—๏ธ์ฐธ๊ณ ) ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์ด๋ž€ ์ฝ”๋“œ์—์„œ ๋‹น์žฅ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„๋งŒ์„ ๋กœ๋”ฉํ•˜๊ณ , ํ˜„์žฌ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ๋ถ„๋ฆฌ์‹œ์ผœ ๋‚˜์ค‘์— ๋กœ๋“œํ•จ์œผ๋กœ์จ ๋กœ๋”ฉ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.


๐Ÿ”ซ React.lazy

dynamic import๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

// React๋Š” SPA์ด๋ฏ€๋กœ ํ•œ ๋ฒˆ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
// React.lazy๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ import๋ฅผ ํ•˜๋ฉด ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ง€์—ฐ์‹œ๊ฐ„์„ ์–ด๋Š ์ •๋„ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
import Component from './Component';

// React.lazy๋กœ dynamic import๋ฅผ ๊ฐ์‹ผ๋‹ค.
const Component = React.lazy(() => import('./Component'));

๐Ÿ”ซ React.Suspense

Component๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ Loading ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.
Component๊ฐ€ ๋กœ๋“œ๋˜๋ฉด, Loading ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋™์œผ๋กœ ์‚ฌ๋ผ์ง„๋‹ค.

// suspense ๊ฐ€์ ธ์˜ค๊ธฐ
import React, { Suspense } from 'react';

const ComponentA = React.lazy(() => import('./ComponentA'));
const ComponentB = React.lazy(() => import('./ComponentB'));

function Loading() {
  return <div>Loading...</div>
}

function MyComponent() {
  return (
    <div>
	  /* fallback ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ์ค‘์ธ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค. */
      <Suspense fallback={<Loading />}>
		/* Suspense ์ปดํฌ๋„ŒํŠธ ํ•˜์œ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ lazy ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. */
        <ComponentA />
		<ComponentB />
      </Suspense>
    </div>
  );
}

๐Ÿ”ซ React.lazy์™€ Suspense์˜ ์ ์šฉ

์›น ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ง„์ž…ํ•˜๋Š” ๋‹จ๊ณ„์ธ
Route์— ์ด ๋‘ ๊ธฐ๋Šฅ์„ ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์ค„์–ด๋“œ๋Š” ๋ถ„๋ช…ํ•œ ์žฅ์ ์ด ์žˆ์œผ๋‚˜,
ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๊ณผ์ •๋งˆ๋‹ค ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋ณด์—ฌ์ง€๊ธฐ ๋•Œ๋ฌธ์—
์„œ๋น„์Šค์— ๋”ฐ๋ผ์„œ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

const Home = lazy(() => import('./Component/Home'));
const About = lazy(() => import('./Component/About'));

function Loading() {
  return <div>Loading...</div>
}

const App = () => (
  <Router>
    <Suspense fallback={<Loading />}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Suspense>
  </Router>
);



๐Ÿ‘‰ React(๊ณต์‹๋ฌธ์„œ) - Suspense 1 ๏ผ‹ Route-based code splitting
๐Ÿ‘‰ React(๊ณต์‹๋ฌธ์„œ) - Suspense 2
๐Ÿ“œSPA์™€ Dynamic Import ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

profile
๐Ÿพ

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