useMemo는 컴포넌트를 최적화 시키는 hook중 하나

기존에 수행한 연산의 결과값을 저장하고 동일한 입력이 들어오면 재사용 하는 기법

필요 상황(1) - 극단적인 반복문

const hardCalculator = (num) => {
    console.log('어려운 계산');
    for(let i = 0; i < 1999999999; i++){

        // blank
    }
    return num + 10000;
}

function App() {

const [hardNumber, setHardNumber] = useState(0);
const hardSum = hardCalculator(hardNumber);     

console.log(hardSum);
return(
	// 컴포넌트 생성
)}

해당 예시의 함수에서는 한번 렌더링을 하기 위해서 수많은 반복문을 돌게 된다.

필요 상황(2) - 단순한 계산과 어려운 계산

const hardCalculator = (num) => {
    console.log('어려운 계산');
    for(let i = 0; i < 1999999999; i++) {

        //blank
    }
    return num + 10000;
}

const easyCalculator = (num) => {
    console.log('쉬운 계산');
    return num + 1;
}

function App() {

    /* 시간이 얼마 걸리지 않는 연산과 관련된 state 및 지역변수와 함수를 추가한다. */
    const [hardNumber, setHardNumber] = useState(1);
    const [easyNumber, setEasyNumber] = useState(1);

    const hardSum = hardCalculator(hardNumber);
    const easySum = easyCalculator(easyNumber);
return(
	// 컴포넌트 생성
)}

해당 예시에는 시간이 얼마 걸리지 않는 연산을 수행해서 state가 바뀔 때도 다시 화면을 렌더링 하기 위해 해당 App 함수를 다시 실행

useMemo를 사용한 성능 개선

const {useState, useMemo} = React;

const hardCalculator = (num) => {
    console.log('어려운 계산');
    for(let i = 0; i < 1999999999; i++) {
        //blank
    }
    return num + 10000;
}

const easyCalculator = (num) => {
    console.log('쉬운 계산');
    return num + 1;
}

function App() {

    const [hardNumber, setHardNumber] = useState(1);
    const [easyNumber, setEasyNumber] = useState(1);

    const hardSum = useMemo(() => {
        return hardCalculator(hardNumber);
    }, [hardNumber]);

    const easySum = useMemo(() => {
        return easyCalculator(easyNumber);
    }, [easyNumber]);
   
    return (
//컴포넌트 생성
)}

간단한 작업을 할 때도 시간이 오래 걸리는 작업까지 함께 수행하기에는 너무 비효율적이기 때문에 어려운 연산을 통해 나온 값을 메모리 상에 저장(캐싱)해 두고, 그 값이 변경되지 않을 때는 다시 렌더링(연산)되지 않도록 한다.

단, 어려운 계산만 useMemo를 사용한다면, 어려운 계산을 연산 처리 할 때 쉬운 연산도 같이 돌아가므로 state를 관리하는 각각 useMemo 설정을 하는 것이 좋다.