ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] useMemo์™€ useCallback๋กœ ๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ(Feat. React.memo)
    TECH 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

     

    ๋Œ“๊ธ€

Designed by Tistory.