React - useMemo

Big Jay·2022년 9월 8일
0

React

목록 보기
9/10

"생성(create)"함수와 그것의 의존성 값의 배열을 전달한다. useMemo는 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산한다. 이 최적화는 모든 렌더링시 고비용 계산을 방지하게 해준다.

메모이제이션(memoization)
이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술
- 참조: 위키피디아

useMemo

함수형 컴포넌트의 렌더링은 component 함수를 호출하고 모든 내부 변수 초기화의 순서를 갖는다.

function add(){
	return 348696234 * 573248522;
}

function Component(){
  // value 변수는 렌더링 떄마다 초기화하여 add()를 매번 호출한다.
	const value = add()
}
export defalut Component;

만약 내부 변수에 복잡한 일을 처리하는 함수가 할당 되어 있다면 렌더링 할 때마다 이 일을 반복해야 하니 비효율 적이므로 이때 useMemo를 사용한다.

const value = useMemo(()=> {
	return add();
},[의존성])

예제

import { useMemo, useState } from "react";

const hardCalculate = (number) => {
  console.log("어려운 계산");
  for (let i = 0; i < 9999999999; i++) {}
  return number + 10000;
};

const easyCalculate = (number) => {
  console.log("쉬운 계산");
  return number + 1;
};

export default function App() {
  const [hardNumber, setHardNumber] = useState(1);
  const [easyNumber, setEasyNumber] = useState(1);

  const hardSum = useMemo(()=> {
    return hardCalculate(hardNumber)
  }, [hardNumber]);
  const easySum = easyCalculate(easyNumber);

  return (
    <div className="App">
      <h3>어려운 계산기</h3>
      <input
        type="number"
        value={hardNumber}
        onChange={(e) => setHardNumber(parseInt(e.target.value))}
      />
      <span> + 10000 = {hardSum}</span>
      <h3>쉬운 계산기</h3>
      <input
        type="number"
        value={easyNumber}
        onChange={(e) => setEasyNumber(parseInt(e.target.value))}
      />
      <span> + 1 = {easySum}</span>
    </div>
  );
}

object의 경우 객체타입으로 일반 원시 타입과는 다르게 값이 저장될 때 메모리 상의 주소가 다르게 저장된다. 그렇게 떄문에 값이 변경되지 않았어도 메모리 주소가 렌더링 때마다 변경된다.

부작용

너무 많이 사용할 경우 값을 재활용하기 위해 메모리를 소비해서 저장하기 떄문에 불필요한 값까지 다 저장하면 메모리 소비가 커진다.

❗️useMemo는 성능을 최적화하기 위해 사용하긴 하지만 보장되어 있는것이 아니다. React는 차 후에 이전 메모이제이션된 값들의 일부를 지우고 다음 렌더링 시에 재계산하는 방향을 채택할 수도 있다고 한다.

참고

profile
안녕하세요.

0개의 댓글