Home ๐Ÿ“ธ 2022-08-02
Post
Cancel

๐Ÿ“ธ 2022-08-02

๐Ÿ”ฅ ์˜ค๋Š˜ ์–ด๋””์— ๋„์ „ํ•ด๋ณด์…จ๊ณ , ๋ฌด์—‡์„ ๋ฐฐ์šฐ์…จ๋‚˜์š”?

๐ŸŒŠ ํ•™์Šตํ•˜์‹œ๋ฉด์„œ ๊ถ๊ธˆํ•˜์‹  ๋ถ€๋ถ„์ด๋‚˜, ์–ด๋ ค์› ๋˜ ์ ์€ ๋ญ˜๊นŒ์š”?

  • useCallback์˜ ์˜์กด์„ฑ ๋” ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ.. ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ๋Š” ์–ธ์ œ์ด๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋ญ˜ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”๊ฑฐ์ง€..?
  • ์˜ค๋žœ๋งŒ์— ์ฝ”๋”ฉํ…Œ์ŠคํŠธํ•ด์„œ ๊ทธ๋Ÿฐ๊ฐ€, ์ € ๋ฌธ์ œ๋งŒ 3๋ฒˆ์„ ํ’€์—ˆ๋Š”๋ฐ ํ’€ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต๋ฌธ์„ ์“ฐ๊ฒŒ ๋œ๋‹ค. ๋…ธ๋ ฅํ•˜์ž..๐Ÿ˜ข

๐ŸŒŸ ๋‚ด์ผ์€ ์–ด๋–ป๊ฒŒ ํ•ด๋ณด๊ณ  ์‹ถ์œผ์„ธ์š”?

  • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ 1๊ฐœ ์ด์ƒ ํ’€๊ธฐ
  • React์˜ useCallback ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์จ๋ณด๊ธฐ

React.memo์™€ useCallback

  • ์ปดํฌ๋„ŒํŠธ์˜ props, state, context๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•˜๋ฉฐ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์žฌ์‹คํ–‰๋œ๋‹ค๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ์žฌ์‹คํ–‰๋œ๋‹ค. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ props ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์žฌ์‹คํ–‰๋œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•ด์„œ ์‹ค์ œ DOM์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ DOM์€ ๊ฐฑ์‹  ์ „ํ›„์˜ ์ƒํƒœ ์ฐจ์ด๋ฅผ ์ธ์‹ํ•˜๊ณ  ์‹ค์ œ DOM์— ๋ณ€ํ™”๋œ ๋ถ€๋ถ„๋งŒ ์กฐ์ž‘ํ•œ๋‹ค.
  • React.memo๋Š” ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ ์ปดํฌ๋„ŒํŠธ์— ์–ด๋–ค props๊ฐ€ ์ž…๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ž…๋ ฅ๋˜๋Š” ๋ชจ๋“  props์˜ ์‹ ๊ทœ ๊ฐ’์„ ํ™•์ธํ•œ ๋’ค ๊ธฐ์กด props์™€ ๋น„๊ตํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  props๊ฐ€ ๋ฐ”๋€ ๊ฒฝ์šฐ์—๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‹คํ–‰ ๋ฐ ์žฌํ‰๊ฐ€ํ•œ๋‹ค.

    • props๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ด์ฃผ๋ฏ€๋กœ ์ตœ์ ํ™”์— ๋„์›€์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ์ „์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊นŒ? memo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—๋„ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ธฐ์กด ๊ฐ’๊ณผ ์‹ ๊ทœ ๊ฐ’์„ ๋น„๊ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ธฐ์กด ๊ฐ’์„ ์ €์žฅํ•  ๊ณต๊ฐ„๊ณผ ๋น„๊ต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์•ฑ์˜ ํฌ๊ธฐ๋‚˜ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
    • memo๋กœ ๊ฐ์‹ผ ์ปดํฌ๋„ŒํŠธ์— ์ฐธ์กฐ ํƒ€์ž…์„ props๋กœ ์ „๋‹ฌํ•˜๋ฉด ๊ทธ ๊ฐ’์ด ๋™์ผํ•˜๋”๋ผ๋„ ์žฌ์‹คํ–‰๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ Button์€ onClick์ด๋ผ๋Š” props๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค. onClickHandler๋Š” App ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— App์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜์–ด ๋งค๋ฒˆ ๊ธฐ์กด props์™€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์ธ์‹๋œ๋‹ค. {} === {}๋Š” false์™€ ๊ฐ™๋‹ค.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      const Button = React.memo((props) => {
        return <button onClick={props.onClick}>{props.children}</button>;
      });
      
      const App = () => {
        const onClickHandler = () => {
          /* ... */
        };
        return <Button onClick={onClickHandler}>Click!</Button>;
      };
      
      • ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ props๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ์žฌ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด useCallback์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํŠน์ • ๊ฐ์ฒด๋ฅผ useCallback์œผ๋กœ ๊ฐ์‹ธ๋ฉด ๊ทธ ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋  ๋•Œ ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ์‹œ์ ์€ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.
        1
        2
        3
        
        const onClickHandler = useCallback(() => {
          /* ... */
        }, []);
        
This post is licensed under CC BY 4.0 by the author.

๐Ÿ„๐Ÿปโ€โ™€๏ธ [์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] ์‹ ๊ณ  ๊ฒฐ๊ณผ ๋ฐ›๊ธฐ

๐Ÿ“ธ 2022-08-03