๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ

[React] ๋˜‘๋˜‘ํ•˜๊ฒŒ useMemo ์‚ฌ์šฉํ•˜๊ธฐ

db2 2022. 10. 9. 23:09

์ฐธ์กฐ(์ด๋ฏธ์ง€ ํฌํ•จ): When to useCallback & useMemo hooks ?

์ด ๊ธ€์€ [React] ๋˜‘๋˜‘ํ•˜๊ฒŒ useCallback ์‚ฌ์šฉํ•˜๊ธฐ์—์„œ ์ด์–ด์ง€๋Š” ๊ธ€์ด๋‹ค.
๋ฆฌ์•กํŠธ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์™€ useCallback ํ›…์„ ์‚ฌ์šฉํ•ด ์ตœ์ ํ™” ํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ์œ„ ๊ธ€์„ ๋จผ์ € ๋ณด๊ณ  ์˜ค๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค!

useMemo๋ž€

useMemo๋Š” ์žฌ์‚ฌ์šฉ๋œ(memoized) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›…์ด๋‹ค. ์ด ํ›…์€ ๋ฐ์ดํ„ฐ์˜ ๋งŽ์€ ๊ฐ€๊ณต์ด ํ•„์š”ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ๊ณ„์‚ฐ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋‚˜ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๋กœ์ง์„ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ด์— ํ•ด๋‹น๋œ๋‹ค.

๋จผ์ € ์ด ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ฒซ ๋ Œ๋” ๋•Œ ์‹คํ–‰๋˜๊ณ , ์ดํ›„ ๋ฆฌ๋ Œ๋”๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ๋ณด์—ฌ์ค€๋‹ค. ๋งค๋ฒˆ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

์–ธ์ œ useMemo๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

๋จผ์ € useMemo๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์€ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

import React, { useState } from "react";

export default function App() {
  const [immutableNum, setImmutableNum] = useState(0);
  const [count, setCount] = useState(0);

  const increase = () => {
    console.log("Click Add button!");
    setCount(count + 10);
  };
  const caculateComplexValue = () => {
    console.log("I am doing complex calculation...๐Ÿ’ค");
    return (immutableNum + 2 * 2 * 99999 * 999999) / 0.213213213;
  };

  return (
    <div className="App">
      <p>count: {count}</p>
      <button onClick={increase}>Add</button>
      <p>Complex Value: {caculateComplexValue()}</p>
    </div>
  );
}

Add ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด count์˜ ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๊ณ , App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋˜๋ฉด์„œ Complex Value์— ํ•ด๋‹น๋˜๋Š” DOM์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด caculateComplexValue ํ•จ์ˆ˜๊ฐ€ ์žฌ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ Add ๋ฒ„ํŠผ์„ 2๋ฒˆ ํด๋ฆญํ•ด์„œ count๊ฐ€ 0์—์„œ 20์œผ๋กœ ์ฆ๊ฐ€ํ–ˆ์„ ๋•Œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค caculateComplexValue ํ•จ์ˆ˜๋„ ํ•จ๊ป˜ ์‹คํ–‰๋˜์–ด ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๊ณ  ์žˆ๋‹ค.

caculateComplexValue ํ•จ์ˆ˜๊ฐ€ ๊ณ„์‚ฐ์— ํ•„์š”ํ•œ ๊ฐ’์€ immutableNum์œผ๋กœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฐ’์ด๋‹ค. ์ฆ‰, ํ˜„์žฌ Complex Value๋Š” ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†๋Š” ๊ฐ’์ž„์—๋„ ๋งค๋ฒˆ caculateComplexValue ํ•จ์ˆ˜๊ฐ€ ์žฌ์‹คํ–‰๋˜์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿด ๋•Œ useMemo ํ›…์„ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

useMemo ์‚ฌ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ

import React, { useState, useMemo } from "react";

export default function App() {
  const [immutableNum, setImmutableNum] = useState(0);
  const [count, setCount] = useState(0);

  const increase = () => {
    console.log("Click Add button!");
    setCount(count + 10);
  };
  const caculateComplexValue = useMemo(() => {
    console.log("I am doing complex calculation...๐Ÿ’ค");
    return (immutableNum + 2 * 2 * 99999 * 999999) / 0.213213213;
  }, [immutableNum]); // 1๏ธโƒฃ

  return (
    <div className="App">
      <p>count: {count}</p>
      <button onClick={increase}>Add</button>
      <p>Complex Value: {caculateComplexValue}</p> {/* 2๏ธโƒฃ */}
    </div>
  );
}

useMemo ํ›…์œผ๋กœ ๊ฐ์‹ธ๋ฉด์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ immutableNum์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค(1๏ธโƒฃ). ๋”ฐ๋ผ์„œ ์ด์ œ caculateComplexValue์˜ ๋‚ด๋ถ€ ๊ณ„์‚ฐ ๋กœ์ง์€ immutableNum์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋” ๋˜์–ด๋„ ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ์ด์ „์— ๊ณ„์‚ฐํ–ˆ๋˜ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

๋”์ด์ƒ caculateComplexValue ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ์ง€ ์•Š๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์œ ์˜ํ•  ๊ฒƒ์€ caculateComplexValue๊ฐ€ ๋”์ด์ƒ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋“ค๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ์ ์ด๋‹ค. useMemo ํ›…์•ˆ์—์„œ ์ต๋ช…์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฏธ ๋‚ด๋ถ€ ๋กœ์ง์„ ์‹คํ–‰ํ•œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ JSX ์•ˆ์—์„œ ์ด์ „์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐ(2๏ธโƒฃ)ํ•ด์•ผ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ!