React Hooks 중 하나인 useMemo
함수를 왜, 언제, 어떻게 써야하는지 알아보겠습니다.
*useMemo
함수에 대해서 알아보기 전에 알고리즘 시간에 자주 나오는 메모이제이션(memoization) 개념에 대해서 잠깐 짚고 넘어가겠습니다. memoization 이란 기존에 수행한 연산의 결과값을 어딘가에 저장해두고 동일한 입력이 들어오면 재활용하는 프로그래밍 기법을 말합니다. memoization을 적절히 적용하면 중복 연산을 피할 수 있기 때문에 메모리를 조금 더 쓰더라도 애플리케이션의 성능을 최적화할 수 있습니다.*
※ memoization 관련 알고리즘 접근방식 으로는 DP(다이나믹프로그래밍)
의 개념으로 사용됩니다.
일반적으로 React의 함수형 컴포넌트는 다음과 같은 구조로 작성이 됩니다.
function MyComponent(props) {
// 어떤 로직 (JavaScript)
return; /* 어떤 화면 (JSX) */
}
이렇게 작성된 컴포넌트 함수는 React 앱에서 렌더링이 일어날 때마다 호출이 됩니다. 컴포넌트 함수가 호출이 되면 그 안에 자바스크립트 로직들이 수행되고, 이를 기반으로 JSX로 마크업된 UI가 리턴되는 기본 구조를 가지고 있습니다.
React 에서 컴포넌트의 렌더링은 한 번 일어나고 끝이 아니라 수시로 계속 일어날 수 있습니다. 대표적인 예로 컴포넌트의 자신의 상태 변경(state update)이 일어날 수 있고, 아니면 부모 컴포넌트의 상태 변경이 일어나 덩달아 함께 렌더링되야 하는 경우도 있습니다. React에는 수동으로 다시 렌더링을 해주는 API도 있고, 사용자가 브라우저에서 새로고침을 할 때도 컴포넌트의 재 렌더링은 불가피 합니다.
아래 컴포넌트는 prop으로 넘어온 x
와 y
값을 compute
함수에 인자로 넘겨서 z
값을 구한 후, 그 결과값을 div 엘리먼트로 감싸 출력해줍니다.
function MyComponent({ x, y }) {
const z = compute(x, y);
return <div>{z}</div>;
}
만약에, compute
함수가 내부적으로 매우 복잡한 연산을 수행하기 때문에 결과값을 리턴하는데 시간이 몇초 이상 오래 걸린다면 어떻게 될까요? 컴포넌트의 재 렌더링 이 필요할 때 마다 이 함수가 호출이 되므로 사용자는 지속적으로 UI에서 지연이 발생하는 경험을 하게 될 것입니다.