Front-end/React

[React] useMemo: ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋น„์žฅ์˜ ๋ฌด๊ธฐ ๐Ÿ›ก๏ธ

xeunnie 2024. 12. 8. 01:00
728x90
๋ฐ˜์‘ํ˜•

useMemo ํ†บ์•„๋ณด๊ธฐ! ๐Ÿ›ก๏ธ

 

React์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ํ•„์ˆ˜์ ์ด์ฃ . ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด React๋Š” useMemo๋ผ๋Š” ํ›Œ๋ฅญํ•œ Hook์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ useMemo์˜ ์ž‘๋™ ์›๋ฆฌ, ์‚ฌ์šฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ „ ํ™œ์šฉ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ์ƒ์„ธํžˆ ๋‹ค๋ค„๋ณผ๊ฒŒ์š”.


useMemo๋ž€? ๐Ÿค”

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

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  • computeExpensiveValue: ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ ๋กœ์ง
  • [a, b]: ์˜์กด์„ฑ ๋ฐฐ์—ด. ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ ์ˆ˜ํ–‰
  • memoizedValue: ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’

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

  • ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ: ๋ณต์žกํ•œ ์—ฐ์‚ฐ(์˜ˆ: ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง, ๋ณต์žกํ•œ ์ˆ˜ํ•™ ๊ณ„์‚ฐ ๋“ฑ)์ด ์žˆ์„ ๋•Œ
  • ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€: ๋™์ผํ•œ ๊ฐ’์ด ๊ณ„์† ๊ณ„์‚ฐ๋˜๋Š” ์ƒํ™ฉ์—์„œ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋ฆฌ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์ด ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก

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


useMemo์˜ ๋ฌธ๋ฒ• ๐Ÿ› ๏ธ

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  • useMemo์˜ ๋งค๊ฐœ๋ณ€์ˆ˜
    1. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜: ๊ณ„์‚ฐ ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
    2. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜: ์˜์กด์„ฑ ๋ฐฐ์—ด(๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์žฌ์‹คํ–‰)
  • ๋ฆฌํ„ด๊ฐ’
    • useMemo๋Š” ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ด์ „ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

useMemo ๊ธฐ๋ณธ ์˜ˆ์ œ ๐ŸŒฑ

๊ณ„์‚ฐ ๊ฒฐ๊ณผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

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

function ExpensiveCalculation({ number }) {
  const computeFactorial = (n) => {
    console.log("Calculating factorial...");
    if (n === 0) return 1;
    return n * computeFactorial(n - 1);
  };
  const factorial = useMemo(() => computeFactorial(number), [number]);

  return (
    <div>
      <h2>Factorial of {number}: {factorial}</h2>
    </div>
  );
}

export default function App() {
  const [number, setNumber] = useState(5);
  const [counter, setCounter] = useState(0);

  return (
    <div>
      <ExpensiveCalculation number={number} />
      <button onClick={() => setNumber(number + 1)}>Increment Number</button>
      <button onClick={() => setCounter(counter + 1)}>Increment Counter</button>
      <p>Counter: {counter}</p>
    </div>
  );
}

 

๊ฒฐ๊ณผ

  1. number๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ:
    • number๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด “Calculating factorial…” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ๋ถˆํ•„์š”ํ•œ ์žฌ๊ณ„์‚ฐ ๋ฐฉ์ง€:
    • counter๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ factorial์€ ์žฌ๊ณ„์‚ฐ๋˜์ง€ ์•Š์•„์š”.

์‹ค์ „ ํ™œ์šฉ ์‚ฌ๋ก€ ๐Ÿ’ผ

๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง

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

function FilteredList({ items, searchTerm }) {
  const filteredItems = useMemo(() => {
    console.log("Filtering items...");
    return items.filter((item) =>
      item.toLowerCase().includes(searchTerm.toLowerCase())
    );
  }, [items, searchTerm]);

  return (
    <ul>
      {filteredItems.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );
}

export default function App() {
  const [searchTerm, setSearchTerm] = useState("");
  const items = ["Apple", "Banana", "Cherry", "Date", "Elderberry"];
  return (
    <div>
      <input
        type="text"
        value={searchTerm}
        onChange={(e) => setSearchTerm(e.target.value)}
        placeholder="Search..."
      />
      <FilteredList items={items} searchTerm={searchTerm} />
    </div>
  );
}

 

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งŒ ํ•„ํ„ฐ๋ง ํ•จ์ˆ˜ ์‹คํ–‰
  • useMemo ์—†์ด ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์ž…๋ ฅ๊ฐ’ ๋ณ€ํ™”์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋งค๋ฒˆ ํ•„ํ„ฐ๋ง์ด ์‹คํ–‰๋์„ ๊ฒ๋‹ˆ๋‹ค.

useMemo vs React.memo ๐Ÿ—„๏ธ

๋‘˜์€ ์ข…์ข… ํ˜ผ๋™๋˜์ง€๋งŒ ๋ชฉ์ ๊ณผ ์—ญํ• ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํŠน์ง• useMemo React.memo
์—ญํ•  ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜
์‚ฌ์šฉ ๋Œ€์ƒ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ’ React ์ปดํฌ๋„ŒํŠธ
์˜์กด์„ฑ ๊ด€๋ฆฌ ์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ ํŠน์ • ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์žฌ๊ณ„์‚ฐ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€

์ฃผ์˜์‚ฌํ•ญ ๐Ÿšจ

  1. ๋ถˆํ•„์š”ํ•œ ์‚ฌ์šฉ ์ž์ œ:
    • ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ์—๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์—ฐ์‚ฐ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
  2. ์˜์กด์„ฑ ๋ฐฐ์—ด ์ •ํ™•ํžˆ ๊ด€๋ฆฌ:
    • ์˜์กด์„ฑ์„ ๋น ๋œจ๋ฆฌ๋ฉด, ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์ด ์ž˜๋ชป๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ:
    • ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ์†Œ๋น„ํ•˜๋ฏ€๋กœ, ๋‚จ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

useMemo๋กœ ๋ฐฐ์šด ๋ชจ๋“  ๊ฒƒ ์ •๋ฆฌ ๐Ÿง 

  1. ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ ๋ฐฉ์ง€:
    • ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ์‹œ ์˜์กด์„ฑ์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด์ „ ๊ฐ’์„ ์žฌ์‚ฌ์šฉ
  2. ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”:
    • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ณต์žกํ•œ ์—ฐ์‚ฐ, ๋ฌด๊ฑฐ์šด ๋กœ์ง ๋“ฑ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  3. ๋‹จ์ˆœํ•œ ์ž‘์—…์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ธฐ:
    • ๋‹จ์ˆœํ•œ ์—ฐ์‚ฐ์— ์ ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.
  4. React.memo์™€ ๋น„๊ต:
    • useMemo๋Š” ๊ณ„์‚ฐ๋œ ๊ฐ’์„, React.memo๋Š” ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

 

useMemo๋Š” ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๋ฉด React ์•ฑ์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ณณ์— ์‚ฌ์šฉํ•˜๋Š” ๋งŒ๋Šฅ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ์—์š”. ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ณณ์— ์•Œ๋งž๊ฒŒ ํ™œ์šฉํ•˜์„ธ์š”. ๊ทธ๋Ÿผ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์€ ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ๊ฑฐ์˜ˆ์š”!

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•