UseMemo&UseCallback

UseMemo, UseCallback

useMemo

ํ•จ์ˆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ๋ฐ˜ํ™˜

๐Ÿ’ฅ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์žฌํ˜ธ์ถœ ๋ฐฉ์ง€๐Ÿ’ฅ

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  • useMemo()๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์— ์˜ํ•ด ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์˜์กด ๊ด€๊ณ„ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์‹คํ–‰๋˜์–ด ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ฐ๋Š” react์—์„œ๋Š”

  • useMemo๋ฅผ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

const WordCount = ({ children= ""}) => {
    //const words = children; // ๋ Œ๋”๋ง๋งˆ๋‹ค ์„ ์–ธ๋˜์–ด useEffect๊ฐ€ ์‹คํ–‰๋จ
	const words = useMemo(() => children.split(" "), [children]);
    
    useEffect(() => {
	console.log("fresh render");
	},[words]);
    return (...);
}

useCallback

ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ๋ฐ˜ํ™˜

๐Ÿ’ฅ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์žฌ์ •์˜ ๋ฐฉ์ง€๐Ÿ’ฅ

const cachedFn = useCallback(fn, dependencies)
  • ์•„๋ž˜ ํ•จ์ˆ˜๋Š” isOpen ๋ถˆ๋ฆฌ์–ธ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„ false์ผ ๊ฒฝ์šฐ onClose()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค

  • ํ•จ์ˆ˜๋‚ด์—์„œ ํ˜ธ์ถœ๋˜๋Š” onClose()ํ•จ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด

  • ๋งค๋ฒˆ ๋ฆฌ๋ Œ๋”๋ง ์‹œ ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์žฌ์ •์˜๋ฅผ ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค

  • useCallback์€ ์˜์กด ๋ฐฐ์—ด ์ „๋‹ฌ ๋ฐ›์•„ ์˜์กด ๊ด€๊ณ„ ๋ฐฐ์—ด์— ์†ํ•˜๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค.

 const handleOpenChange = React.useCallback(
    (isOpen: boolean) => {
      if (!isOpen) {
        onClose?.();
      }
    },
    [onClose],
  );

useMemo vs useCallBack

๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•œ๋‹ค๋Š” ๊ด€์ ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์—ฌ

์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•˜๋Š” hooks์ด๋‹ค

  • useMemo๋Š” ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•œ๋‹ค.

  • useCallback์€ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•œ๋‹ค.

Last updated