React

useMemo, useCallback

언젠간코딩잘함 2023. 4. 28. 19:15

useMemo

useMemo는
리액트에서 컴포넌트의 성능을 최적화하는 데 사용되는 훅이다. memo는 memoization을 뜻하는데, 이는 그대로
해석하면 '메모리에 넣기'라는 의미이며 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을
메모리에 저장함으로 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술이다.

 

 

즉, 동일한 값을 반환하는 함수를 반복적으로 호출해야 한다면 처음 값을 계산할 때 해당 값을 메모리에

저장해 필요할 때 마다 다시 계산하지 않고 메모리에서 꺼내서 재사용하는 것.

 

리액트에서 함수형 컴포넌트는 렌더링 ➡️ 컴포넌트 함수 호출 ➡️ 모든 내부 변수 초기화의 순서를 거친다.

 

function Component() {
  let value = calculate();
  return <div>{value}</div>;
}

function calculate() {
  return 10;
}

 

컴포넌트가 렌더링 될 때마다 value라는 변수가 초기화된다.

 

즉, 렌더링 될 때마다 calculate 함수가 불필요하게 재호출 된다는 것인데

만약 이 함수가 무겁고 복잡한 함수라면 매우 비효율적일 것이다.

 

useMemo 훅을 사용하면?

 

렌더링 ➡️ 컴포넌트 함수 호출 ➡️ memoize 된 함수를 재사용하는 순서를 거친다.

 

이는 calculate 함수를 반복적으로 실행할 필요가 없어 효율적이다.


useMemo의 구조

 

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

 

useMemo는 useEffect와 마찬가지로 첫 번째 인자로 콜백 함수, 두 번째 인자로 의존성 배열을 받는다.

 

의존성 배열의 값이 업데이트될 때에만 콜백 함수를 다시 호출하여 메모리에 저장된 값을 업데이트한다.

 

만약 빈 배열을 넣는다면 useEffect와 마찬가지로 마운트 될 때에만 값을 계산하고 그 이후로 계속 memoization 된 값을 꺼내와 사용한다.


useCallback

 

useCallback은
특정 함수를 새로 만들지 않고 재사용하고 싶을 때 사용한다. 메모이제이션된 함수를 반환하는 함수이다.

 

왜 useCallback을 사용해야 할까?

 

현재 하위 컴포넌트에 전달하는 콜백 함수가 inline 함수로 사용되거나,

컴포넌트 내에서 함수를 생성하고 있다면 새로운 함수가 만들어지게 된다.

 

함수를 재 선언 하는 것은 CPU, 큰 메모리를 차지하지 않지만,

한번 만든 함수를 재 사용하고, 필요할 때만 재 생성하는 것은 중요하다.

 

사실 useCallback은 useMemo와 거의 동일하다.

useMemo는 값을 재사용하고 useCallback은 함수 자체를 재사용한다.