2024-03-09.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 1์ฃผ์ฐจ-6

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week1-6_2024-03-09

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์žฅ | ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ์š”์†Œ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ | 162p~ |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: 10์‹œ~12์‹œ๋ฐ˜ ์‹œ๊ฐ„์ด ์—†๋‹ค!

  1. ๋น ๋ฅด๊ฒŒ ์ฝ๊ธฐ: ์ถ”๊ฐ€ ๊ฒ€์ƒ‰x, ์˜ˆ์ œ ๋งŒ๋“ค๊ธฐx => ํ•˜์ง€๋งŒ ๋งŒ๋“ค์—ˆ์ฃ ?

  2. ๋ฐœํ‘œ ๋งฅ๋ฝ ์ •ํ•˜๊ธฐ

  3. ์žฅํ‘œ ๋งŒ๋“ค๋ฉด์„œ ์ถ”๊ฐ€ ๊ณต๋ถ€

  4. ๊ถ๊ธˆํ•œ ์ ์€ ์ •๋ฆฌํ•ด์„œ ์ผ์š”์ผ 10์‹œ์— ํ† ์˜

  • ๋Œ„ ์•„๋ธŒ๋ผ๋ชจํ”„ Dan Abramov์˜ ๋ธ”๋กœ๊ทธ ์ธ์šฉ์ด ๋งŽ์ด ๋‚˜์˜จ๋‹ค https://overreacted.io/

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ํ•œ๊ณ„

  • ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค: state์˜ ์—…๋ฐ์ดํŠธ ์œ„์น˜ ์–ด๋””? ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์†Œ๋“œ ์ฝ”๋“œ์˜ ํ๋ฆ„ ํŒŒ์•…ํ•ด์•ผํ•จ
  • ์žฌ์‚ฌ์šฉ์ด ์–ด๋ ต๋‹ค: HOC๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜, props๋ฅผ ์ „๋‹ฌํ•ด์„œ ์žฌ์‚ฌ์šฉ ์‹œ, wrapper hell์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์ƒ์†์œผ๋กœ ์žฌ์‚ฌ์šฉ ์‹œ, ํด๋ž˜์Šค์˜ ํ๋ฆ„์„ ์ซ“์•„์•ผ ํ•จ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง„๋‹ค: ๋กœ์ง, ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋ณต์žกํ•˜๋ฉด ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŽ์ด ์จ์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋šฑ๋šฑํ•ด์ง
  • ์ƒ๋Œ€์ ์œผ๋กœ ์–ด๋ ต๋‹ค: JS ๊ฐœ๋ฐœ์ž๋“ค์ด class ๋ฌธ๋ฒ•์— ์ต์ˆ™ํ•˜์ง€ ์•Š๊ณ , ํ˜ผ๋ˆ์˜ JS this
  • ์ฝ”๋“œ ํฌ๊ธฐ ์ตœ์ ํ™” ์–ด๋ ค์›€: ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์–ด๋ ต๋‹ค. ๋ฉ”์„œ๋“œ๋ช…์ด minified๋˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํŠธ๋ฆฌ์‰์ดํ‚น ๋˜์ง€ ์•Š์Œ
  • hot reloading์— ๋ถˆ๋ฆฌ
    • class component: ์ตœ์ดˆ ๋žœ๋”๋ง ์‹œ instance๋ฅผ ์ƒ์„ฑ => ๋‚ด๋ถ€์—์„œ state ๊ฐ’ ๊ด€๋ฆฌ. instance ๋‚ด๋ถ€์— ์žˆ๋Š” render()๋ฅผ ์ˆ˜์ •ํ•  ์‹œ, instance๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ฆ => state์ด ์ดˆ๊ธฐํ™”๋จ
    • function component: state ๊ฐ’์„ ํด๋กœ์ €์— ์ €์žฅ, ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๋„ state์„ ์žƒ์ง€ ์•Š์Œ

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ

  • 16.8 ๋ฒ„์ „ ์ด์ „์—๋Š” ๋ฌด์ƒํƒœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ

์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ

  • componentDidMount, componentDidUpdate, componentUnmount๋ฅผ useEffect๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„
    • useEffect๋Š” ์ƒ๋ช…์ฃผ๊ธฐx => ๊ทธ๋ƒฅ ๋™๊ธฐ์ ์ธ side effect ๋งค์ปค๋‹ˆ์ฆ˜

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์™€ ๋žœ๋”๋ง๋œ ๊ฐ’

| ๊ตฌ๋ถ„ | ์ฐจ์ด์  | props | ์„ค๋ช… | | ------------------ | --------------------------- | ------------ | --------------------------------------------------------------------------- | | class component | ๋žœ๋”๋ง๋œ ๊ฐ’์„ ๊ณ ์ •ํ•˜์ง€ ์•Š์Œ | this.props | ๋”ฐ๋ผ์„œ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋œ nextProps ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค (๋ณ€ํ™”ํ•˜๋Š” this) | | function component | ๋žœ๋”๋ง๋œ ๊ฐ’์„ ๊ณ ์ •ํ•จ | props๋Š” ์ธ์ˆ˜ | ๋žœ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ, ๊ทธ ์ˆœ๊ฐ„์˜ props, state์„ ๊ธฐ์ค€์œผ๋กœ ๋žœ๋”๋ง |

  • class component์—์„œ props๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
    • ๋ฏธ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ์ธ์ˆ˜์— ์ „๋‹ฌํ•ด๋†“๋Š”๋‹ค
    • render(){ ์—ฌ๊ธฐ } ๋‚ด์— ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค. ์ด์ƒํ•ด

๋žœ๋”๋ง์€ ์–ด๋–ป๊ฒŒ ์ผ์–ด๋‚˜๋Š”๊ฐ€?

  • ๋ฆฌ์•กํŠธ ๋žœ๋”๋ง: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋žœ๋”๋ง์— ํ•„์š”ํ•œ DOM ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •
  • ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠธ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด ํ˜„์žฌ ์ž์‹ ๋“ค์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” props์™€ state์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ป๊ฒŒ UI๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์–ด๋–ค DOM ๊ฒฐ๊ณผ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ณตํ•  ๊ฒƒ์ธ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •

๋ฆฌ์•กํŠธ์—์„œ ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

  • ์ตœ์ดˆ ๋žœ๋”๋ง
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง„์ž…
    • ๋ธŒ๋ผ์šฐ์ €์— ๋žœ๋”๋งํ•  ๊ฒฐ๊ณผ๋ฌผ(์ •๋ณด)๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ดˆ ๋žœ๋”๋ง ์ˆ˜ํ–‰
  • ๋ฆฌ๋žœ๋”๋ง
    • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ
      • setState ์‹คํ–‰
      • forceUpdate ์‹คํ–‰(shouldComponentUpdate๋ฅผ ๊ฑด๋„ˆ๋œ€, render ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•˜๋ฉด? ๋ฌดํ•œ ๋ฃจํ”„)
    • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ
      • useState์˜ setter ์‹คํ–‰
      • useReducer์˜ dispatch ์‹คํ–‰
      • key props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ
      • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง ๋  ๊ฒฝ์šฐ
      • props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ

key props?

  • ๋ฆฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ, ํ˜•์ œ ์š”์†Œ๋“ค ์‚ฌ์ด์—์„œ ๋™์ผ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’
  • key๊ฐ€ ์—†๋‹ค๋ฉด? ํŒŒ์ด๋ฒ„ ๋‚ด๋ถ€์˜ sibling ์ธ๋ฑ์Šค๋งŒ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•˜๊ฒŒ ๋จ
  • key๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ•์ œ๋กœ ๋ฆฌ๋žœ๋”๋ง ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ

๋ฆฌ์•กํŠธ์˜ ๋žœ๋”๋ง ํ”„๋กœ์„ธ์Šค

  • ๋žœ๋”๋ง ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋˜๋ฉด, ์ปดํฌ๋„ŒํŠธ ๋ฃจํŠธ์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜์ชฝ์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค
    • ๋ฐœ๊ฒฌ ์‹œ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด render()
    • ๋ฐœ๊ฒฌ ์‹œ, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด FunctionComponent()๋ฅผ ํ˜ธ์ถœ ํ›„, ๊ฒฐ๊ณผ ์ €์žฅ
      // ๊ฒฐ๊ณผ
      {type: MyComponent, props: {count: 0, required: true, children: "์•ˆ๋…•"}}
      
    • JSX๋‹ˆ๊นŒ createElement()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค
  • Reconciliation ์žฌ์กฐ์ •: ์ปดํฌ๋„ŒํŠธ์˜ ๋žœ๋”๋ง ๊ฒฐ๊ณผ๋ฌผ์„ ์ˆ˜์ง‘, ๊ฐ€์ƒ DOM๊ณผ ๋น„๊ตํ•ด์„œ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณผ์ •.
  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๊ธฐ ์‹œํ€€์Šค๋กœ DOM์— ์ ์šฉ

Render Phase์™€ Commit Phase

  • ๋žœ๋” Render Phase
    • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹คํ–‰: render(), return
    • ๊ฒฐ๊ณผ์™€ ์ด์ „ ๊ฐ€์ƒ DOM์„ ๋น„๊ต
    • type, props, key ์ค‘ ๋ณ€๊ฒฝ์ด ์žˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ
  • ์ปค๋ฐ‹ Commit Phase
    • ๋žœ๋” ๋‹จ๊ณ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ค์ œ DOM์— ์ ์šฉ
    • ์—…๋ฐ์ดํŠธ ์‹œ, ๋งŒ๋“  DOM ๋…ธ๋“œ ๋ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€์˜ ์ฐธ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธ
      • componentDidMount, componentDidUpdate ๋ฉ”์„œ๋“œ, useLayoutEffect ํ›… ํ˜ธ์ถœ
    • ์ปค๋ฐ‹ ์ดํ›„, ๋ธŒ๋ผ์šฐ์ €์˜ ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค
  • ๋ฆฌ์•กํŠธ์˜ ๋žœ๋”๋ง์ด ์ผ์–ด๋‚˜๋„ ๋žœ๋” ๋‹จ๊ณ„์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด? ์ปค๋ฐ‹ ๋‹จ๊ณ„๊ฐ€ ์ƒ๋žต๋˜์–ด ๋ธŒ๋ผ์šฐ์ € DOM ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค

๋ฉ”๋ชจ์ด์ œ์ด์…˜

์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜์˜ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ๊ธฐ์–ต useMemo, useCallback, HOC memo

๊ฐ‘๋ก ์„๋ฐ• ๐Ÿคœ๐Ÿค›

memoization ๋ฐ˜๋Œ€ํŒŒ

  • memoization์€ ๋น„์šฉ์ด๋‹ค.
    • ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ  ๋žœ๋”๋ง ํ˜น์€ ์žฌ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…
    • ๊ฒฐ๊ณผ๋ฌผ์„ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๊บผ๋‚ด์˜ค๋Š” ์ž‘์—…
  • ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.
    • premature optimization / premature memoization ์„ ๊ฒฝ๊ณ„ํ•˜์ž.
  • ๋ฆฌ์•กํŠธ๊ฐ€ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ PureComponent๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜, memo๋กœ ๊ฐ์‹ธ๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š์€ ์ด์œ : ํŠธ๋ ˆ์ดํŠธ ์˜คํ”„๊ฐ€ ์žˆ๋‹ค. silver bullet์ด ์•„๋‹˜

memoization ์ฐฌ์„ฑํŒŒ

  • memoization์˜ ๋น„์šฉ์€? props์— ๋Œ€ํ•œ ์–•์€ ๋น„๊ต, ๋ฆฌ๋žœ๋”๋ง ๋ฆฌ์•กํŠธ์˜ Reconciliation ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™๋‹ค. ์–ด์ฐจํ”ผ ๊ฒฐ๊ณผ๋ฌผ์€ ์ €์žฅ ์ค‘
  • ์ž ์žฌ์  ์œ„ํ—˜ ๋น„์šฉ
    • ๋žœ๋”๋ง ๋น„์šฉ
    • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ณต์žกํ•œ ๋กœ์ง ์žฌ์‹คํ–‰
    • ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚จ
    • ๋ฆฌ์•กํŠธ๊ฐ€ ๊ตฌ ํŠธ๋ฆฌ and ์‹ ๊ทœ ํŠธ๋ฆฌ ๋น„๊ต
function useMath(number: number) {
  const [double, setDouble] = useState(0);
  const [triple, setTriple] = useState(0);

  useEffect(() => {
    setDouble(number * 2);
    setTriple(number * 3);
  });

  return useMemo(() => ({ double, triple }), [double, triple]);
}
  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์˜ˆ์ œ: ./2024-03-09_sample.tsx