๋ชฉ์ฐจ

    ๐Ÿ“ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋žœ๋”๋ง ๋ฐฉ์ง€์— ๋ฏธ์นœ ์ธ๊ฐ„

    ๋จผ์ € React์˜ ์›๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด,

    React๋Š” Virtual Dom๊ณผ Real Dom์„ ๋น„๊ตํ•˜์—ฌ, ์ƒํƒœ๊ฐ€ ๋ณ€ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์บ์น˜ํ•˜์—ฌ, Real Dom์— Fetch๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์ƒํƒœ๋ผ๋Š” ๋‹จ์–ด์— ๋Œ€ํ•ด์„œ ์ง‘์ค‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    React๊ฐ€ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์•„์ฃผ ์ž˜ ์บ์น˜ํ–ˆ๋‹ค๋ฉด, ์ €๋Š” ์ด๋Ÿฐ ๊ณ ๋ฏผ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    React์—์„œ๋Š” UI ์š”์†Œ์˜ ์ œ์ผ ์ž‘์€ ์กฐ๊ฐ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ Component๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    UI์•ˆ์—๋Š” ๋˜ ๋‹ค๋ฅธ UI ์กฐ๊ฐ์ด ์žˆ๊ณ , ๊ทธ UI ์กฐ๊ฐ ์•ˆ์—๋Š” ๋˜ ๋‹ค๋ฅธ UI ์กฐ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด UI ์กฐ๊ฐ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋…€์„์„ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์žˆ๋Š” UI ์กฐ๊ฐ์„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

     

    <๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ>
      <์ž์‹์ปดํฌ๋„ŒํŠธ />
    </๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ>

    React์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ด์ œ ๋๋‚ฌ๊ณ  ์ œ๊ฐ€ ์ด๊ฑธ ์„ค๋ช…ํ•œ ์ด์œ ๋Š”

    ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋žœ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    ์ฆ‰ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค.

    React์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋žœ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    1. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด, ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฉ๋‹ˆ๋‹ค.
    2. ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›๋Š” Props์˜ ์ƒํƒœ๋‚˜ state์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•ด๋„, ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฉ๋‹ˆ๋‹ค.

    ๊ฒฐ๊ตญ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, memo๋ผ๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์™€ useCallback Hook์„ ์ž˜ ์กฐํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    memo๋Š” ๋™์ผํ•œ props๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ, ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ง•ํ•˜๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์ด๊ณ ,

    useCallback์€ ๋ฉ”๋ชจ์ด์ง•ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Hook์ž…๋‹ˆ๋‹ค.

    ์ด ๋‘˜์„ ์กฐํ•ฉํ•ด์„œ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋žœ๋”๋ง ๋ฐฉ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ, ์–ด๋–ป๊ฒŒ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

    ๊ทธ๊ฒƒ์€.. React ๊ณต์‹๋ฌธ์„œ์—์„œ React Dev Tool์˜ Profiler๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™•์ธํ•˜๋ผ๊ณ  ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๐Ÿ“๐Ÿ“React Dev Tool์˜ ํ•จ์ • ๊ธฐ๋Šฅ


    ๋‹ค๋“ค.. ์ด๊ฑฐ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹œ์ฃ ?
    Highlight updates when components render์— ์ฒดํฌํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

    React Dev Tool์ด๋ผ๋Š” ๊ตฌ๊ธ€ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ ํ•˜์ด๋ผ์ดํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

    ํ•˜์ด๋ผ์ดํŠธ ์„ ์ด ํ‘œ์‹œ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ๋‹ค ๊ทธ๋ ‡๊ฒŒ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

    ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ํ•˜์ง€๋งŒ ์ด Profiler์˜ ํ•˜์ด๋ผ์ดํŠธ ๊ธฐ๋Šฅ์€ ํ•จ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ์‹ค์ œ๋กœ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ, ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•˜์ด๋ผ์ดํŠธ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ์•„๋ž˜๋Š” ์‹คํ—˜์— ์‚ฌ์šฉ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

     

    export const ํŽ˜์ด์ง€ = () => {
      const [count, setCount] = useState<number>(0)
    
      const handleCountIncrease = () => {
        setCount((number) => number + 1)
      }
    
      const onReset = useCallback(() => {
        setCount(0)
      }, [])
    
      return (
        <Fragment>
          <div
            css={{
              display: 'flex',
              flexDirection: 'column',
              alignItems: 'center',
              width: 200,
              height: 100,
              border: '1px solid black',
              borderRadius: 10,
            }}
            onClick={handleCountIncrease}
          >
            <p>{count}</p>
          </div>
    
          <Button onClick={onReset}>Reset</Button>
        </Fragment>
      )
    }
    
    const Button = memo((props: ButtonProps) => {
      return <button {...props} />
    })
    
    Button.displayName = 'Button'

    ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด count๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , Reset ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฐ„๋‹จํ•œ UI์ž…๋‹ˆ๋‹ค.

    ์ฝ”๋“œ์˜ ์˜๋„๋Œ€๋กœ๋ผ๋ฉด, count๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ๋•Œ, Button ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

    1. useCallback Hook์œผ๋กœ ๊ฐ์‹ผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
    2. ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋™์ผํ•œ props๋ผ๋ฉด, ๋ฉ”๋ชจ์ด์ง• ํ•˜๋„๋ก memo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

    ๊ฒฐ๊ณผ๋Š”? Reset ๋ฒ„ํŠผ์— ํ•˜์ด๋ผ์ดํŠธ ์„ ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ Œ๋”๋ง ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

     

    ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

    Reset ๋ฒ„ํŠผ์˜ ๋‚ด๋ถ€์— console์„ ์ฐ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค Reset ๋ฒ„ํŠผ์ด ๋ Œ๋”๋ง ๋˜์—ˆ๋‹ค๋ฉด, console์— ๊ณ„์† ์ถœ๋ ฅ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

     

    const Button = memo((props: ButtonProps) => {
      console.log("์ €๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค")
      return <button {...props} />
    })
    
    Button.displayName = 'Button'

     

    ๊ฒฐ๊ณผ๋Š” ๋ Œ๋”๋ง๋˜์—ˆ๋‹ค๊ณ  ํ•˜์ด๋ผ์ดํŠธ๋กœ ํ‘œ์‹œ๋˜์—ˆ์ง€๋งŒ, console์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด, ์ œ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ์ž‘์„ฑํ•œ ๊ฒƒ์ผ๊นŒ์š”?? 

    ์ •๋‹ต์€......... ์•„๋‹™๋‹ˆ๋‹ค.

    ์ž ๊ทธ๋Ÿผ… ์ด๋ฒˆ์—๋Š” ์‹œ๊ฐ์ ์œผ๋กœ๋„ ํ•˜์ด๋ผ์ดํŠธ์„ ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    Reset ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฐ•์Šค ๋‚ด๋ถ€๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

     

    export const ํŽ˜์ด์ง€ = () => {
      const [count, setCount] = useState<number>(0)
    
      const handleCountIncrease = () => {
        setCount((number) => number + 1)
      }
    
      const onReset = useCallback(() => {
        setCount(0)
      }, [])
    
      return (
        <Fragment>
          <div
            css={{
              display: 'flex',
              flexDirection: 'column',
              alignItems: 'center',
              width: 200,
              height: 100,
              border: '1px solid black',
              borderRadius: 10,
            }}
            onClick={handleCountIncrease}
          >
            <p>{count}</p>
    
            <Button onClick={onReset}>Reset</Button>
          </div>
        </Fragment>
      )
    }
    
    const Button = memo((props: ButtonProps) => {
      return <button {...props} />
    })
    
    Button.displayName = 'Button'

     

    ๊ฒฐ๊ณผ๋Š”?? 

    ํ•˜์ด๋ผ์ดํŠธ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

     

    ๋†€๋ž์ง€ ์•Š๋‚˜์š”? ์ด ์ง„์‹ค์„ ์•Œ์•˜์„ ๋•Œ, ์ •๋ง ๊นœ์ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

     

    โœ๏ธ ๋งˆ๋ฌด๋ฆฌ

     

    React Dev Tool์˜ ํ•˜์ด๋ผ์ดํŠธ ๊ธฐ๋Šฅ์€ ๊ฐ€์งœ๋‹ค

    ์ง„์งœ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€, ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•ด์„œ ํ™•์ธํ•˜์ž.

    1. Profiler์˜ ์„ฑ๋Šฅ ๊ทธ๋ž˜ํ”„๋ฅผ ํ™•์ธ
    2. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— console.log ์ฐ๊ธฐ

    + Recent posts