[React] React Hooks - useMemo

Hannahhhยท2022๋…„ 9์›” 28์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
24/30

๐Ÿ” useMemo


์žฆ์€ ๋ฆฌ๋ Œ๋”๋ง์€ ์•ฑ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•œ(๋ Œ๋”๋ง ์ตœ์ ํ™”) Hook์œผ๋กœ, useCallback๊ณผ useMemo๊ฐ€ ์ด์— ํ•ด๋‹น๋œ๋‹ค.



useMemo๋Š” ํŠน์ • ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook์ด๋‹ค.

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

์œ„์˜ ์˜ˆ์‹œ๋Š”useMemo์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋กœ, ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋งŒ ๋‹ค์‹œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๊ณ„์‚ฐํ•œ๋‹ค.


import { useMemo } from "react";

function Calculator({value}){

	const result = useMemo(() => calculate(value), [value]);

	return 
  <>
      <div>
      {result}
      </div>
  </>;
}

์œ„์˜ ์˜ˆ์‹œ๋Š” props๋กœ ๋ฐ›์€ value๊ฐ’์„ calculate ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์„œ result ๊ฐ’์„ ๊ตฌํ•œ ํ›„์— <div> element๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

๋งŒ์•ฝvalue๊ฐ’์ด ์ง€์†์ ์œผ๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, calculate ํ•จ์ˆ˜๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•  ํ•„์š”์—†์ด useMemo Hook์„ ์‚ฌ์šฉํ•ด calculate์„ ๊ฐ์‹ธ์ค€๋‹ค๋ฉด, ์ด์ „์˜ ๊ตฌ์ถ•๋œ ๋ Œ๋”๋ง๊ณผ ์ƒˆ๋กœ ๊ตฌ์ถ•๋˜๋Š” ๋ Œ๋”๋ง์„ ๋น„๊ตํ•ด value ๊ฐ’์ด ๋™์ผํ•  ๊ฒฝ์šฐ, ์ด์ „ ๋ Œ๋”๋ง์˜ value๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(๋ฉ”๋ชจ์ œ์ด์…˜(Memoization) ๊ฐœ๋…๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.)


โญ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)?
๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ , ๋™์ผํ•œ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ์žฌํ™œ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์œผ๋กœ, ์ค‘๋ณต ์—ฐ์‚ฐ์„ ์ค„์—ฌ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.




๐Ÿ”ฅ ์‹ค์Šต ์˜ˆ์‹œ


// css ์ƒ๋žต
import React, { useState, useMemo } from "react";
import "./styles.css";
import { add } from "./add";

export default function App() {
  const [name, setName] = useState("");
  const [val1, setVal1] = useState(0);
  const [val2, setVal2] = useState(0);
  
  // useMemo์‚ฌ์šฉํ•ด ์ตœ์ ํ™”
  const answer = useMemo(()=>add(val1, val2),[val1, val2]);
  // ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ์ฝ”๋“œ
  //const answer = add(val1, val2);

  return (
    <div>
      <input
        className="name-input"
        placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
        value={name}
        type="text"
        onChange={(e) => setName(e.target.value)}
      />
      <input
        className="value-input"
        placeholder="์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
        value={val1}
        type="number"
        onChange={(e) => setVal1(Number(e.target.value))}
      />
      <input
        className="value-input"
        placeholder="์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
        value={val2}
        type="number"
        onChange={(e) => setVal2(Number(e.target.value))}
      />
      <div>{answer}</div>
    </div>
  );
}
// add.js
export const add = (num1, num2) => {
  console.log("์ˆซ์ž๊ฐ€ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.");
  return Number(num1) + Number(num2);
};

์œ„์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‹ค์ œ๋กœ ์—ฐ์‚ฐ ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฐ’์€ val1, val2์ด๋ฏ€๋กœ, ์ด๋ฆ„ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ๋•Œ๋Š” addํ•จ์ˆ˜๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, useMemo๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ๋•Œ๋Š” add ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ์ž‘์„ฑ๋œ ์ฝ”๋“œ์ด๋‹ค.




Reference:

์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

https://ko.reactjs.org/docs/hooks-reference.html#usememo

0๊ฐœ์˜ ๋Œ“๊ธ€