TECH

[React] useMemo์™€ useCallback๋กœ ๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ(Feat. React.memo)

ttaerrim 2022. 4. 9. 10:00

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ด์Šˆ๋ฅผ ์ ‘ํ•˜๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๊ด€ํ•œ ๋Œ€ํ‘œ์ ์ธ ํ›…์œผ๋กœ useMemo์™€ useCallback์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ useMemo์™€ useCallback์ด ๋ญ๊ฐ€ ๋‹ค๋ฅธ์ง€, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์จ์•ผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ต‰์žฅํžˆ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ์—ˆ๋Š”๋ฐ์š”~

 

์˜ค๋Š˜์€ useMemo์™€ useCallback์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์ด ๋‘˜์˜ ์‚ฌ์šฉ๋ฒ•์— ๊ด€ํ•ด์„œ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 


 

 

โœ”๏ธ useMemo

 

useMemo์—์„œ Memo์˜ ์˜๋ฏธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์ƒ๊ฐ์ด ๋‚  ๋•Œ๋งˆ๋‹ค ์ž‘์„ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ผ๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Memo๋ผ๋Š” ๊ฑด Memoization์„ ์ถ•์•ฝํ•œ Memo๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

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

 

๋ฆฌ์•กํŠธ์—์„œ๋Š” useMemo hook์„ ์‚ฌ์šฉํ•ด์„œ ์ด์ „์— ์—ฐ์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ์ˆ ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useMemo๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 

 

 

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const realRate = getComma(rate)

// useMemo ์ ์šฉ
const realRate = useMemo(() => getComma(rate), [rate])

useMemo๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ์„œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. useEffect๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ฃ ? ๋น„์Šทํ•œ ๋งฅ๋ฝ์œผ๋กœ ๋ฐฐ์—ด์— ํ•จ์ˆ˜์˜ ์˜์กด์„ฑ ๊ฐ’์„ ๋„ฃ์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

 

 

 

์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค~

 

 

 

 

 

 

๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ธํ’‹ ์ฐฝ, ์ „์†ก ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์•„๋ž˜์— ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž…๋ ฅ๋œ ๋ฆฌ์ŠคํŠธ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด ๋‚˜ํƒ€๋‚ด ์ฃผ๋Š” ๋ฌธ์žฅ๋„ ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { useState, useMemo } from "react";

export default function App() {
  const [item, setItem] = useState("");
  const [itemList, setItemList] = useState([]);
  const handleItem = (event) => {
    setItem(event.target.value);
  };
  const handleSubmit = (event) => {
    setItemList([...itemList, item]);
    event.preventDefault();
    setItem("");
  };
  const itemCount = (item) => {
    console.log("item ๊ฐœ์ˆ˜๋ฅผ ์…‰๋‹ˆ๋‹ค");
    return item.length;
  };
  const len = itemCount(itemList);
  return (
    <div className="App">
      <form onSubmit={handleSubmit}>
        <input onChange={handleItem} value={item} />
        <button type="submit">์ „์†ก</button>
      </form>
      <ol>
        {itemList.map((item, i) => (
          <ul key={i}>{item}</ul>
        ))}
      </ol>
      <p>itemList ๊ฐœ์ˆ˜๋Š” {len}๊ฐœ</p>
    </div>
  );
}

 

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ itemCount ํ•จ์ˆ˜์™€ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

 

const itemCount = (item) => {
    console.log("item ๊ฐœ์ˆ˜๋ฅผ ์…‰๋‹ˆ๋‹ค");
    return item.length;
};
const len = itemCount(itemList);

 

์ด ์ƒํƒœ๋กœ๋ผ๋ฉด ์ฝ˜์†” ์ฐฝ์— ์–ด๋–ป๊ฒŒ ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ž…๋ ฅ์ด ๋˜๊ธฐ ์ „์ด๋ผ ์ธํ’‹ ์ฐฝ์˜ value๋งŒ ๋ณ€๊ฒฝ์ด ๋˜๋Š”๋ฐ๋„ itemCount ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๊ฒฝ์šฐ์— useMemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

const len = useMemo(() => itemCount(itemList), [itemList]);

 

์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ๋ฐฉ์‹๋Œ€๋กœ useMemo๋ฅผ ์‚ฌ์šฉํ•œ ํ›„, ์ฝ˜์†” ์ฐฝ์—๋Š” itemList๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

โœ”๏ธ useCallback

useCallback์€ useMemo์™€๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ฝœ๋ฐฑ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด ๋ณด์ž๋ฉด, useMemo๋Š” ๊ฐ’์„ ์—ฐ์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด useCallback์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•จ์ˆ˜์— ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const callback = () => {
	doSomething(a, b);
}

// useCallback ์ ์šฉ ํ›„
const memoizedCallback = useCallback(() => {
    doSomething(a, b);
}, [a, b]);

์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ useCallback์œผ๋กœ ๊ฐ์‹ธ ์ฃผ๊ณ , ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์˜์กด์„ฑ ๊ฐ’๋“ค์„ ๋ฐฐ์—ด ์•ˆ์— ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

useMemo์™€ ์‚ฌ์šฉ๋ฒ•์€ ๋น„์Šทํ•˜์ฃ ?

 

 

useCallback์€ ๋ณดํ†ต ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋‚˜ API๋ฅผ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋ฆฌ์•กํŠธ ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ React.memo() ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ตœ์ ํ™”๋˜์–ด ์žˆ๊ณ , ๊ทธ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ callback ํ•จ์ˆ˜๋ฅผ props๋กœ ๋„˜๊ธธ ๋•Œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ useCallback์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ callback ํ•จ์ˆ˜๋ฅผ ์žฌ์„ ์–ธํ•œ๋‹ค๋ฉด, ๋™์ผํ•œ ํ•จ์ˆ˜์ผ์ง€๋ผ๋„ props๋กœ callback ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ ๋ฐ›๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ž…์žฅ์—์„œ๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ์ธ์‹ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. React.memo๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ๊ฐ์‹ผ๋‹ค๋ฉด ๋„˜๊ฒจ ๋ฐ›๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ด์ „์— ๋ Œ๋”๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”.

 

 

 

useCallback์˜ ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•๋„ ์˜ˆ์‹œ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค!

 

 

์œ„์—์„œ useMemo์˜ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ๋˜ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‘์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ itemList์˜ ์ถœ๋ ฅ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ItemList ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด ๋†“์•˜์–ด์š”.

 

 

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

 

์ด ๋ถ€๋ถ„์„ React.memo์™€ useCallback์„ ์‚ฌ์šฉํ•ด์„œ ์ตœ์ ํ™”ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

 

 

 

// App.js

import { useState, useMemo } from "react";
import ItemList from "./ItemList";

export default function App() {
  const [item, setItem] = useState("");
  const [itemList, setItemList] = useState([]);
  const handleItem = (event) => {
    setItem(event.target.value);
  };

  const handleSubmit = (event) => {
    setItemList([...itemList, item]);
    event.preventDefault();
    setItem("");
  };
  const itemCount = (item) => {
    console.log("item ๊ฐœ์ˆ˜๋ฅผ ์…‰๋‹ˆ๋‹ค");
    return item.length;
  };
  const len = useMemo(() => itemCount(itemList), [itemList]);
  const modifyItem = (e) => {
    if (e.target.style.color !== "red") {
      e.target.style.color = "red";
    } else {
      e.target.style.color = "black";
    }
  };
  return (
    <div className="App">
      <form onSubmit={handleSubmit}>
        <input onChange={handleItem} value={item} />
        <button type="submit">์ „์†ก</button>
      </form>
      <ItemList items={itemList} modifyItem={modifyItem} />
      <p>itemList ๊ฐœ์ˆ˜๋Š” {len}๊ฐœ</p>
    </div>
  );
}

ItemList์˜ li๋“ค์„ ํด๋ฆญํ•˜๋ฉด ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก modifyItem์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ItemList์—๊ฒŒ ์ „๋‹ฌํ•ด ์ฃผ๋„๋ก ํ• ๊ฒŒ์š”.

 

// ItemList.js

import React from "react";

function ItemList({ items, modifyItem }) {
  return (
    <div>
      <ol>
        {items.map((item, i) => (
          <ul key={i}>
            <p onClick={modifyItem}>{item}</p>
          </ul>
        ))}
      </ol>
    </div>
  );
}

export default React.memo(ItemList);

ItemList์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ React.memo์˜ ์‚ฌ์šฉ๋ฒ•์€ ์œ„ ์ฝ”๋“œ์—์„œ์ฒ˜๋Ÿผ export ํ•ด ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

  const modifyItem = useCallback((e) => {
    if (e.target.style.color !== "red") {
      e.target.style.color = "red";
    } else {
      e.target.style.color = "black";
    }
  }, []);

useCallback์˜ ์‚ฌ์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋ฅผ useCallback์œผ๋กœ ๊ฐ์‹ธ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

useMemo์—์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•ด ์ค€ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์ด useCallback์—์„œ๋„ ์‚ฌ์šฉํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

์˜ˆ์‹œ์—์„œ๋Š” ์ด๋ฒคํŠธ์— ์˜์กด๋œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๊ฐ’์„ ๋”ฐ๋กœ ๋„ฃ์ง€ ์•Š์•˜๋Š”๋ฐ์š”. ์•ˆ์—์„œ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์˜์กดํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

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

 

 

 


 

 

 

 

๊ฐœ์ธ์ ์œผ๋กœ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ ธ๋˜ useMemo์™€ useCallback์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ฉด์„œ ๊ฐœ๋…์— ๋Œ€ํ•ด ๋จธ๋ฆฟ์†์—์„œ๋„ ์ž๋ฆฌ๊ฐ€ ์žกํžŒ ๊ฒƒ ๊ฐ™์•„์š”. ์ด ๊ธ€์„ ๋ณด์‹œ๋Š” ๋ถ„๋“ค๊ป˜๋„ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. โ˜บ๏ธ

 

 

 

 

 

๐Ÿšฉ ์ฐธ๊ณ 

๋ฒจ๋กœํผํŠธ์™€ ํ•จ๊ป˜ํ•˜๋Š” ๋ชจ๋˜ ๋ฆฌ์•กํŠธ

Hooks API Reference