번들링과 코드 스플리팅

원도훈·2024년 10월 30일
4
post-thumbnail

React 애플리케이션의 성능을 최적화하는 방법으로 번들링코드 스플리팅이 자주 언급됩니다. 이 두 가지 방법은 애플리케이션의 로딩 시간을 줄이고 사용자가 좀 더 빠른 반응성을 경험하도록 돕습니다. 이번 글에서는 번들링과 코드 스플리팅의 개념을 이해하고, React에서 이러한 기법을 어떻게 활용할 수 있는지 자세히 살펴보겠습니다.

번들링이란?

번들링(Bundling)은 여러 개의 자바스크립트, CSS, 이미지 파일 등을 하나의 파일 또는 몇 개의 파일로 병합하여 웹 애플리케이션의 전송 효율성을 높이는 과정입니다. 웹팩(Webpack)이나 롤업(Rollup)과 같은 번들러 도구가 이 역할을 합니다.

번들링을 통해 애플리케이션은 하나의 큰 파일로 패키징되며, 서버에서 브라우저로 전송되는 파일의 수를 줄임으로써 HTTP 요청 수를 줄이고 전송 효율성을 높일 수 있습니다. 특히, 복잡한 웹 애플리케이션에서는 이러한 번들링을 통해 코드가 분산되지 않고 하나로 모여 있으므로 전송 과정이 간편해집니다.

하지만, 번들링된 파일이 너무 커지면 초기 로딩 시간에 부정적인 영향을 미칠 수 있습니다. 이러한 경우, 코드 스플리팅을 통해 이 문제를 해결할 수 있습니다.

코드 스플리팅이란?

코드 스플리팅(Code Splitting)은 애플리케이션의 코드를 여러 개의 번들로 분리하여 필요할 때만 로드하도록 만드는 기술입니다. 큰 번들 파일로 인해 발생하는 초기 로딩 지연을 줄이고, 사용자가 특정 페이지나 기능을 사용할 때만 해당 코드가 로드되도록 함으로써 사용자 경험을 개선합니다.

React에서는 코드 스플리팅을 위해 React.lazyReact.Suspense를 주로 사용합니다. 이를 통해 특정 컴포넌트가 필요할 때만 로드하도록 구현하여 불필요한 자바스크립트 코드의 로딩을 방지할 수 있습니다.

React.lazy와 Suspense를 이용한 코드 스플리팅

React.lazy는 동적으로 컴포넌트를 로드하는 방법을 제공하며, Suspense는 이러한 동적 로딩이 진행되는 동안 대체 UI를 보여주는 역할을 합니다. 이를 통해 코드 스플리팅을 쉽게 구현할 수 있습니다.

import React, { Suspense } from 'react';

// Lazy-loaded component
const LazyComponent = React.lazy(() => import('./LazyComponent'));

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

export default App;

위 코드에서 React.lazy()를 사용해 LazyComponent를 지연 로딩하도록 설정했습니다. Suspense는 컴포넌트가 로딩되는 동안 fallback 속성을 이용해 로딩 메시지를 표시합니다. 이를 통해 초기 번들 크기를 줄이고, 해당 컴포넌트가 필요할 때만 로드되도록 할 수 있습니다.

React Developer Tools를 활용한 성능 최적화

React Developer Tools는 애플리케이션의 성능을 분석하고 개선할 수 있도록 돕는 도구입니다. 특히 Profiler를 이용해 컴포넌트가 얼마나 자주 렌더링되는지 확인할 수 있으며, 불필요한 렌더링을 줄이기 위해 코드 스플리팅이나 최적화 기법을 적용할 수 있습니다.

Profiler를 사용한 성능 분석

Profiler를 통해 어떤 컴포넌트가 성능을 저하시키는지 확인하고, useMemo, useCallback 등의 훅을 적용해 성능을 개선할 수 있습니다. 이러한 도구를 활용해 코드 스플리팅과 같은 기법을 적재적소에 사용하여 불필요한 코드 로드를 방지하고 효율적인 사용자 경험을 제공하는 것이 중요합니다.

Debounce와 Throttle

React 애플리케이션에서 사용자 이벤트(예: 스크롤, 검색 등)가 빈번하게 발생할 때 성능 최적화를 위해 debouncethrottle을 사용할 수 있습니다. 두 개념 모두 함수를 호출하는 빈도를 조절해 불필요한 렌더링을 줄여주는 역할을 합니다.

Debounce의 개념과 사용법

Debounce는 특정 이벤트가 여러 번 발생하더라도 일정 시간이 지나야 함수가 실행되도록 하는 방법입니다. 사용자가 입력 필드에 빠르게 여러 글자를 입력할 때, 마지막 입력이 끝난 후 일정 시간이 지나면 함수를 호출하게 할 수 있습니다. 이를 통해 API 호출 등의 리소스를 절약할 수 있습니다.

import { useCallback } from 'react';

const debounce = (func, delay) => {
  let timer;
  return (...args) => {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      func(...args);
    }, delay);
  };
};

const SearchComponent = () => {
  const handleSearch = useCallback(debounce((query) => {
    console.log('Searching for:', query);
  }, 500), []);

  return (
    <input type="text" onChange={(e) => handleSearch(e.target.value)} placeholder="Search..." />
  );
};

위 코드에서 사용된 debounce 함수는 사용자가 검색 입력을 빠르게 변경해도 마지막 입력이 끝나고 500ms 후에만 handleSearch 함수가 호출되도록 합니다.

Throttle의 개념과 사용법

Throttle은 이벤트가 여러 번 발생하더라도 일정 시간 간격마다 함수가 실행되도록 하는 방법입니다. 예를 들어, 스크롤 이벤트윈도우 크기 조절과 같은 빈번한 이벤트에서 사용됩니다. 이를 통해 이벤트가 매우 자주 발생하는 경우에도 성능을 유지할 수 있습니다.

import { useCallback } from 'react';

const throttle = (func, limit) => {
  let inThrottle;
  return (...args) => {
    if (!inThrottle) {
      func(...args);
      inThrottle = true;
      setTimeout(() => (inThrottle = false), limit);
    }
  };
};

const ScrollComponent = () => {
  const handleScroll = useCallback(throttle(() => {
    console.log('Scroll event fired');
  }, 1000), []);

  useEffect(() => {
    window.addEventListener('scroll', handleScroll);
    return () => window.removeEventListener('scroll', handleScroll);
  }, [handleScroll]);

  return <div>Scroll down to see the effect</div>;
};

위 코드에서 사용된 throttle 함수는 스크롤 이벤트가 발생할 때마다 1초에 한 번handleScroll 함수가 실행되도록 합니다.

Debounce와 Throttle의 차이점

  • Debounce는 이벤트가 끝난 후 일정 시간 동안 대기한 뒤에 함수를 실행합니다. 주로 검색 입력이나 자동 저장 같은 경우에 사용됩니다.
  • Throttle은 이벤트가 자주 발생하더라도 일정 시간 간격마다 함수를 실행합니다. 주로 스크롤이나 윈도우 크기 조절 같은 경우에 사용됩니다.

번들링과 코드 스플리팅은 리액트 애플리케이션의 성능을 최적화하는 중요한 기법입니다. 이를 통해 초기 로딩 시간을 줄이고, 사용자 경험을 개선할 수 있습니다. 또한, React.lazySuspense를 사용하여 컴포넌트를 필요할 때만 로드하도록 구현할 수 있으며, debouncethrottle을 사용해 이벤트 처리 성능을 최적화할 수 있습니다.

React Developer Tools와 같은 도구를 사용하여 애플리케이션의 성능을 분석하고 최적화 기법을 적용해 보세요. 이를 통해 사용자에게 빠르고 쾌적한 경험을 제공할 수 있습니다.

profile
개발

0개의 댓글