๐Ÿ’ป Development/React

[React] Hook | useMemo

ahyeon7 2023. 3. 1. 16:30

์ปดํฌ๋„ŒํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง์ด ๋  ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ˆ๋ฌด ์žฆ์€ ๋ฆฌ๋ Œ๋”๋ง์€ ์•ฑ์— ์ข‹์ง€ ์•Š์€ ์„ฑ๋Šฅ์„ ๋ผ์นœ๋‹ค.

[๊ทธ๋ฆผ] ๋„ˆ๋ฌด ๋งŽ์€ ๋ Œ๋”๋ง์€ ์•ฑ์— ์•ˆ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฏธ์น˜๋Š” ๊ทน๋‹จ์ ์ธ ์˜ˆ

๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Hook๋„ ์กด์žฌํ•˜๋Š”๋ฐ, useCallback๊ณผ useMemo๊ฐ€ ๋ฐ”๋กœ ๊ทธ ์—ญํ• ์„ ํ•˜๋Š” Hook์ด๋‹ค.


๐Ÿ“Œ useMemo๋ž€?

  • ํŠน์ • ๊ฐ’(value)๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook
function Calculator({value}){

    const result = calculate(value);

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

ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” props๋กœ ๋„˜์–ด์˜จ value๊ฐ’์„ calculate๋ผ๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์„œ result ๊ฐ’์„ ๊ตฌํ•œ ํ›„,

์—˜๋ฆฌ๋จผํŠธ๋กœ ์ถœ๋ ฅ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ calculate๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ํ•ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๋ผ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ ์ด์ƒ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ด ํ•จ์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ ํ˜ธ์ถœํ•  ๊ฒƒ์ด๊ณ , ๊ทธ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ ์ด์ƒ ์†Œ์š”๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ด ๋ช‡ ์ดˆ์˜ ์ง€์—ฐ์€ ๋ Œ๋”๋ง์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๊ณ , ์‚ฌ์šฉ์ž๋Š” โ€œ์•ฑ์˜ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ฆฌ๋„ค?โ€๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

/* useMemo๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ผญ import ํ•˜๊ธฐ */
import { useMemo } from "react";

function Calculator({value}){

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

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

์—ฌ๊ธฐ value ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” Calculator ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค. value ๋Š” ์ผ์ข…์˜ ๊ฐ’์œผ๋กœ์„œ, ์ด ๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†๊ฒ ์ง€๋งŒ, ๋ Œ๋”๋ง์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ด value๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž. ๊ทธ๋Ÿผ ์ด ๊ฐ’์„ ์–ด๋”˜๊ฐ€์— ์ €์žฅ์„ ํ•ด๋’€๋‹ค๊ฐ€ ๋‹ค์‹œ ๊บผ๋‚ด์„œ ์“ธ ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ๊ตณ์ด calculate ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๋„ ์—†์„ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ useMemo Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

โœจ Memoization

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๊ฐœ๋…
  • ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ์„ ํ•ด๋‘๊ณ , ๋™์ผํ•œ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ์žฌํ™œ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

์ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ตณ์ด ์ค‘๋ณต ์—ฐ์‚ฐ์„ ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

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


๐Ÿ“Œ ์‹ค์Šต

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