[React] React.lazy와 Suspense

2024. 12. 26. 10:48·TypeScript
반응형

소개

웹 애플리케이션이 커질수록 초기 로딩 시간도 늘어납니다. React.lazy와 Suspense를 사용하면 필요한 시점에 코드를 로드하여 초기 로딩 시간을 줄일 수 있습니다. 쉽게 말해, 처음부터 모든 것을 로드하지 않고 필요할 때 필요한 부분만 가져오는 것입니다.

React.lazy란?

React.lazy는 컴포넌트를 동적으로 불러올 수 있게 해주는 기능입니다. 쉽게 말해, 필요한 순간에 컴포넌트를 로드하는 것입니다.

기본 사용법

// 기존 방식
import HeavyComponent from './HeavyComponent';

// React.lazy 사용
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));

Suspense란?

Suspense는 컴포넌트가 로드되는 동안 로딩 화면을 보여주는 기능입니다.

기본 사용법

import React, { Suspense } from 'react';

function App() {
  return (
    <Suspense fallback={<div>로딩중...</div>}>
      <HeavyComponent />
    </Suspense>
  );
}

실제 사용 예시

1. 탭 메뉴 구현

// 각 탭 컴포넌트를 lazy로 불러오기
const HomeTab = React.lazy(() => import('./HomeTab'));
const ProfileTab = React.lazy(() => import('./ProfileTab'));
const SettingsTab = React.lazy(() => import('./SettingsTab'));

function TabMenu() {
  const [activeTab, setActiveTab] = useState('home');

  return (
    <div>
      {/* 탭 버튼들 */}
      <div>
        <button onClick={() => setActiveTab('home')}>홈</button>
        <button onClick={() => setActiveTab('profile')}>프로필</button>
        <button onClick={() => setActiveTab('settings')}>설정</button>
      </div>

      {/* 탭 내용 */}
      <Suspense fallback={<div>탭 로딩중...</div>}>
        {activeTab === 'home' && <HomeTab />}
        {activeTab === 'profile' && <ProfileTab />}
        {activeTab === 'settings' && <SettingsTab />}
      </Suspense>
    </div>
  );
}

2. 모달 구현

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

function ProductList() {
  const [showModal, setShowModal] = useState(false);

  return (
    <div>
      <button onClick={() => setShowModal(true)}>
        상세 정보 보기
      </button>

      {showModal && (
        <Suspense fallback={<div>모달 로딩중...</div>}>
          <DetailModal 
            onClose={() => setShowModal(false)} 
          />
        </Suspense>
      )}
    </div>
  );
}

3. 페이지 라우팅

import { BrowserRouter, Routes, Route } from 'react-router-dom';

const Home = React.lazy(() => import('./pages/Home'));
const Products = React.lazy(() => import('./pages/Products'));
const About = React.lazy(() => import('./pages/About'));

function App() {
  return (
    <BrowserRouter>
      <Suspense fallback={<div>페이지 로딩중...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/products" element={<Products />} />
          <Route path="/about" element={<About />} />
        </Routes>
      </Suspense>
    </BrowserRouter>
  );
}

사용자 경험 개선하기

1. 로딩 화면 꾸미기

function LoadingSpinner() {
  return (
    <div className="loading-spinner">
      <div className="spinner"></div>
      <p>잠시만 기다려주세요...</p>
    </div>
  );
}

function App() {
  return (
    <Suspense fallback={<LoadingSpinner />}>
      <MyComponent />
    </Suspense>
  );
}

2. 지연 로딩 추가하기

function DelayedSuspense({ children, delay = 500 }) {
  const [show, setShow] = useState(false);

  useEffect(() => {
    const timer = setTimeout(() => setShow(true), delay);
    return () => clearTimeout(timer);
  }, [delay]);

  return (
    <Suspense 
      fallback={
        show ? <LoadingSpinner /> : null
      }
    >
      {children}
    </Suspense>
  );
}

주의사항

1. 너무 작은 컴포넌트는 분할하지 않기

// ❌ 너무 작은 컴포넌트
const Button = React.lazy(() => import('./Button'));

// ✅ 의미 있는 크기의 컴포넌트
const ComplexDashboard = React.lazy(() => import('./ComplexDashboard'));

2. 적절한 분할 포인트 선택하기

// ✅ 좋은 분할 포인트 예시
const AdminDashboard = React.lazy(() => import('./AdminDashboard'));
const UserProfile = React.lazy(() => import('./UserProfile'));
const Analytics = React.lazy(() => import('./Analytics'));

성능 향상 확인하기

  1. 개발자 도구의 Network 탭 확인
  2. Lighthouse 성능 점수 비교
  3. 실제 사용자 피드백 수집

결론

React.lazy와 Suspense는 큰 규모의 애플리케이션에서 초기 로딩 시간을 줄이는 데 매우 효과적입니다. 하지만 모든 것을 분할하는 것이 아니라, 적절한 위치에 적용하는 것이 중요합니다.

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

'TypeScript' 카테고리의 다른 글

[Chrome Extension] Manifest V3 가이드  (2) 2025.01.21
next.config.js 커스터마이징  (0) 2025.01.08
[React] memo를 사용한 컴포넌트 최적화  (0) 2024.12.25
[React Query] useMutation과 useQuery  (0) 2024.12.24
[React] Zustand로 배우는 간단하고 강력한 상태 관리  (0) 2024.12.20
'TypeScript' 카테고리의 다른 글
  • [Chrome Extension] Manifest V3 가이드
  • next.config.js 커스터마이징
  • [React] memo를 사용한 컴포넌트 최적화
  • [React Query] useMutation과 useQuery
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (597)
      • 상품 추천 (105)
      • MongoDB (4)
      • 하드웨어 (9)
      • 일기장 (4)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • 파이썬 (12)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (50)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    rtsp
    리뷰이관
    상품 리뷰 크롤링
    긴유통기한우유
    programming101
    믈레코비타멸균우유
    리뷰관리
    unity
    라떼우유
    codingcommunity
    programmerlife
    셀레니움
    유니티
    스크립트 실행
    카페24리뷰
    카페24리뷰이관
    파이썬
    쇼핑몰리뷰
    ipcamera
    스크립트 실행 순서
    스마트스토어리뷰
    learntocode
    C#
    리스트
    appdevelopment
    codingtips
    list
    devlife
    Python
    cv2
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
[React] React.lazy와 Suspense
상단으로

티스토리툴바