F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

React의 useMemo와 useCallback: 차이점과 활용법

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



React의 useMemo와 useCallback 이해하기

React에서 성능 최적화를 위해 자주 사용되는 두 가지 Hook이 있습니다. 바로 useMemouseCallback입니다. 이 두 Hook은 컴포넌트의 불필요한 렌더링을 방지하고, 성능을 개선하는 데 도움을 줍니다.

useMemo는 특정 값의 계산 결과를 메모이제이션하여, 디펜던시가 변경되지 않는 한 동일한 값을 반환합니다. 반면, useCallback은 특정 함수를 메모이제이션하여, 디펜던시가 변경되지 않는 한 동일한 함수를 반환합니다.

왜냐하면 React는 컴포넌트가 렌더링될 때마다 내부에서 선언된 함수가 새로 생성되기 때문에, 이를 방지하기 위해 useCallback을 사용해야 하기 때문입니다.

이 글에서는 useMemo와 useCallback의 차이점과 사용법, 그리고 실제로 어떻게 활용할 수 있는지에 대해 알아보겠습니다.

이 두 Hook의 차이를 명확히 이해하면, React 애플리케이션의 성능을 더욱 효과적으로 최적화할 수 있습니다.



useMemo의 작동 원리와 사용법

useMemo는 특정 계산 결과를 메모이제이션하여, 디펜던시가 변경되지 않는 한 동일한 값을 반환합니다. 이는 복잡한 계산을 반복적으로 수행하지 않도록 하여 성능을 최적화하는 데 유용합니다.

예를 들어, 다음 코드를 살펴보겠습니다:

const memoizedValue = useMemo(() => {
    return computeExpensiveValue(a, b);
}, [a, b]);

위 코드에서, a와 b가 변경되지 않는 한 computeExpensiveValue 함수는 다시 호출되지 않습니다. 왜냐하면 useMemo는 디펜던시 배열을 기반으로 메모이제이션된 값을 반환하기 때문입니다.

useMemo는 특히 렌더링 비용이 높은 컴포넌트에서 유용합니다. 예를 들어, 복잡한 계산을 수행하거나, 대규모 데이터를 처리하는 경우에 사용하면 좋습니다.

하지만, 모든 경우에 useMemo를 사용하는 것은 권장되지 않습니다. 왜냐하면 메모이제이션 자체에도 비용이 발생하기 때문입니다. 따라서, 성능 최적화가 필요한 경우에만 사용하는 것이 좋습니다.



useCallback의 작동 원리와 사용법

useCallback은 특정 함수를 메모이제이션하여, 디펜던시가 변경되지 않는 한 동일한 함수를 반환합니다. 이는 자식 컴포넌트에 함수를 props로 전달할 때 유용합니다.

예를 들어, 다음 코드를 살펴보겠습니다:

const memoizedCallback = useCallback(() => {
    doSomething(a, b);
}, [a, b]);

위 코드에서, a와 b가 변경되지 않는 한 doSomething 함수는 새로 생성되지 않습니다. 왜냐하면 useCallback은 디펜던시 배열을 기반으로 메모이제이션된 함수를 반환하기 때문입니다.

useCallback은 특히 자식 컴포넌트가 React.memo로 최적화되어 있는 경우에 유용합니다. 왜냐하면 함수가 변경되지 않으면, 자식 컴포넌트가 불필요하게 렌더링되지 않기 때문입니다.

하지만, 모든 경우에 useCallback을 사용하는 것은 권장되지 않습니다. 왜냐하면 메모이제이션 자체에도 비용이 발생하기 때문입니다. 따라서, 성능 최적화가 필요한 경우에만 사용하는 것이 좋습니다.



useMemo와 useCallback의 차이점

useMemo와 useCallback은 비슷한 목적을 가지고 있지만, 사용하는 대상이 다릅니다. useMemo는 값을 메모이제이션하고, useCallback은 함수를 메모이제이션합니다.

예를 들어, 다음과 같은 차이가 있습니다:

// useMemo
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

// useCallback
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);

useMemo는 계산된 값을 반환하고, useCallback은 메모이제이션된 함수를 반환합니다. 왜냐하면 useMemo는 값의 메모이제이션에 초점을 맞추고, useCallback은 함수의 메모이제이션에 초점을 맞추기 때문입니다.

따라서, 값을 메모이제이션해야 하는 경우에는 useMemo를 사용하고, 함수를 메모이제이션해야 하는 경우에는 useCallback을 사용하는 것이 적합합니다.

이 두 Hook의 차이를 명확히 이해하면, React 애플리케이션의 성능을 더욱 효과적으로 최적화할 수 있습니다.



useMemo와 useCallback의 실제 활용 사례

useMemo와 useCallback은 다양한 상황에서 활용될 수 있습니다. 예를 들어, 다음과 같은 사례가 있습니다:

1. 복잡한 계산을 수행하는 컴포넌트에서 useMemo를 사용하여 성능을 최적화합니다.

2. 자식 컴포넌트에 함수를 props로 전달할 때 useCallback을 사용하여 불필요한 렌더링을 방지합니다.

3. React.memo와 함께 사용하여 컴포넌트의 렌더링 성능을 최적화합니다.

예를 들어, 다음 코드를 살펴보겠습니다:

const ChildComponent = React.memo(({ onClick }) => {
    console.log('ChildComponent rendered');
    return Click me;
});

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

    const handleClick = useCallback(() => {
        console.log('Button clicked');
    }, []);

    return (
        

Count: {count}

setCount(count + 1)}>Increment
); };

위 코드에서, useCallback을 사용하지 않으면 ChildComponent가 불필요하게 렌더링됩니다. 하지만, useCallback을 사용하면 ChildComponent가 불필요하게 렌더링되지 않습니다.



React 성능 최적화를 위한 useMemo와 useCallback

React에서 성능 최적화는 매우 중요합니다. 왜냐하면 성능이 낮은 애플리케이션은 사용자 경험에 부정적인 영향을 미칠 수 있기 때문입니다.

useMemo와 useCallback은 React 애플리케이션의 성능을 최적화하는 데 매우 유용한 도구입니다. 하지만, 이 두 Hook을 적절히 사용하는 것이 중요합니다.

useMemo와 useCallback을 사용할 때는 메모이제이션의 비용과 성능 최적화의 이점을 고려해야 합니다. 왜냐하면 메모이제이션 자체에도 비용이 발생하기 때문입니다.

이 글에서 소개한 내용을 바탕으로, useMemo와 useCallback을 적절히 활용하여 React 애플리케이션의 성능을 최적화해 보세요.

React의 성능 최적화는 지속적인 학습과 실험을 통해 이루어집니다. 따라서, 다양한 상황에서 useMemo와 useCallback을 사용해 보고, 그 효과를 직접 경험해 보세요.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
logo
copyright © F-Lab & Company 2025