• dmchoi
  • [React] useMemo

    2022년 03월 07일

    useMemo는 리액트에서 useCallback과 함께 컴포넌트 성능 최적화를 위해 사용되는 대표적인 hook입니다.

    useMemo에서 Memo는 Memoization(메모이제이션)을 뜻합니다.

    메모이제이션이란..?

    간단하게는 이전에 계산한 값을 캐싱해놨다가 필요할 때 꺼내서 사용하는 기법입니다.

    자세한 내용은 메모이제이션을 참고하세요.


    예를 들어 다음과 같은 코드가 있습니다.

    function App() {
    	const value = calculate()
    	return <div>{value}</div>
    }

    함수형 컴포넌트의 렌더링 과정은 다음과 같습니다.

    App 함수 호출 -> 모든 내부 변수 초기화

    여기서 컴포넌트가 렌더링될 때 마다 함수가 계속 호출되고 변수에 담기게 됩니다. 만약 이 함수가 무거운 작업을 하는 함수일 경우에는 이 과정이 매우 비효율적일 수 있습니다.

    useMemo를 사용하면 이러한 것을 해결할 수 있습니다.


    useMemo를 사용하게 되면 렌더링은 다음과 같은 순서로 작동합니다.

    function App() {
        const value = useMemo(() => {
            return calculate()
        })
        return <div>{value}</div>
    }

    App 함수 호출, 메모이제이션 -> 이후 컴포넌트 리렌더링 -> App 함수 호출, 메모이제이션 된 값을 재사용

    계산된 결과 값(value)을 메모리에서 가져와 재사용합니다.


    useMemo는 두 개의 인자를 받습니다.

    const value = useMemo(()=>{
    	return calculate();
    }, [item]);

    첫 번째 인자로는 Callback 함수를 받고, 두 번째 인자로 배열을 받습니다.

    첫 번째 인자인 Callback 함수는 메모이제이션할 값을 반환해주는 함수입니다.

    두 번째 인자인 배열은 의존성 배열(dependency array)이라고도 부릅니다. 배열 안의 요소가 업데이트될 때만 콜백함수를 다시 호출해서 메모이제이션 값을 업데이트합니다.

    만약 빈 배열이 들어간다면, 컴포넌트가 맨 처음 mount 될 때에만 값을 계산하고 이후에는 메모이제이션된 값을 가져와서 사용합니다.

    하지만 useMemo 남용하면 성능 악화를 불러올 수 있습니다.

    useMemo를 사용한다는 것은 값을 재활용하기 위해 메모리에 따로 저장해놓는 것을 말합니다.

    불필요한 값까지 메모이제이션하면 오히려 성능이 악화될 수 있기 때문에 정말 필요할 때만 적절하게 사용해야 합니다.

    Tags
      © 2021 dmchoi, Powered By Gatsby.