memozation은 기존에 수행한 연산의 결괏값을 어딘가에 저장해 두고 필요할 때 재사용하는 프로그래밍 기법을 의미합니다. 이러한 기법은 중복 연산을 필할 수 있기 때문에 성능을 최적화할 수 있게 됩니다.
🚀 useMemo()란?
리액트에서 컴포넌트가 리렌더링 될 때 변화가 없는 부분도 리렌더링 된다면 자원이 낭비되고 성능에도 문제가 생기게 됩니다. 이러한 상황에서 useMemo를 사용 시 의존성 배열의 값에 아무런 변화가 없다면 이전에 연산된 값인 memorized value를 리턴하고 불필요한 연산을 없애 성능을 최적화할 수 있습니다.
useMemo 사용법
먼저 App.jsx와 components/ShowState.jsx파일을 아래와 같이
// App.js
import React, { useState } from "react";
import ShowState from "./components/ShowState";
const App = () => {
const [number, setNumber] = useState(0);
const [text, setText] = useState("");
const increaseNumber = () => {
setNumber((prevState) => prevState + 1);
};
const decreaseNumber = () => {
setNumber((prevState) => prevState - 1);
};
const onChangeTextHandler = (e) => {
setText(e.target.value);
};
return (
<div className="App" style={{ margin: "50px" }}>
<div>
<button onClick={increaseNumber}>+</button>
<button onClick={decreaseNumber}>-</button>
<input
type="text"
placeholder="Text..."
onChange={onChangeTextHandler}
/>
</div>
<ShowState number={number} text={text} />
</div>
);
};
export default App;
// components/ShowState.js
import React from "react";
const getNumber = (number) => {
console.log("숫자가 변동되었습니다.");
return number;
};
const getText = (text) => {
console.log("글자가 변동되었습니다.");
return text;
};
const ShowState = ({ number, text }) => {
const showNumber = getNumber(number);
const showText = getText(text);
return (
<div className="info-wrapper">
{showNumber} <br />
{showText}
</div>
);
};
export default ShowState;
App.jsx에서 number와 text를 ShowState 컴포넌트로 내려주고 해당 값을 출력해줍니다.
하지만 콘솔창을 보시면 숫자를 바꿨을 때는 "숫자가 변동되었습니다."만,
글자를 바꿨을 때는 "글자가 변동되었습니다."만 출력되야하는데
둘 다 출력되고 있습니다.
변경된 state에 해당하는 함수만 실행되어야 하는데 굳이 실행되지 않아도 될 함수가 실행된다는 것은 불필요한 자원을 낭비하고 있다는 것을 의미합니다.
따라서 해당 값을 연산하는 코드 쪽에 useMemo를 사용해서 불필요한 연산을 생략해보도록 하겠습니다.
useMemo 기본 형태
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useMemo를 사용해서 memoizedValue라는 memorization 될 값을 선언하고 의존성 배열에 a와 b값을 넣어 a, b의 변경 여부를 확인하며, 변경 시 computeExpensiveValue를 이용하여 연산된 값을 memoizedValue에 대입합니다.
ShowState.jsx 파일에 useMemo를 적용해보면
// components/ShowState.js
import React, { useMemo } from "react";
const getNumber = (number) => {
console.log("숫자가 변동되었습니다.");
return number;
};
const getText = (text) => {
console.log("글자가 변동되었습니다.");
return text;
};
const ShowState = ({ number, text }) => {
const showNumber = useMemo(() => getNumber(number), [number]);
const showText = useMemo(() => getText(text), [text]);
return (
<div className="info-wrapper">
{showNumber} <br />
{showText}
</div>
);
};
export default ShowState;
의도하는 대로 숫자가 변경되었을 때는 숫자에 대한 연산만, 글자가 변경되었을 때는 글자에 대한 연산만 수행하는 것을 확인할 수 있습니다.
'⚛️React' 카테고리의 다른 글
[React] React.memo를 사용한 컴포넌트 최적화(리렌더링 방지) (3) | 2022.01.07 |
---|---|
[React] 리액트 Hooks : useCallback() 함수 사용법 (0) | 2022.01.06 |
[React] 리액트 Hooks : useEffect() 함수 사용법 (4) | 2022.01.04 |
[React] 리액트 배열 항목 추가, 제거, 수정 (0) | 2021.12.29 |
[React] 리액트 배열 렌더링 하기 (map함수를 통해 반복) (0) | 2021.12.28 |