React에서 `lazy`와 `Suspense`를 사용한 코드 스플리팅

발행: (2026년 1월 3일 오후 11:41 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

위에 제공된 링크 외에 번역할 텍스트가 포함되어 있지 않습니다. 번역을 원하는 본문을 그대로 복사해서 알려주시면, 원본 형식과 마크다운을 유지한 채 한국어로 번역해 드리겠습니다.

React에서 코드 스플리팅

React에서 코드 스플리팅은 실제로 필요할 때만 애플리케이션의 일부를 로드할 수 있게 해줍니다. 모든 JavaScript를 한 번에 다운로드하는 대신, 사용자가 UI와 상호작용할 때까지 덜 중요한 또는 무거운 컴포넌트의 로드를 미룰 수 있습니다. 이는 특히 규모가 큰 애플리케이션이나 사용자가 절대 보지 않을 수도 있는 컴포넌트에 유용합니다.

왜 코드 스플리팅이 중요한가

장점

  • 성능 향상 – 초기 JavaScript 번들이 작아져서 특히 느린 네트워크나 저사양 디바이스에서 페이지 로드 시간이 빨라집니다.
  • 사용자 경험 개선 – 첫 렌더링 시 필수 코드만 로드되고, 추가 코드는 사용자가 필요할 때 나중에 가져옵니다.

Source:

문제: 불필요한 네트워크 요청

React.lazySuspense를 사용하기 전에도 SlowComponent이미 네트워크 탭에 로드되어 있었습니다. 하지만:

  • 토글 버튼이 false였음
  • 사용자가 해당 컴포넌트를 열어보거나 보지 않았음

즉, 사용자가 절대 사용하지 않을 수도 있는 코드를 브라우저가 다운로드한 것입니다.

Lazy 로딩 없이 (lazy loading 이전)

SlowComponent는 페이지가 로드되는 즉시 로드됩니다:

Browser Network tab showing SlowComponent JavaScript file loaded on initial page load, even though the toggle is false

이는 낭비되는 대역폭이며 불필요한 작업입니다.

해결책: React.lazy + Suspense

React는 렌더링될 때만 컴포넌트를 로드하기 위해 lazySuspense를 제공합니다.

기본 예시

import React, { lazy, Suspense } from 'react';

const DataComponent = lazy(() => import('./DataComponent'));

function MyComponent() {
  return (
    Loading...}>
      
    
  );
}
  • DataComponent는 실제로 렌더링될 때까지 로드되지 않습니다.
  • 컴포넌트가 로드되는 동안 대체 UI가 표시됩니다.

무거운 컴포넌트를 활용한 실용 예시

이 예시에서는:

  • SlowComponent는 무겁고 사용자가 버튼을 클릭할 때만 로드되어야 합니다.
  • useTransition을 사용하여 UI가 반응성을 유지하도록 합니다.
import { useState, useTransition, lazy, Suspense } from 'react';

const SlowComponent = lazy(() => import('./SlowComponent'));

const App = () => {
  const [text, setText] = useState('');
  const [items, setItems] = useState([]);
  const [isPending, startTransition] = useTransition();
  const [show, setShow] = useState(false);

  const handleChange = (e) => {
    setText(e.target.value);

    startTransition(() => {
      const newItems = Array.from({ length: 5000 }, (_, index) => (
        
          ![](/vite.svg)
        
      ));
      setItems(newItems);
    });
  };

  return (
    
      
        
      

      
#### Items Below

      {isPending ? (
        'Loading...'
      ) : (
        
          {items}
        
      )}

       setShow(!show)} className="btn">
        Toggle
      

      {show && (
        
          
        
      )}
    
  );
};

export default App;

네트워크 탭에서 무엇이 바뀌었나요?

lazy 적용 후

SlowComponent초기 페이지 로드 시 로드되지 않습니다:

브라우저 네트워크 탭에 lazy 로딩이 적용된 후 페이지 로드 시 SlowComponent JavaScript 파일이 로드되지 않은 모습

사용자 행동에 의해서만 로드됨

컴포넌트는 사용자가 토글 버튼을 클릭할 때만 가져옵니다:

브라우저 네트워크 탭에 사용자가 토글 버튼을 클릭한 후 SlowComponent JavaScript 파일이 요청되는 모습

바로 이것이 우리가 원하는 바입니다.

Key Takeaways

  • Lazy loadingSlowComponent는 렌더링될 때까지 다운로드되지 않는다.
  • Suspense – 컴포넌트를 가져오는 동안 로딩 상태를 처리한다.
  • Better performance – 불필요한 JavaScript가 미리 로드되지 않는다.
  • User‑driven loading – 사용자가 실제로 필요로 할 때만 코드를 가져온다.

선택 사항: Suspense 로 더 많이 감싸기

앱에 여러 개의 lazy‑loaded 컴포넌트가 포함되어 있다면, Suspense 로 컴포넌트 트리의 더 큰 부분을 감쌀 수 있습니다. 많은 경우 전체 반환문을 감싸는 것이 일반적이며, 이렇게 하면 모든 lazy 컴포넌트가 동일한 로딩 폴백을 공유합니다:


  {/* one or more lazy‑loaded components */}

결론

React.lazySuspense를 사용하기 전에는 토글이 false일 때도 SlowComponent가 다운로드되어, 사용자가 보지 않을 수도 있는 코드에 대한 비용을 지불하게 되었습니다.

코드 스플리팅을 사용함으로써 우리는:

  • 초기 번들 크기 감소
  • 성능 향상
  • 실제로 필요할 때만 코드 로드

Credits: John Smilga’s course

Back to Blog

관련 글

더 보기 »