최적화 (1) - useMemo

jplendor·2022년 5월 28일
0

UseMemo의 필요성

  • 리렌더링시, 불필요한 연산을 다시 하지 않도록 연산의 결과를 저장한다.

UseMemo를 사용하지 않은 경우

  • count라는 state가 변경되면서 UseMemoPrac 컴포넌트가 리렌더링 된다.
  • = UseMemoPrac라는 함수가 다시 호출된다.
  • = 내부 변수가 초기화 된다.
  • = plusBigNum 함수가 호출되면서 inputSum이 계산된다.
  • count가 변경될 때마다 count와 전혀 관련없는 연산(plusBigNum 함수 호출)이 이루어진다!
import { useState } from "react";

const plusBigNum = (number) => {
    console.log("오래 걸리는 연산");
    return number + 59875153;
};

const UseMemoPrac = () => {
    const [inputValue, setInputValue] = useState(1);
    const [count, setCount] = useState(0);
    const newNum = plusBigNum(inputValue);

    return (
        <div>
            <h1>useMemo</h1>
            <h2>계산기</h2>
            <input
                type="number"
                value={inputValue}
                onChange={(e) => {
                    setInputValue(parseInt(e.target.value));
                }}
            />
            <span> + 59875153 = {newNum}</span>
            <h2>카운터</h2>
            <p>{count}</p>
            <button
                onClick={() => {
                    console.log("count 변경 (+)");
                    setCount(count + 1);
                }}
            >
                +
            </button>
            <button
                onClick={() => {
                    console.log("count 변경 (-)");
                    setCount(count - 1);
                }}
            >
                -
            </button>
        </div>
    );
};

UseMemo 사용한 경우

  • count라는 state가 변경되면서 UseMemoPrac 컴포넌트가 리렌더링될 때,
    이미 연산되어 저장된 값을 재사용하기 때문에 plusBigNum 함수를 실행하지 않는다.
  • inputValue 값이 변경될 때만 plusBigNum 함수를 실행한다.
import { useState, useMemo } from "react";

const plusBigNum = (number) => {
    console.log("오래 걸리는 연산");
    return number + 59875153;
};

const UseMemoPrac = () => {
    const [inputValue, setInputValue] = useState(1);
    const [count, setCount] = useState(0);
    const newNum = useMemo(() => {
        return plusBigNum(inputValue);
    }, [inputValue]);

    return (
        <div>
            <h1>useMemo</h1>
            <h2>계산기</h2>
            <input
                type="number"
                value={inputValue}
                onChange={(e) => {
                    setInputValue(parseInt(e.target.value));
                }}
            />
            <span> + 59875153 = {newNum}</span>
            <h2>카운터</h2>
            <p>{count}</p>
            <button
                onClick={() => {
                    console.log("count 변경 (+)");
                    setCount(count + 1);
                }}
            >
                +
            </button>
            <button
                onClick={() => {
                    console.log("count 변경 (-)");
                    setCount(count - 1);
                }}
            >
                -
            </button>
        </div>
    );
};
profile
만들기는 재밌어!

0개의 댓글