컴포넌트는 기본적으로 상태가 변경되거나 부모 컴포넌트가 렌더링이 될 때마다 리렌더링을 하는 구조로 이루어져 있다.
그러나 너무 잦은 리렌더링은 앱에 좋지 않은 성능을 끼친다.
React Hook은 함수 컴포넌트가 상태를 조작하고 및 최적화 기능을 사용할 수 있게끔 하는 메서드이다.
- 그중 렌더링 최적화를 위한 Hook도 존재한다.
- useCallback과 useMemo가 바로 그 역할을 하는 Hook이다.
useMemo란?
- useMemo은 특정 값(value)을 재사용하고자 할 때 사용하는 Hook이다.
- 다시 말해, 메모이제이션(Memoization) 개념을 이용한 Hook이다.
예를 들어 아래의 컴포넌트는 props로 넘어온 value값을 calculate라는 함수에 인자로 넘겨서 result 값을 구한 후, <div> 엘리먼트로 출력을 하고 있다.
function Calculator({value}){
const result = calculate(value);
return <div>{result}</div>;
}
만약 여기서 calculate가 계산된 값을 반환하는 데에 시간이 몇 초 이상 걸린다고 가정해 보자.
- 그렇다면 해당 컴포넌트는 렌더링을 할 때마다 이 함수를 계속해서 호출할 것이고, 그때마다 시간이 몇 초 이상 소요가 될 것이다.
- 이 몇 초의 지연은 렌더링에도 영향을 미치며, 사용자 경험에 좋지 않은 영향을 미칠 것이다.
/* useMemo를 사용하기 전에는 꼭 import해서 불러와야 한다. */
import { useMemo } from "react";
function Calculator({value}){
const result = useMemo(() => calculate(value), [value]);
return <div>{result}</div>;
}
여기서 value는 일종의 값으로서, 이 값이 계속 바뀌는 경우라면 어쩔 수 없겠지만, 렌더링을 할 때마다 이 value값이 계속 바뀌는 게 아니라고 생각해 보자.
- 그럼 이 값을 어딘가에 저장을 해뒀다가 다시 꺼내서 쓸 수만 있다면 굳이 calculate 함수를 다시 호출할 필요도 없을 것이다.
- 여기서 useMemo Hook을 사용할 수 있다.
- 이런 식으로 useMemo를 호출하여 calculate를 감싸주면, 이전에 구축된 렌더링과 새로이 구축되는 렌더링을 비교해 value값이 동일할 경우에는 이전 렌더링의 value값을 그대로 재활용할 수 있게 된다.
- 이는 메모이제이션(Memoization) 개념과 긴밀한 관계가 있다.
[Memoization] (Underbar 라이브러리의 memorize를 구현한 포스팅)
메모이제이션(Memoization)은 알고리즘에서 자주 나오는 개념으로 기존에 수행한 연산의 결과값을 메모리에 저장을 해두고, 동일한 입력이 들어오면 재활용하는 프로그래밍 기법을 말합니다.
이 메모이제이션을 적절히 사용한다면 굳이 중복 연산을 할 필요가 없기 때문에 앱의 성능을 최적화할 수 있다.
- useMemo는 바로 이 개념을 이용하여 복잡한 연산의 중복을 피하고 React 앱의 성능을 최적화시킨다.
- 직접 메모이제이션 개념을 이용하여 로직을 구현할 수도 있겠으나, useMemo Hook을 호출한다면 이런 로직을 직접 구현하는 것을 대신해 주기 때문에 훨씬 간편하다.
useMemo를 이용하여 앱 최적화하기
useMemo 사용 전
useMemo 사용 전인 최적화되지 않은 컴포넌트이다.
- 위의 컴포넌트에서 실제로 연산 로직에 영향을 주는 값은 val1과 val2이다.
- name은 연산 로직에 영향을 주지 않는다.
- 현재는 name의 상태가 변화하면 add 함수가 계속 같은 결과값을 리턴함에도 불구하고 불필요하게 계속 호출되고 있다.
- 즉, useMemo를 이용하여 add함수의 호출을 최소화해야만 한다.
- 이름을 입력할 때는 add 함수가 호출되지 않아야 최적화가 된 컴포넌트라고 볼 수 있다.
useMemo 사용 후
즉, useMemo를 이용하여 이름을 입력할 때는 add 함수가 호출되지 않는다.
728x90
'FE > React' 카테고리의 다른 글
코드 재사용을 도와주는 Custom Hooks (0) | 2023.05.22 |
---|---|
React의 렌더링 최적화를 도와주는 useCallback (0) | 2023.05.19 |
React의 Hook의 개념과 사용 규칙 (0) | 2023.05.19 |
React Diffing Algorithm - 상태변화를 감지할 수 있도록 하는 React의 비교 알고리즘 (0) | 2023.05.19 |
[React] Virtual DOM (0) | 2023.05.19 |