본문 바로가기

Web Dev/react.js

useCallback()을 사용하는 것은 큰 의미가 없거나 오히려 손해인 경우도 있습니다

반응형

 

useCallback 훅은 모든 경우에 성능 향상을 기대할 수 있는 것은 아닙니다. 

올바른 상황에서 사용될 때에만 성능 이점을 얻을 수 있습니다. 

아래 상황에서 useCallback을 사용하는 것이 유용할 수 있습니다: 

렌더링 최적화: 함수가 렌더링될 때마다 다시 생성되더라도, 대부분의 경우 이는 성능상 큰 문제가 되지 않습니다. 하지만 함수가 매 렌더링마다 새로 생성될 때, 자식 컴포넌트에 전달된 경우 자식 컴포넌트는 이전 함수와 다른 참조를 받게 되므로 불필요한 리렌더링이 발생할 수 있습니다. 이런 경우 useCallback을 사용하여 함수를 메모이제이션하면 불필요한 리렌더링을 방지할 수 있습니다.

 의존성 배열 사용: useCallback의 두 번째 매개변수로 의존성 배열을 전달할 수 있습니다. 이 배열은 해당 함수가 어떤 값에 의존하는지를 나타냅니다. 이 의존성 배열을 통해 함수가 의존하는 값이 변경될 때만 함수가 다시 생성됩니다. 이것은 리렌더링이 불필요한 경우 함수 재생성을 방지하고 성능을 향상시킬 수 있습니다.

 메모이제이션 필요성: 함수의 결과를 메모이제이션하고 재계산을 방지해야 하는 경우에도 useCallback이 유용합니다. 예를 들어, 복잡한 연산을 수행하는 함수의 결과를 캐시하고 재사용해야 할 때, useCallback을 사용하여 함수를 메모이제이션하면 계산 비용을 줄일 수 있습니다. 

비교 함수: useCallback은 주로 React.memo나 shouldComponentUpdate와 함께 사용되어 컴포넌트의 리렌더링을 제어할 때 유용합니다. 이 경우 함수의 참조가 변하지 않도록 보장하면서 컴포넌트가 필요한 때에만 리렌더링될 수 있습니다. 요약하면, useCallback은 함수의 메모이제이션과 의존성 배열을 통한 최적화를 위해 사용됩니다. 항상 성능 문제를 해결하는 마법같은 해결책은 아니며, 실제 상황에 따라 적절하게 사용해야 합니다. 코드베이스가 작고 단순한 경우에는 useCallback을 사용하지 않아도 렌더링 성능에 큰 영향을 미치지 않을 수 있습니다.

 


useCallback은 React에서 성능을 최적화하기 위해 사용되는 훅 중 하나입니다. 

이 훅은 함수를 메모이제이션하고, 함수가 변화하지 않는 한 동일한 함수 참조를 반환합니다. 주로 이벤트 핸들러나 prop으로 전달되는 함수와 같이 자주 변경되지 않는 함수를 최적화하는 데 사용됩니다.

다음은 useCallback을 사용하는 다양한 예시를 제공합니다:

1. 이벤트 핸들러 최적화:

React 컴포넌트에서 이벤트 핸들러를 정의할 때, 매 렌더링마다 새로운 함수가 생성되는 것을 방지하기 위해 useCallback을 사용할 수 있습니다.

 

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

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

  // 증가 함수를 useCallback을 사용해 메모이제이션
  const increment = useCallback(() => {
    setCount(count + 1);
  }, [count]);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
}


위의 코드에서 increment 함수는 count 상태에 의존하고 있으므로, count가 변경될 때만 함수가 다시 생성됩니다.

2. prop으로 전달되는 함수 최적화:

부모 컴포넌트로부터 받은 함수를 자식 컴포넌트에 prop으로 전달할 때, useCallback을 사용하여 최적화할 수 있습니다.

import React, { useCallback } from 'react';

function ChildComponent({ onClick }) {
  // prop으로 받은 onClick 함수를 useCallback을 사용해 메모이제이션
  const handleClick = useCallback(() => {
    onClick('Button clicked!');
  }, [onClick]);

  return (
    <button onClick={handleClick}>Click me</button>
  );
}

function ParentComponent() {
  const handleButtonClick = (message) => {
    alert(message);
  };

  return (
    <div>
      <ChildComponent onClick={handleButtonClick} />
    </div>
  );
}

위의 코드에서 handleClick 함수는 onClick prop에 의존하고 있으므로, onClick 함수가 변경될 때만 함수가 다시 생성됩니다.

useCallback을 사용하여 이러한 함수를 메모이제이션하면, 불필요한 렌더링을 방지하고 React 애플리케이션의 성능을 향상시킬 수 있습니다.

반응형