2024-04-27.md

๐Ÿก

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

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


DIL-week6-4_2024-04-27

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ---------- | -------------------------------------------------------- | ----------- | | 8์ฃผ์ฐจ | 14์žฅ, 15์žฅ | ์›น์‚ฌ์ดํŠธ ๋ณด์•ˆ์„ ์œ„ํ•œ ๋ฆฌ์•กํŠธ์™€ ์›นํŽ˜์ด์ง€ ๋ณด์•ˆ ์ด์Šˆ, ๋งˆ์น˜๋ฉฐ | 903~917p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ


๋งˆ์น˜๋ฉฐ

๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ ๋ ค์‚ฌํ•ญ

๋ ˆ๊ฑฐ์‹œ ์œ ์ง€๋ณด์ˆ˜ ์‹œ

  • ์ตœ์†Œ 16.8.6์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด 17 ๋ฒ„์ „
  • ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š”?
    • ๊ธฐ์กด ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋ฏ€๋กœ Hooks์„ ์ ์ง„์  ์ฑ„ํƒ / ๋Œ€๊ทœ๋ชจ ์žฌ์ž‘์„ฑ์„ ํ”ผํ•˜์ž
    • ๋ฆฌ์•กํŠธ๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ„์† ์ง€์›ํ•  ์˜ˆ์ • https://legacy.reactjs.org/docs/hooks-intro.html#gradual-adoption-strategy

์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ 11 ์ง€์› ์‹œ

  • ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ 11์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋Œ€ํ‘œ์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๋ฆฌ์•กํŠธ 18 ์ดํ›„
    • Next.js 13 ์ดํ›„
    • query-string 6.x ๋ฒ„์ „ ์ดํ›„
  • ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํŒ๋‹จ ํ›„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ•„์š”

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ ๋ คํ•˜๊ธฐ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์†๋„์— ์˜์กด์ ์ผ์ˆ˜๋ก, ํ‰๊ท ์ ์œผ๋กœ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์ง€๋‹Œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    • ์‚ฌ์šฉ์ž๋ณ„ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์˜ ์„ฑ๋Šฅ์€ ์ฒœ์ฐจ๋งŒ๋ณ„
  • ๋Œ€๋ถ€๋ถ„์˜ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Lighthouse, WebPageTest, Chrome Devtools์—์„œ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์–ด๋ ต๋‹ค.
    • ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, ์ด๋ฒคํŠธ ํŽ˜์ด์ง€, ํ˜น์€ ์„œ๋ฒ„ ์ค€๋น„๊ฐ€ ์—ฌ์˜์น˜ ์•Š์€ ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๋ฉด (์—ฌ์œ ๊ฐ€ ๋œ๋‹ค๋ฉด) ์‹œ์ž‘๋ถ€ํ„ฐ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • Next.js, Remix, Hydrogen(Shopify์—์„œ ๋งŒ๋“ฆ)

์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ

  • ์ถ”์„ธ
    • ์˜›๋‚ ์— ๋ฆฌ์•กํŠธ+๋ฆฌ๋•์Šค๋ฅผ ์„ธํŠธ๋กœ ์“ธ ๋•Œ๊ฐ€ ์žˆ์—ˆ์Œ
    • ํ˜„์žฌ ๋‹ค์–‘ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ , Context API๋กœ ์ƒํƒœ ์ฃผ์ž…๋„ ๊ฐ€๋Šฅ
  • ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๋ฆฌํ•ด์•ผํ•  ์ƒํƒœ๊ฐ€ ๋งŽ์€๊ฐ€?
      • ๋ฌธ์„œ ํŽธ์ง‘๊ธฐ, ์ƒํƒœ ํ•ฉ์„ฑ

๋ฆฌ์•กํŠธ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์กฐ์‹ฌ

  • react-**
    • peerDependencies์˜ ๋ฆฌ์•กํŠธ ๋ฒ„์ „์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ฆฌ์•กํŠธ 16.8๋ฒ„์ „ ์ด์ƒ(ํ›…), ๋ฆฌ์•กํŠธ 18(์™ธ๋ถ€ ์ƒํƒœ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ)

๋ฆฌ์•กํŠธ

  • ๋ฆฌ์•กํŠธ๋Š” ์ง€๊ธˆ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์™„๋ฒฝํ•˜์ง€ ์•Š์Œ

    • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ -> ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์งฌ๋ฝ• ์ž๋ฃŒ๋“ค
      • Svelte, Vue ๊ณต์‹๋ฌธ์„œ๊ฐ€ ๊น”๋”ํ•จ
  • ๋ฆฌ์•กํŠธ ๊ทœ์น™๋“ค(useEffect ์ฝœ๋ฐฑ์— async ์•ˆ๋จ, ๋ณ€์ˆ˜์™€ useState, ์˜์กด์„ฑ ๋ฐฐ์—ด, ํด๋ฆฐ์—…)

    • Svelte ์ฝ”๋“œ ์˜ˆ์‹œ: ๋” ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ
    <script>
      import {getFruits} from './service';
      import {onMount, onDestory} from 'svelte';
    
      let fruits = []
      let interval
    
      onMount(async () => {
        fruits = await getFruits()
    
        interval = setInterval(() => {
          fruits = [...fruits, 'banana']
        })
      })
    
      onDestory(() => clearInterval(interval))
    </script>
    
    <ul>
      {#each fruits as fruit}
      <li>{fruit}</li>
      {/each}
    </ul>
    

๋ฐฉ๋Œ€ํ•œ ์ž์œ : ํŒŒํŽธํ™”๋œ ๋ฆฌ์•กํŠธ ๊ธฐ์ˆ 

  • ํŒŒํŽธํ™”
    • ์Šคํƒ€์ผ: ์™ธ๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ Import, inline, CSS Module, styled-components, emotion
    • ์ƒํƒœ๊ด€๋ฆฌ: Redux, MobX, Jotai, Zustand, React Tracked, Valtio
    • ๋ฐ์ดํ„ฐ fetch
  • ๋‹จ์ 
    • ๋น„์ง๊ด€์ ์ธ JSX
    • ๊ธ‰์ง„์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” API
  • ๋ฆฌ์•กํŠธ๋ฅผ De facto standard๋กœ ์—ฌ๊ธด๋‹ค๋ฉด, ๊ธ‰์ง„์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์˜ ์ƒˆ๋กœ์šด ๋ณ€ํ™”๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์ ์‘ํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ๊ฒƒ

์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„์˜ ๋ช…์•”

ํŽ˜์ด์Šค๋ถ ๋ผ์ด์„ ์Šค ์ด์Šˆ

  • ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด์„ผ์Šค ์ค‘ ๊ฐ€์žฅ ๋„๋ฆฌ๋Š” ๋ผ์ด์„ผ์Šค MIT
    • ์ƒ์—…์  ์ด์šฉ, ๋ฐฐํฌ, ๊ฐœ์ธ์  ์ด์šฉ์— ๋Œ€ํ•œ ์ œ์•ฝ ์—†์ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์œ ๋กœ์šด ๋ผ์ด์„ผ์Šค
  • ์ด์Šˆ
    1. ํŽ˜์ด์Šค๋ถ์˜ React, Immutable, Jest ๋“ฑ์— BSD+Patents ์‚ฌ์šฉ
    • https://github.com/facebook/react/blob/d63249d03488fec1ea92a81ba29f0e87a82feeae/PATENTS#L14-L26

      ์—ฌ๊ธฐ์„œ ๋ถ€์—ฌ๋œ ๋ผ์ด์„ ์Šค๋Š” ์ž๋™์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ํ†ต์ง€ ์—†์ด ์ข…๋ฃŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด๋‚˜ ๋‹น์‹ ์˜ ๊ณ„์—ด์‚ฌ, ๋ฒ•์ธ ๊ณ„์—ด์‚ฌ ๋˜๋Š” ๋Œ€๋ฆฌ์ธ ์ค‘ ์–ด๋Š ํ•˜๋‚˜๊ฐ€ ํŠนํ—ˆ ์ฃผ์žฅ์„ ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ๊ฐœ์‹œํ•˜๊ฑฐ๋‚˜ ์ง์ ‘์ ์ธ ๊ธˆ์ „์  ์ดํ•ด๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ: (i) ํŽ˜์ด์Šค๋ถ์ด๋‚˜ ๊ทธ ๊ณ„์—ด์‚ฌ ์ค‘ ์–ด๋Š ํ•˜๋‚˜์— ๋Œ€ํ•œ ํŠนํ—ˆ ์ฃผ์žฅ, (ii) ํŠนํ—ˆ ์ฃผ์žฅ์ด ์ „์ฒด ๋˜๋Š” ์ผ๋ถ€๊ฐ€ ํŽ˜์ด์Šค๋ถ์ด๋‚˜ ๊ทธ ๊ณ„์—ด์‚ฌ์˜ ์†Œํ”„ํŠธ์›จ์–ด, ๊ธฐ์ˆ , ์ œํ’ˆ ๋˜๋Š” ์„œ๋น„์Šค์—์„œ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, ๋˜๋Š” (iii) ์†Œํ”„ํŠธ์›จ์–ด์™€ ๊ด€๋ จ๋œ ์–ด๋– ํ•œ ๋‹น์‚ฌ์ž์— ๋Œ€ํ•œ ํŠนํ—ˆ ์ฃผ์žฅ. ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์Šค๋ถ์ด๋‚˜ ๊ทธ ๊ณ„์—ด์‚ฌ ์ค‘ ์–ด๋Š ํ•˜๋‚˜๊ฐ€ ์ฒ˜์Œ์— ๋‹น์‹ ์— ๋Œ€ํ•œ ํŠนํ—ˆ ์นจํ•ด๋ฅผ ์ฃผ์žฅํ•˜๋Š” ์†Œ์†ก์„ ์ œ๊ธฐํ•˜๊ณ , ๋‹น์‹ ์ด ๊ทธ ์†Œํ”„ํŠธ์›จ์–ด์™€ ๊ด€๋ จ์ด ์—†๋Š” ๊ทธ ๋‹น์‚ฌ์ž์— ๋Œ€ํ•ด ๊ทธ ์†Œ์†ก์—์„œ ํŠนํ—ˆ ์นจํ•ด ๋ฐ˜์†Œ์†ก์„ ์ œ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณธ ๋‹จ๋ฝ์˜ (i)์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๋ฐ˜์†Œ์†ก์œผ๋กœ ์ธํ•ด ์—ฌ๊ธฐ์— ๋ถ€์—ฌ๋œ ๋ผ์ด์„ ์Šค๋Š” ์ข…๋ฃŒ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    1. 2017๋…„ 7์›” ์•„ํŒŒ์น˜ ์žฌ๋‹จ์—์„œ BSD+Patents ๊ธˆ์ง€
    2. ํŽ˜์ด์Šค๋ถ์˜ BSD+Patents ๋ผ์ด์„ผ์Šค ์œ ์ง€
    3. ์ฐฌ๋ฐ˜ ๋…ผ๋ž€
    4. ์›Œ๋“œํ”„๋ ˆ์Šค ์ง„์˜์—์„œ 3์˜ ์ด์œ ๋กœ ์ž์‚ฌ ์†Œํ”„ํŠธ์›จ์–ด์— ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ๋ฐํž˜
    5. ํŽ˜์ด์Šค๋ถ์ด MIT ๋ผ์ด์„ผ์Šค๋กœ ๋ฐ”๊ฟˆ
  • ์˜คํ”ˆ์†Œ์Šค๋กœ ๋งŒ๋“  ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ถŒ๋ฆฌ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ๊ฐ์‹ฌ์„ ๊ฐ–๊ฒŒ ํ•˜๋Š” ์‚ฌ๋ก€

์˜คํ”ˆ์†Œ์Šค๋Š” ๋ฌด๋ฃŒ๋กœ ๊ณ„์† ์ œ๊ณต๋˜๋Š”๊ฐ€?

  • ๋ฐ”๋ฒจ
    • ์˜คํ”ˆ์†Œ์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ํ’€ํƒ€์ž„ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ณ ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์žฌ์ •๋‚œ์„ ๊ฒช๊ณ  ์žˆ๋‹ค
      • ์—ฐ๊ฐ„ 330,000๋‹ฌ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๋ฅผ ์œ„ํ•œ ๋ชจ๊ธˆ ์ง„ํ–‰
  • colors.js => 1.4.1 ๊ณ ์˜์  ๋ฌดํ•œ ๋ฃจํ”„ ์‚ฝ์ž…
  • faker.js => 6.6.6 ๋นˆ ์†Œ์Šค์ฝ”๋“œ
    • Pay Me or Fork This
  • ์˜คํ”ˆ์†Œ์Šค๋ฅผ ๋‹น์—ฐํžˆ ๋ฌด๋ฃŒ๋กœ ์“ฐ๋Š” ํ˜„์ƒ์— ๋Œ€ํ•œ ๋น„ํŒ ์ง„์˜
    • color.js ์—ฌํŒŒ๋Š” ์•„๋งˆ์กด ์›น์„œ๋น„์Šค CLI๊นŒ์ง€ ์˜ํ–ฅ์„ ์ฃผ์—ˆ์Œ ๋งํฌ
  • ๋งŒ์•ฝ ๋ฐ”๋ฒจ์ด ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค๋ฉด...?
  • ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ๋ฌด์Šจ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š” ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค

์ œ์ด์ฟผ๋ฆฌ, AngularJS, ๋ฆฌ์•กํŠธ, ...

  • ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์—ญ์‚ฌ image
  • state of js 2022
    • usages: React, Angular, Vue.js image
    • interest: Svelte Ember Vue React image

์›น ๊ฐœ๋ฐœ

  • WASM: https://tech.kakao.com/2021/05/17/frontend-growth-08/
  • Rome: https://biomejs.dev/blog/annoucing-biome/

  • Programming idiom
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€์šฉ๊ตฌ(Programming idiom)๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‚˜ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํŒจํ„ด