React.js Lazy Loading: 코드 스플리팅으로 성능 향상하기

작성일 :

React.js Lazy Loading: 코드 스플리팅으로 성능 향상하기

현대 웹 애플리케이션은 점점 더 복잡하고 기능이 많아지면서 초기 로딩 시간과 성능 최적화가 큰 이슈로 떠오르고 있습니다. React.js를 사용해 대규모 애플리케이션을 개발할 때, 이슈를 해결할 수 있는 중요한 기술 중 하나가 바로 Lazy Loading과 코드 스플리팅입니다. 이 글에서는 Lazy Loading이 무엇인지, 그리고 React.js에서 이를 어떻게 구현할 수 있는지에 대해 다룰 것입니다.

Lazy Loading의 개념

Lazy Loading(지연 로딩)은 필요한 리소스를 사용할 때 불러오는 방법을 의미합니다. 페이지가 처음 로드될 때 모든 리소스를 한꺼번에 불러오는 것이 아니라, 실제로 사용자가 해당 리소스를 필요로 할 때 동적으로 불러옵니다. 이는 초기 로딩 시간을 단축시키고, 불필요한 리소스 로딩으로 인한 메모리 사용을 줄일 수 있는 장점이 있습니다.

예를 들어, 사용자가 메인 페이지에 들어왔을 때 모든 페이지의 콘텐츠를 한 번에 다 불러오는 대신, 실제로 사용자가 특정 링크를 클릭해 추가 페이지로 이동할 때 그 페이지의 데이터를 불러오는 방식입니다. 이런 식으로 불필요한 자원을 줄이고 성능을 최적화할 수 있습니다.

React에서 Lazy Loading 구현하기

React.js에서 Lazy Loading을 구현하기 위해서는 React.lazySuspense를 사용할 수 있습니다. 이 두 기능을 합쳐서 사용하면 매우 강력한 Lazy Loading 기능을 구현할 수 있습니다. 예시 코드를 통해 더 자세히 살펴보겠습니다.

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

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

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

export default App;

이 코드에서 LazyComponent는 필요할 때만 로드됩니다. lazy 함수는 동적으로 컴포넌트를 불러오는 데 사용되고, Suspense 컴포넌트는 Lazy Loading이 완료될 때까지 기다리며 로딩 상태를 보여줍니다. fallback 속성은 로딩 중에 보여줄 컴포넌트를 지정할 수 있습니다.

코드 스플리팅

코드 스플리팅은 애플리케이션의 코드를 여러 개의 청크로 나누어 필요할 때만 불러오는 방법입니다. 이는 Lazy Loading과 밀접하게 관련되어 있으며, 대규모 애플리케이션에서 특히 유용합니다. 코드 스플리팅을 통해 초기 로딩 시간을 줄이고, 사용자 경험을 개선할 수 있습니다.

Webpack과 코드 스플리팅

React 애플리케이션에서 코드를 스플릿하려면 Webpack과 같은 모듈 번들러를 사용할 수 있습니다. Webpack은 프로젝트를 청크로 나누어 동적으로 로드할 수 있도록 도와줍니다. Webpack을 활용한 코드 스플리팅의 기본적인 설정은 아래와 같습니다.

  1. Entry Points 설정: 코드를 어떻게 청크로 나눌지 결정합니다.
javascript
module.exports = {
  entry: './src/index.js',
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  optimization: {
    splitChunks: {
      chunks: 'all',
    }
  }
};
  1. Dynamic Imports: 동적 import를 사용하여 필요한 시점에 모듈을 로드합니다.
javascript
// Before
import { add } from './math';

console.log(add(2, 3));

// After
import('path/to/module').then(module => {
  module.default(); // or module.namedExport();
});

위의 예시는 코드 스플리팅을 통해 필요한 모듈만 동적으로 로드되도록 만드는 방법을 보여줍니다. 이를 통해 불필요한 코드 로딩을 방지하고, 성능을 최적화할 수 있습니다.

React Router와 코드 스플리팅

React Router를 사용하여 라우트 단위로 코드 스플리팅을 할 수도 있습니다. 보통 라우트를 변경할 때마다 필요한 컴포넌트를 동적으로 로드하는 방법입니다. 예제를 통해 살펴보겠습니다.

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

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

function App() {
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Switch>
          <Route path="/home" component={Home} />
          <Route path="/about" component={About} />
        </Switch>
      </Suspense>
    </Router>
  );
}

export default App

이 예시에서는 HomeAbout 컴포넌트를 동적으로 불러옵니다. 사용자가 특정 라우트로 이동하면 그때 해당 컴포넌트를 동적으로 로드합니다. 이로 인해 초기 로딩 시간을 줄일 수 있고, 앱의 성능을 크게 향상시킬 수 있습니다.

결론

React.js에서 Lazy Loading과 코드 스플리팅은 성능 최적화의 핵심 기술 중 하나입니다. 이 두 가지 기술을 적절히 활용하면 초기 로딩 시간을 단축시키고, 전체적인 사용자 경험을 개선할 수 있습니다. React.lazySuspense를 사용한 Lazy Loading, 그리고 Webpack을 이용한 코드 스플리팅 방법을 통해 React 애플리케이션의 성능을 높이는 방법을 이해하고, 실제 프로젝트에 적용해 보세요.