ReactJS에서 프로파일러 컴포넌트 정리

ReactJS에서 프로파일러 컴포넌트 정리
Cozy CodingPosted On Aug 21, 20245 min read

리액트 애플리케이션이 복잡해질수록 성능을 유지하는 것은 점점 어려워집니다. 리액트 내장 Profiler 컴포넌트는 개발자가 컴포넌트가 얼마나 자주 렌더링되는지 및 렌더링 소요 시간을 측정하여 응용 프로그램의 성능을 모니터링하고 최적화하는 데 도움이 되는 강력한 도구입니다. 이 글에서는 실제 예제를 통해 프로저 컴포넌트를 자세히 살펴보고, 여러분의 프로젝트에서 이 기능을 최대한 활용할 수 있도록 도와드리겠습니다.

프로저 컴포넌트란 무엇인가요?

리액트의 프로퍼 컴포넌트는 리액트 컴포넌트의 렌더링 성능을 측정할 수 있도록 개발자가 사용할 수 있는 내장 도구입니다. 컴포넌트를 프로퍼로 래핑함으로써 시간 정보를 캡처할 수 있어, 어떤 컴포넌트가 자주 다시 렌더링되는지, 성능 병목 현상을 일으킬 수 있는 컴포넌트는 무엇인지 식별하는 데 도움이 됩니다.

프로퍼가 어떻게 작동하나요?

프로파일러 컴포넌트는 두 가지 주요 props를 가지고 있어요:

  • id: 프로파일러 컴포넌트의 문자열 식별자입니다. 애플리케이션에서 여러 프로파일러를 구별하는 데 도움이 됩니다.
  • onRender: 프로파일러로 래핑된 컴포넌트가 다시 렌더링될 때마다 호출되는 콜백 함수입니다. 이 함수는 id, 단계 (마운트 또는 업데이트), 렌더링의 실제 소요 시간 등 여러 매개변수를 받습니다.

프로파일러 컴포넌트를 사용하는 간단한 예제를 보여드릴게요:

import React, { Profiler } from 'react';

function onRenderCallback(
  id, // 방금 완료된 프로파일러 트리의 "id" prop
  phase, // 트리가 방금 마운트된 경우 "mount", 재렌더링된 경우 "update"
  actualDuration, // 완료된 업데이트의 렌더링에 소요된 시간
  baseDuration, // 메모이제이션 없이 전체 하위 트리를 렌더링하는 데 걸리는 예상 시간
  startTime, // React가 이 업데이트를 렌더링하기 시작한 시간
  commitTime, // React가 이 업데이트를 완료한 시간
  interactions // 이 업데이트에 속하는 상호 작용 집합
) {
  console.log(`Profiler ${id} - ${phase}`);
  console.log(`Actual Duration: ${actualDuration}`);
  console.log(`Base Duration: ${baseDuration}`);
}

function MyComponent() {
  return (
    <Profiler id="MyComponentProfiler" onRender={onRenderCallback}>
      <div>
        <h1>Hello, World!</h1>
        {/* 다른 컴포넌트 */}
      </div>
    </Profiler>
  );
}

export default MyComponent;

이 예시에서는 MyComponent가 렌더링될 때마다 onRenderCallback 함수가 호출되어 성능 데이터를 자세히 콘솔에 기록합니다.

프로파일러 사용의 실제 예시

1. 불필요한 다시 렌더링 식별

프로파일러의 일반적인 사용 사례 중 하나는 불필요한 다시 렌더링을 식별하는 것입니다. 예를 들어, 컴포넌트가 예상보다 더 자주 렌더링된다는 것을 알게 되면, 프로파일러를 사용하여 확인하고, React.memo를 구현하거나 shouldComponentUpdate를 사용하여 이러한 추가 렌더를 방지하는 조치를 취할 수 있습니다.

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

function ChildComponent() {
  console.log('Child component rendered');
  return <div>I'm a child component</div>;
}

const MemoizedChildComponent = React.memo(ChildComponent);

function ParentComponent() {
  const [count, setCount] = useState(0);

  const increment = () => setCount(count + 1);

  return (
    <Profiler id="ParentComponent" onRender={onRenderCallback}>
      <button onClick={increment}>Increment Count</button>
      <p>Count: {count}</p>
      <MemoizedChildComponent />
    </Profiler>
  );
}

이 시나리오에서 ChildComponent를 React.memo로 감싸면 프롭이 변경되지 않는 한 다시 렌더링 되지 않습니다. 이것은 Profiler 로그로 확인할 수 있습니다.

2. 컴포넌트 메모이제이션의 영향 측정

메모이제이션은 불필요한 다시 렌더링을 방지하기 위한 React의 일반적인 최적화 기법입니다. Profiler를 사용하여 메모이제이션이 컴포넌트에 미치는 영향을 측정하고 불필요한 렌더링을 피함으로써 얼마나 많은 시간을 절약할 수 있는지 확인할 수 있습니다.

import React, { Profiler, useState, useMemo } from 'react';

function ExpensiveComponent({ number }) {
  const result = useMemo(() => {
    let total = 0;
    for (let i = 0; i < 1000000000; i++) {
      total += i * number;
    }
    return total;
  }, [number]);

  return <div>Expensive Calculation Result: {result}</div>;
}

function App() {
  const [count, setCount] = useState(0);

  return (
    <Profiler id="ExpensiveComponentProfiler" onRender={onRenderCallback}>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <ExpensiveComponent number={count} />
    </Profiler>
  );
}

이 예제에서 ExpensiveComponent는 비용이 많이 드는 계산을 수행합니다. useMemo를 사용하고 컴포넌트를 Profiler로 감싸면 비용이 많이 드는 계산을 메모화하여 얻은 성능 향상을 추적할 수 있습니다.

3. 개발과 프로덕션에서 성능 분석

React는 개발용에는 없는 프로덕션 빌드에 최적화가 자동으로 포함됩니다. 두 환경 모두에서 Profiler 컴포넌트를 사용하여 어플리케이션의 성능을 개발 모드와 프로덕션 모드에서 비교할 수 있습니다.

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

function ExampleComponent() {
  const [text, setText] = useState('');

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

  return (
    <Profiler id="ExampleComponent" onRender={onRenderCallback}>
      <input type="text" value={text} onChange={handleChange} />
      <p>{text}</p>
    </Profiler>
  );
}

export default ExampleComponent;

ExampleComponent을 개발 및 프로덕션 환경에서 테스트하여 React의 프로덕션 최적화의 영향을 평가할 수 있습니다.

결론

Profiler 컴포넌트는 애플리케이션을 최적화하려는 React 개발자에게 귀중한 도구입니다. 렌더링 성능에 대한 통찰력을 제공하여 병목 현상, 불필요한 다시 렌더링, 메모이제이션과 같은 최적화 기술의 영향을 식별하는 데 도움을 줍니다. Profiler를 개발 작업 흐름에 통합하면 애플리케이션의 성능에 대한 이해를 향상시킬 뿐만 아니라 더 빠르고 효율적인 사용자 경험을 제공하는 데 도움이 됩니다.

만약 React 애플리케이션의 성능 최적화에 어려움을 겪고 있거나 확장 가능한 고성능 애플리케이션을 구축하는 데 전문 도움이 필요하다면, ZestGeek Solutions가 도와드릴 수 있습니다. 저희 유능한 팀은 React를 비롯한 최신 기술에 전문화되어 있어 프로젝트가 최고 수준의 성능과 사용자 경험을 보장하도록 도와드립니다.