React 성능 최적화 훅 useMemo

우리가 살펴볼 첫 번째 성능 최적화 훅은 useMemo입니다.

이 훅은 화면 재렌더링 사이에 리소스 집약적인 작업의 결과를 캐시하는 데 도움을 주며, 따라서 불필요한 복잡한 계산을 피할 수 있게 합니다. 이러한 캐싱을 메모이제이션이라고도 합니다.

작동 방식을 살펴보겠습니다. 버튼과 h3 제목이 있는 컴포넌트를 만들어 봅시다:

App.jsxreturn (
  <div>
    <h3>텍스트</h3>
    <button>클릭</button>
  </div>
);

이제 제목을 클릭하면 색상이 주황색에서 녹색으로 그리고 다시 되돌아가도록 만들어 보겠습니다. 먼저 isGreen 상태를 만들어 봅시다:

App.jsxconst [isGreen, setIsGreen] = useState(false);

제목의 style 속성에 제목 색상 변경 조건을 추가하고 클릭 핸들러를 연결하겠습니다:

App.jsx<h3 onClick={() => setIsGreen(!isGreen)}
  style={{ color: isGreen ? 'green' : 'orangered' }}
>텍스트</h3>

또한 우리 버튼을 클릭할 때마다 증가하는 어떤 값을 만들어 봅시다. 이를 위한 상태를 만들겠습니다:

App.jsxconst [num, setNum] = useState(0);

버튼 클릭 처리를 추가하겠습니다:

App.jsx<button onClick={() => setNum(num + 1)}>
  클릭 수
</button>

또한 num 값의 제곱을 반환하는 함수 square가 있다고 가정해 보겠습니다. 함수 호출의 결과는 변수 result에 기록합니다:

App.jsxconst result = square(num);

function square(num) {
  return num * num;
}

버튼 텍스트에 result를 표시해 보겠습니다:

App.jsx<button onClick={() => setNum(num + 1)}>
  클릭 수: {result}
</button>

결과적으로 다음과 같은 동작이 만들어졌습니다: 버튼을 클릭하면 num 값이 변경되고, 그 값이 제곱되며, 제목을 클릭하면 제목 색상이 변경됩니다.

우리의 컴포넌트는 매우 작고, 제목을 클릭하여 색상을 변경할 때마다 전체 컴포넌트가 다시 렌더링되고, 따라서 버튼과 연결된 계산들도 다시 수행되지만, 심지어 우리가 그 버튼을 건드리지 않았음에도 불구하고 모든 것이 빠르게 작동합니다. 만약 우리의 계산이 복잡하고 매번 모든 것을 다시 계산해야 한다면 상상해 보십시오.

함수를 약간 무겁게 만들어 보겠습니다. 이제 조금 더 오래 생각하도록 만들어 볼 것입니다. 이렇게 하면 오래 걸리는 계산을 시뮬레이션할 수 있습니다:

App.jsxfunction square(num) {
  let startTime = performance.now();
  
  while (performance.now() - startTime < 500) {
    // 아무것도 하지 않음...
  }
  
  return num * num;
}

이제 제목을 클릭해 보십시오. 함수 square의 긴 작업 시간 때문에 (그리고 우리는 버튼을 건드리지 않았습니다!) 제목 색상이 변경되기 위해 영원히 기다려야 합니다!

이때 useMemo 훅이 우리를 도와줍니다. 이를 위해, 첫 번째 매개변수로 캐시하고 싶은 값을 계산하는 함수를 전달해야 합니다. 이 함수는 순수 함수여야 하며 매개변수를 받지 않아야 합니다. 두 번째 매개변수로는 대괄호 안의 의존성 배열, 즉 함수 코드에 참여하는 모든 반응형 값들을 전달합니다. 따라서, 이제 result 안에 다음과 같은 구문을 작성하겠습니다:

App.jsxconst result = useMemo(() => square(num), [num]);

다시 제목을 클릭해 보십시오. 이제, 계산이 있는 버튼을 건드리지 않고 상태 num 값을 변경하지 않으면, 아무것도 다시 계산되지 않으며, React는 버튼에 캐시된 값을 표시하므로, 우리의 제목이 빠르게 색상을 변경합니다.

Задание 1

컴포넌트 App를 만들고 그 안에 단락을 배치하십시오. 초기값이 'react'인 상태 text를 만들고, 상태 값을 단락 텍스트로 표시하도록 하십시오. 단락을 클릭하면 텍스트 끝에 느낌표가 추가되도록 하십시오.

Задание 2

초기값이 0인 또 다른 상태 num를 만드십시오. App에 또 다른 단락을 배치하십시오. 단락을 클릭하면 num이 1씩 증가하도록 만드십시오.

Задание 3

이제 App에 num을 매개변수로 받아 그 값을 세 배로 반환하는 함수 triple를 추가하십시오. 함수 호출 결과를 변수 result에 넣으십시오. 두 번째 단락의 텍스트로 result를 표시하십시오. 단락들을 번갈아 클릭하며, 느낌표가 느리게 추가되는 것을 확인하십시오.

Задание 4

느린 함수 triple를 useMemo로 감싸서 상황을 해결하십시오.