본문 바로가기
React

React에서 Dynamic Import 사용하기

by 굿센스굿 2024. 12. 12.
반응형

 

React 프로젝트를 개발하다 보면 코드 분할(Code Splitting)이 필수적인 경우가 있습니다. 특히 대규모 애플리케이션에서는 성능 최적화와 사용자 경험 향상을 위해 초기 로딩 시간을 줄이는 것이 중요한데, 이를 위해 React는 Dynamic Import라는 강력한 기능을 제공합니다. 이번 글에서는 Dynamic Import가 무엇인지, 왜 사용하는지, 그리고 실제로 어떻게 활용할 수 있는지 단계별로 알아보겠습니다.


1. Dynamic Import란 무엇인가?

Dynamic Import는 JavaScript의 ES2020 문법으로, import를 동적으로 사용할 수 있는 방법입니다. 정적 import와 달리 코드 실행 중 특정 조건에 따라 모듈을 불러올 수 있어 효율적인 코드 분할이 가능합니다. React와 Webpack 같은 번들러가 결합되면 이 Dynamic Import를 통해 애플리케이션의 성능을 최적화할 수 있습니다.

예를 들어, 사용자가 특정 페이지에 도달했을 때만 관련 컴포넌트를 로드하여 초기 번들 크기를 줄이고, 필요할 때만 자원을 로드할 수 있습니다.

Static Import vs. Dynamic Import

  • Static Import
    • 컴파일 시 모든 코드가 번들에 포함됩니다.
    • 런타임 중 추가로 로드되지 않습니다.
  • import MyComponent from './MyComponent';
  • Dynamic Import
    • 런타임에서 조건에 따라 로드됩니다.
    • 필요한 순간에만 네트워크 요청이 발생합니다.
  • const MyComponent = React.lazy(() => import('./MyComponent'));

2. Dynamic Import를 사용하는 이유

(1) 초기 로딩 시간 단축

React 앱의 크기가 커질수록 초기 로딩 시간이 증가합니다. Dynamic Import를 사용하면 초기 로딩 시 꼭 필요한 코드만 로드하고, 나머지는 사용자 인터랙션에 따라 비동기로 로드할 수 있습니다.

(2) 효율적인 리소스 관리

Dynamic Import는 필요한 리소스를 필요한 시점에만 가져오기 때문에 불필요한 네트워크 트래픽과 브라우저 메모리 사용을 줄일 수 있습니다.

(3) 페이지 전환 속도 최적화

라우팅 기반 애플리케이션에서 특정 페이지를 방문할 때만 해당 페이지의 리소스를 로드하면 페이지 전환이 훨씬 부드러워집니다.


3. React에서 Dynamic Import 구현하기

React에서 Dynamic Import를 구현하기 위해 주로 사용하는 방식은 React.lazy와 Suspense를 활용하는 것입니다. 다음은 이를 단계별로 살펴봅니다.

(1) 기본 예제

다음 코드는 React.lazy를 사용해 컴포넌트를 동적으로 로드하는 기본 예제입니다.

import React, { Suspense } from 'react';

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

function App() {
  return (
    <div>
      <h1>Dynamic Import 예제</h1>
      <Suspense fallback={<div>로딩 중...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

export default App;

코드 설명

  1. React.lazy는 동적으로 컴포넌트를 가져오기 위한 함수입니다.
  2. Suspense는 로드 중인 상태를 처리하는 동안 보여줄 fallback 컴포넌트를 정의합니다.
  3. 동적으로 로드된 LazyComponent는 사용자가 페이지를 방문하거나 특정 액션을 취할 때 로드됩니다.

(2) Dynamic Import와 조건부 렌더링

조건에 따라 컴포넌트를 동적으로 로드할 수도 있습니다.

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

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

function App() {
  const [showComponentA, setShowComponentA] = useState(true);

  return (
    <div>
      <button onClick={() => setShowComponentA((prev) => !prev)}>
        {showComponentA ? 'Component B 보기' : 'Component A 보기'}
      </button>
      <Suspense fallback={<div>로딩 중...</div>}>
        {showComponentA ? <ComponentA /> : <ComponentB />}
      </Suspense>
    </div>
  );
}

export default App;

4. Dynamic Import의 주의점

Dynamic Import는 매우 유용하지만 몇 가지 주의해야 할 사항이 있습니다.

(1) Fallback 컴포넌트 제공 필수

React.lazy는 비동기로 동작하기 때문에 로딩 중 상태를 처리하지 않으면 사용자 경험이 떨어질 수 있습니다. 반드시 Suspense의 fallback 속성을 설정하세요.

(2) SSR에서 사용 제한

서버 사이드 렌더링(SSR) 환경에서는 React.lazy와 Suspense가 기본적으로 작동하지 않습니다. SSR에서 Dynamic Import를 사용하려면 loadable-components와 같은 라이브러리를 활용하세요.

(3) 네트워크 요청 최적화

Dynamic Import로 파일이 너무 많이 분리되면 브라우저가 너무 많은 네트워크 요청을 처리해야 합니다. 이를 해결하기 위해 Code Splitting 전략을 세워야 합니다.


5. Dynamic Import와 Code Splitting의 결합

Dynamic Import는 Webpack의 Code Splitting 기능과 결합하면 더욱 강력한 성능 최적화를 제공합니다. 예를 들어, React Router와 함께 라우트 단위로 코드 분할을 구현할 수 있습니다.

React Router와 Dynamic Import

다음 코드는 React Router를 사용한 Dynamic Import 예제입니다.

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

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

function App() {
  return (
    <Router>
      <Suspense fallback={<div>로딩 중...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
        </Routes>
      </Suspense>
    </Router>
  );
}

export default App;

결론

Dynamic Import는 React 애플리케이션의 성능을 최적화하는 데 매우 중요한 도구입니다. 특히 초기 로딩 시간을 줄이고, 사용자 인터랙션에 따라 필요한 자원을 비동기로 로드할 수 있다는 점에서 대규모 프로젝트에서 필수적으로 고려해야 할 기술입니다.

하지만 이 기능을 과도하게 사용하거나, 적절한 전략 없이 도입하면 성능 이점이 상쇄될 수 있으므로 주의해야 합니다. 이번 글을 통해 Dynamic Import의 개념과 구현 방법을 익히고, 여러분의 프로젝트에 효율적으로 적용해 보세요!

반응형