React memorization(memo, useMemo, useCallback)

์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒฝ์šฐ๋Š” 2๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

  • props๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ

  • state๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ

์•„๋ž˜์— ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒƒ์„ console.log๋กœ ์ฐ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€๊ฐ€ ๋™์ž‘ํ•œ๋‹ค๋ฉด console.log()๋ฅผ ๋™์ž‘์‹œํ‚ฌ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.)

import { useState } from "react";
import ChildComponent from "./ChildComponent";

const ParentComponent = () => {
  const [count, setCount] = useState(0);
  const handleClick = () => {
    setCount(count + 1);
  };

  console.log("ParentComponent");

  return (
    <div>
      <button type="button" onClick={handleClick}>
        ๋ฒ„ํŠผ
      </button>
      <ChildComponent />
    </div>
  );
};

export default ParentComponent;

const ChildComponent = () => {
  console.log("ChildComponent");
  return <button onClick={null}>ํ”„๋ฆฐํŠธ</button>;
};

export default ChildComponent;

๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.

React.memo ์˜ˆ์‹œ

React.memo : props check

props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋‹ค์‹œ ํ•˜์ง€ ์•Š๋„๋ก ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜ํ•˜๋Š” Hoc(๊ณ ์ฐจํ•จ์ˆ˜)

props๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด React.memo๋ฅผ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์žฌ์—ฐ์‚ฐ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

import { memo } from "react";

const ChildComponent = () => {
  console.log("ChildComponent");
  return <button onClick={null}>ํ”„๋ฆฐํŠธ</button>;
};

export default memo(ChildComponent);

์ด๋ฒˆ์—๋Š” props๋ฅผ ์ง์ ‘ ๋„˜๊ฒจ๋ณด์ž

import { useState } from "react";
import ChildComponent from "./ChildComponent";

const ParentComponent = () => {
  const [count, setCount] = useState(0);
  const handleClick = () => {
    setCount(count + 1);
  };

  const handleLog = () => {};

  console.log("ParentComponent");

  return (
    <div>
      <button type="button" onClick={handleClick}>
        ๋ฒ„ํŠผ
      </button>
      <ChildComponent onLog={handleLog} />
    </div>
  );
};

export default ParentComponent;

import { memo } from "react";

const ChildComponent = ({ onLog }) => {
  console.log("ChildComponent");
  return <button onClick={onLog}>ํ”„๋ฆฐํŠธ</button>;
};

export default memo(ChildComponent);

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์ด ๋ถ„๋ช… props๋Š” ๊ฐ™์€ handleLog๊ฐ€ ๋“ค์–ด์™”๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด ChildComponent๊ฐ€ ์ฐํžŒ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

React ํ•จ์ˆ˜์—์„œ๋Š” ๋‚ด๋ถ€์˜ ๋กœ์ง์„ ์ˆœ์„œ๋Œ€๋กœ ์žฌ์‹คํ–‰์„ ํ•˜๊ธฐ๋•Œ๋ฌธ์— handleLog๋Š” ๋งค๋ฒˆ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ์ด ๋˜๋ฏ€๋กœ ์‚ฌ์‹ค ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ผ๊ณ  ๋ด์•ผํ•œ๋‹ค.

์žฌ์—ฐ์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด = ์ฆ‰ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋‘๊ธฐ ์œ„ํ•ด

useMemo, useCallback + React.memo ์˜ˆ์‹œ

React.useMemo vs React.useCallback : state check

์œ„ ๋‘๊ฐœ์˜ hook์„ ์“ด๋‹ค useMemo๋Š” ๊ฐ’, useCallback์€ ํ•จ์ˆ˜๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” handleLog๋Š” ํ•จ์ˆ˜์ด๊ธฐ๋•Œ๋ฌธ์— useCallback์œผ๋กœ ๊ฐ์‹ธ์ค€๋‹ค.

import { useCallback, useState } from "react";
import ChildComponent from "./ChildComponent";

const ParentComponent = () => {
  const [count, setCount] = useState(0);
  const handleClick = () => {
    setCount(count + 1);
  };

  const handleLog = useCallback(() => {}, []);

  console.log("ParentComponent");

  return (
    <div>
      <button type="button" onClick={handleClick}>
        ๋ฒ„ํŠผ
      </button>
      <ChildComponent onLog={handleLog} />
    </div>
  );
};

๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜ํ•˜๋ฉด ์ข‹์€๊ฐ€?

๊ฒฐ๋ก ์€ ๊ทธ๋ ‡์ง€๋Š” ์•Š๋‹ค.

๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜ ์ž์ฒด๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์“ฐ๋Š” ํ–‰์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ Œ๋”๋ง์„ ๊ฐœ์„ ํ•  ๊ฒฝ์šฐ์—๋งŒ ์“ฐ๋„๋ก ํ•˜์ž!

Last updated