2024-03-25.md

๐Ÿก

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

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


DIL-week4-1_2024-03-25

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์žฅ | SSR๊ณผ ESlint, ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | 252p~269p |

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


์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง SSR

CSR

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…, ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง, ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    • ์ตœ์ดˆ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ดํ›„, ํŽ˜์ด์ง€ ์ „ํ™˜์€ history.pushState, history.replaceState
  • ex) Gmail

์›น ๊ธฐ์ˆ  ์Šคํƒ

| ์Šคํƒ๋ช… | ์Šคํƒ ๋‚ด์šฉ | | ------ | --------------------------------------- | | LAMP | Linux, Apache, MySQL, PHP/Python | | JAM | JavaScript, API, Markup | | MEAN | MongoDB, Express.js, AngularJS, Node.js | | MERN | MongoDB, Express.js, React, Node.js |

  • ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” JS, HTML, CSS๋ฅผ ๋นŒ๋“œ ํ›„, ์ •์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต -> ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰
    • ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ๋” ์ž์œ ๋กœ์›Œ์กŒ๋‹ค
  • Node.js์˜ ๊ณ ๋„ํ™” => MEAN, MEAN ์Šคํƒ

ํ‰๊ท  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฆฌ์†Œ์Šค ํฌ๊ธฐ์˜ ์šฐ์ƒํ–ฅ

  • https://httparchive.org/reports/state-of-javascript#reqJs

| | desktop | mobile | | -------------------------------------------------------------------------------- | ----------- | ----------- | | JavaScript Bytes | 601.1 KB | 552.6 KB | | JavaScript Requests | 23 Requests | 22 Requests | | First Contentful Paint | 2.3 | 3.8 | | Time to Interactive | 4.2 | 14.3 |

  • ์ฒด๊ฐ์ƒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋Š๋ ค์ง
    • https://www.nngroup.com/articles/the-need-for-speed/
    1. ์›น ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค
    2. ์›น์—์„œ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค
    • ์ฝ”๋“œ์˜ ์–‘์ด ์ฆ๊ฐ€ -> JS ํŒŒ์‹ฑ์„ ์œ„ํ•ด CPU๋ฅผ ์†Œ๋น„ํ•˜๋Š” ์‹œ๊ฐ„์ด ์ฆ๊ฐ€
    • ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€: onLoad๋Š” 10.8์ดˆ, Time to Interactive 14.3์ดˆ
  • ๋‘ ๊ฐ€์ง€ ์›์ธ ๋ชจ๋‘ ๊ณ ๊ฐ์„ ์„ค๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ด ์•„๋‹˜
    • ์ œํ’ˆ์˜ ์›น ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•ด์•ผ ํ•จ

Server-Side Rendering์ด๋ž€?

MPA, Multi-Page Lifecycle์€

  • ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€ ์š”์ฒญ ๋ฐ›์€ ํ›„, ์™„์„ฑ๋œ HTML๋ฅผ ๋žœ๋”๋งํ•œ๋‹ค

SPA, Single-Page Application Lifecycle์€

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•ด ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๋žœ๋”๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํƒœ์ƒ์ ์ธ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
    • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์—์„œ ๋žœ๋”๋ง
    • ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฐ›์Œ (SSR๋ณด๋‹ค ๋ถˆ์•ˆ์ •)

SSR์€

์žฅ์ 

์žฅ์ 1. ์ตœ์ดˆ ํŽ˜์ด์ง€ ์ง„์ž… First Contentful Paint์ด ๋น„๊ต์  ๋น ๋ฅด๋‹ค
  • ex) ์™ธ๋ถ€ API ํ˜ธ์ถœ์— ๋งŽ์ด ์˜์ง€ํ•˜๋Š” ํŽ˜์ด์ง€, HTML์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ํŽ˜์ด์ง€
  • HTTP ์š”์ฒญ: ์„œ๋ฒ„์—์„œ ํ•˜๋Š” ๊ฒŒ ๋น ๋ฆ„
  • HTML ๊ทธ๋ฆฌ๊ธฐ: ์„œ๋ฒ„์—์„œ ๋ฌธ์ž์—ด๋กœ ๋ฏธ๋ฆฌ ๊ทธ๋ ค์„œ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒŒ, ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ธฐ์กด HTML์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ„
์žฅ์ 2. ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”
  • ๊ฒ€์ƒ‰ ์—”์ง„, SNS ๊ณต์œ , ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ ์šฉ
  • ๊ฒ€์ƒ‰ ์—”์ง„ ๋กœ๋ด‡ > HTML ๋‹ค์šด๋กœ๋“œ(JS๋Š” ์‹คํ–‰ ์•ˆํ•จ) > OG ํƒœ๊ทธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰(๊ณต์œ ) ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฒ€์ƒ‰ ์—”์ง„์— ์ €์žฅํ•œ๋‹ค
์žฅ์ 3. Cumulative Layout Shift
  • ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™์ด ์ ๋‹ค
  • API ์š”์ฒญ ์™„๋ฃŒ ํ›„ ์™„์„ฑ๋œ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ Layout Shift๊ฐ€ ์ ์ง€๋งŒ, ์ตœ์ดˆ ํŽ˜์ด์ง€ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ > ๋ฆฌ์•กํŠธ 18์—์„œ ๋“ฑ์žฅํ•œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค > ์ดํ›„์— ๋‹ค๋ฃธ
์žฅ์ 4. ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค ์„ฑ๋Šฅ์— ๋น„๊ต์  ์ž์œ ๋กœ์›€
  • ๋ถ€๋‹ด์„ ์„œ๋ฒ„์—~
์žฅ์ 5. ๋ณด์•ˆ
  • JAM ์Šคํƒ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ํ™œ๋™์ด ๋ธŒ๋ผ์šฐ์ €์— ๋…ธ์ถœ
  • API ํ˜ธ์ถœ๊ณผ ์ธ์ฆ ๋“ฑ์˜ ๋ฏผ๊ฐํ•œ ์ž‘์—… > ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋งŒ ๋ธŒ๋ผ์šฐ์ € ์ œ๊ณต

๋‹จ์ 

๋‹จ์ 1. ์„œ๋ฒ„ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๊ณ ๋ ค๊ฐ€ ํ•„์š”
  • ์†Œ์Šค ์ฝ”๋“œ ์ „๋ฐ˜์— ๊ฑธ์ณ, ์„œ๋ฒ„ ํ™˜๊ฒฝ ๊ณ ๋ ค
    • ex) window, sessionStorage, ์ „์—ญ ๊ฐ์ฒด
๋‹จ์ 2. ์ ์ ˆํ•œ ์„œ๋ฒ„ ๊ตฌ์ถ•
  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ๋žœ๋”๋ง์„ ์ˆ˜ํ–‰ํ•  ์„œ๋ฒ„๊ฐ€ ํ•„์š”
  • ๋ฌผ๋ฆฌ์ ์ธ ๊ฐ€์šฉ๋Ÿ‰, ์žฅ์•  ๋ณต๊ตฌ ์ „๋žต, ์š”์ฒญ ๋ถ„์‚ฐ, ํ”„๋กœ์„ธ์Šค ๋งค๋‹ˆ์ €์˜ ๋„์›€
๋‹จ์ 3. ์„œ๋น„์Šค ์ง€์—ฐ
  • ์ง€์—ฐ๋œ๋‹ค๋ฉด? ๋ณ‘๋ชฉ ์ƒํƒœ์—์„œ ์–ด๋–ค ์ •๋ณด๋„ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Œ

SPA vs SSR

  • SSR is not ๋งŒ๋Šฅ
    • ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์„œ๋ฒ„์— ๋ฏธ๋ฃฌ๋‹ค๊ณ  ํ•ด์„œ ๋ชจ๋“  ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Œ
    • ์ž˜๋ชป๋œ ์„ค๊ณ„ ์‹œ, ์„ฑ๋Šฅ์„ ํ•ด์น˜๊ณ  ๊ด€๋ฆฌ ํฌ์ธํŠธ๋งŒ ๋Š˜์–ด๋‚˜๋Š” ์—ญํšจ๊ณผ
  • ์ž˜๋งŒ๋“  SPA
    • ๋ ˆ์ด์ง€ ๋กœ๋”ฉ lazy loading: ์ค‘์š”์„ฑ ๋‚ฎ์€ ๋ฆฌ์†Œ์Šค
    • ์ฝ”๋“œ ๋ถ„ํ•  code splitting: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰ ๋ฐฉ์ง€
    • ๋ณ€๊ฒฝ ํ•„์š”ํ•œ HTML๋งŒ ๊ต์ฒดํ•˜๋Š” ์ตœ์ ํ™”
  • SPA์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์— ์˜์กด
    • ์ตœ์ ํ™”: ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค/๊ณตํ†ต ๋ฆฌ์†Œ์Šค, ๋‹ค์šด๋กœ๋“œ์™€ ๋žœ๋”๋ง ์šฐ์„  ์ˆœ์œ„ ์ „๋žต => ์–ด๋ ต๋‹ค
      • Paint Holding: ๊ฐ™์€ ์ถœ์ฒ˜(origin)์—์„œ ๋ผ์šฐํŒ…์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ, ์ด์ „ ํŽ˜์ด์ง€์˜ ๋ชจ์Šต์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋ฒ•
      • back forward cache(bfcache): ์•ž์œผ๋กœ ๊ฐ€๊ธฐ ๋’ค๋กœ ๊ฐ€๊ธฐ ํŽ˜์ด์ง€ ์บ์‹ฑ
      • Shared Element Transitions: ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ์‹œ, ๋™์ผ ์š”์†Œ ์ฝ˜ํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ
  • ํ˜„๋Œ€์˜ SSR (Next.js, Remix)
    • ์ตœ์ดˆ ์›น ์‚ฌ์ดํŠธ ์ง„์ž… ์‹œ, SSR
    • ์ดํ›„ ๋ผ์šฐํŒ…, SPA๊ฐ™์ด ์ž‘๋™
    • ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด, LAMP ์Šคํƒ๊ณผ ๋‹ค๋ฆ„์—†๋Š” MPA๋ฅผ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๊ฑฐ๋‚˜, ์„œ๋ฒ„์—์„œ ์•”์‹œ๋กฑ ์•ˆํ•˜๋Š” SPA ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
  • ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์ˆ™์ง€ํ•˜๊ณ , ๊ฐ ์žฅ์ ์„ ์ทจํ•˜๋Š” ์›น ์„œ๋น„์Šค ๊ตฌ์ถ• =>
  • ํ•„์š”์— ๋”ฐ๋ผ ๋งž๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.