본문 바로가기
React

React에서 Lazy Loading 구현하기

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

 

웹 애플리케이션을 개발할 때 성능 최적화는 필수적인 고려 사항입니다. 특히 초기 로딩 시간을 줄이고 사용자 경험을 개선하기 위해 lazy loading은 매우 효과적인 방법입니다. React에서는 lazy loading을 간단하게 구현할 수 있는 다양한 방법과 도구를 제공합니다. 이번 글에서는 React에서 lazy loading의 개념, 필요성, 그리고 이를 구현하는 방법을 상세히 알아보겠습니다.


Lazy Loading이란?

Lazy loading(지연 로딩)은 사용자에게 필요한 리소스만 즉시 로드하고, 나머지 리소스는 나중에 필요할 때 로드하는 기법입니다. 이를 통해 초기 로딩 속도를 개선하고 불필요한 리소스 로드를 방지할 수 있습니다. React에서는 컴포넌트나 이미지 같은 리소스를 lazy loading으로 처리할 수 있습니다.

Lazy Loading의 장점

  1. 성능 개선: 초기 로딩 시 불필요한 리소스를 제외함으로써 애플리케이션의 초기 렌더링 속도를 높일 수 있습니다.
  2. 사용자 경험 향상: 필요한 리소스만 로드되므로 사용자가 더 빠르게 애플리케이션과 상호작용할 수 있습니다.
  3. 네트워크 효율성: 트래픽 사용량을 줄여 네트워크 비용을 절감할 수 있습니다.

React에서 Lazy Loading 구현 방법

1. React.lazy와 Suspense를 활용한 컴포넌트 지연 로딩

React는 기본적으로 제공하는 React.lazySuspense를 사용해 컴포넌트를 지연 로딩할 수 있습니다.

React.lazy

React.lazy는 동적으로 컴포넌트를 import할 수 있도록 도와주는 함수입니다. 동적으로 import된 컴포넌트는 필요할 때 로드됩니다.

Suspense

React.Suspense는 로딩 중인 상태를 처리할 수 있는 컴포넌트를 제공합니다. 로딩 중에 사용자에게 로딩 스피너와 같은 피드백을 줄 수 있습니다.

예제 코드

import React, { Suspense } from 'react';

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

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

export default App;

위 코드에서:

  • React.lazyLazyComponent를 동적으로 import합니다.
  • SuspenseLazyComponent가 로드되는 동안 "Loading..." 메시지를 표시합니다.

장점과 한계

  • 장점: 코드 스플리팅을 통해 초기 번들 크기를 줄일 수 있습니다.
  • 한계: Suspense는 현재 React 18 기준으로는 서버 사이드 렌더링(SSR)에서 완전한 지원이 어렵습니다.

2. React Router와 함께 Route 기반 Lazy Loading

React Router를 사용하면 라우트별로 컴포넌트를 lazy loading할 수 있습니다. 이를 통해 사용자가 특정 경로를 방문할 때만 해당 컴포넌트를 로드하도록 설정할 수 있습니다.

예제 코드

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>Loading...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
        </Routes>
      </Suspense>
    </Router>
  );
}

export default App;

장점

  • 사용자가 특정 페이지를 방문하기 전까지 해당 페이지의 컴포넌트를 로드하지 않으므로 성능 최적화에 효과적입니다.

3. 이미지 Lazy Loading

이미지는 웹 애플리케이션에서 많은 데이터를 차지하기 때문에, lazy loading을 통해 네트워크 비용을 줄이고 사용자 경험을 향상시킬 수 있습니다.

HTML 속성을 활용한 방법

HTML5의 loading="lazy" 속성을 사용하면 간단히 이미지 lazy loading을 구현할 수 있습니다.

<img src="example.jpg" alt="Example" loading="lazy" />

React에서 Intersection Observer API를 활용한 방법

Intersection Observer를 사용하면 더 세밀하게 이미지 로딩을 제어할 수 있습니다.

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

function LazyImage({ src, alt }) {
  const [isVisible, setIsVisible] = useState(false);
  const imgRef = React.useRef();

  useEffect(() => {
    const observer = new IntersectionObserver(
      ([entry]) => {
        if (entry.isIntersecting) {
          setIsVisible(true);
          observer.disconnect();
        }
      },
      { threshold: 0.1 }
    );

    if (imgRef.current) {
      observer.observe(imgRef.current);
    }

    return () => observer.disconnect();
  }, []);

  return (
    <img
      ref={imgRef}
      src={isVisible ? src : ''}
      alt={alt}
      style={{ minHeight: '200px', backgroundColor: '#ccc' }}
    />
  );
}

export default LazyImage;

Lazy Loading 적용 시 유의사항

  1. 사용자 경험: 로딩 상태를 명확히 전달하기 위해 로딩 스피너나 플레이스홀더를 적절히 활용해야 합니다.
  2. SSR 호환성: 서버 사이드 렌더링(SSR)을 사용하는 경우, React.lazySuspense는 일부 제한이 있으므로 loadable-components 같은 라이브러리를 사용하는 것이 좋습니다.
  3. 성능 테스트: lazy loading을 적용한 후 Lighthouse나 WebPageTest를 통해 성능 개선 여부를 확인하세요.
  4. 번들 크기 관리: 동적으로 로드되는 컴포넌트가 중복 로드되지 않도록 주의하세요.

결론

React에서 lazy loading은 성능 최적화와 사용자 경험 개선을 위한 강력한 도구입니다. React.lazySuspense, React Router, Intersection Observer 등 다양한 기법을 적절히 활용하면 효율적인 애플리케이션을 구축할 수 있습니다. 위에서 설명한 방법들을 프로젝트에 적용하여 초기 로딩 시간을 줄이고 더 나은 사용자 경험을 제공해 보세요.

반응형

'React' 카테고리의 다른 글

React에서 Suspense 사용법  (0) 2024.12.12
React에서 Error Boundary 사용법  (0) 2024.12.12
React에서 Dynamic Import 사용하기  (0) 2024.12.12
React에서 코드 분할하기  (0) 2024.12.12
React에서 상태와 렌더링 최적화하기  (0) 2024.12.12