2024-04-20.md

๐Ÿก

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

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


DIL-week7-5_2024-04-20

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ---------- | --------------------------------------------------------------------------------------- | ----------- | | 7์ฃผ์ฐจ | 12์žฅ, 13์žฅ | ๋ชจ๋“  ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•  ํ•ต์‹ฌ ์›น ์ง€ํ‘œ, ์›น ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• | 816~873p |

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


์›น ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•

create-next-app

  • NextWebVitalsMetric

| ์ง€ํ‘œ | ๋‚ด์šฉ | ์‹œ๊ฐ„ | | ------------------------------ | ------------------------------------------------------------ | ------------------ | | Next.js-hydration | ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ ๋žœ๋”๋ง๋˜์–ด ํ•˜์ด๋“œ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ | ํ•˜์ด๋“œ๋ ˆ์ด์…˜ | | Next.js-route-change-to-render | ํŽ˜์ด์ง€๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ํŽ˜์ด์ง€๋ฅผ ๋žœ๋”๋งํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ | ํŽ˜์ด์ง€ ์ „ํ™˜ | | Next.js-render | ๊ฒฝ๋กœ ๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋œ ํ›„ ํŽ˜์ด์ง€๋ฅผ ๋žœ๋”๋งํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ | ์ „ํ™˜์— ๋”ฐ๋ฅธ ๋žœ๋”๋ง |

Google Lighthouse

  • ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค ์ธก์ • ๋„๊ตฌ, ์˜คํ”ˆ ์†Œ์Šค๋กœ ์šด์˜ ์ค‘
  • ํ•ต์‹ฌ ์›น ์ง€ํ‘œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ ‘๊ทผ์„ฑ, PWA, SEO ๋“ฑ ์ธก์ • ๋ฐ ์ ๊ฒ€
  • ๋ฐฉ๋ฒ•
    1. ํฌ๋กฌ ์ต์Šคํ…์…˜: ํฌ๋กฌ, ํŒŒํญ
    2. ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ: ๋‚ด์žฅ
    3. CLI: lighthouse ํŒจํ‚ค์ง€

Lighthouse - Navigation, ํƒ์ƒ‰๋ชจ๋“œ

  • ํŽ˜์ด์ง€์— ์ ‘์†ํ–ˆ์„ ๋•Œ๋ถ€ํ„ฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€์˜ ์„ฑ๋Šฅ

| ๊ตฌ๋ถ„ | ํ•œ๊ธ€ | ๋‚ด์šฉ | | ------------------- | ---------------- | ----------------------------------------------------------------------------- | | Performance | ์„ฑ๋Šฅ | ํ•ต์‹ฌ ์›น ์ง€ํ‘œ: FCP, LCP, CLS ๊ทธ ์™ธ: TTI, Speed Index, Total Blocking Time | | Accessibility | ์ ‘๊ทผ์„ฑ | ๋Œ€์ฒด ๋ฌธ์ž, HTML + CSS ๋Œ€์•ˆ ์‚ฝ์ž… | | Best Practice | ๊ถŒ์žฅ์‚ฌํ•ญ | ๋ณด์•ˆ, ํ‘œ์ค€ ๋ชจ๋“œ, ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์†Œ์Šค ๋งต | | SEO | ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” | ๋ฌธ์„œ ํฌ๋กค๋ง, robots.txt ์œ ํšจ, meta ๋ฐ์ดํ„ฐ | | Progressive Web App | PWA | |

  • TTI, Time to Interactive
    • ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ธก์ • | TTI | ๊ธฐ์ค€ ๊ฒฐ๊ณผ | | ------- | --------- | | >3800ms | ์ข‹์Œ | | >7300ms | ๋ณดํ†ต | | โ‰ค7300ms | ๋‚˜์จ |
  • Speed Index
    • ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์ฝ˜ํ…์ธ ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ๊ณ„์‚ฐ
      • ์–ด๋–ป๊ฒŒ? - ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋กœ๋“œ๋˜๋Š” ํŽ˜์ด์ง€ ์‹ค์‹œ๊ฐ„ ์บก์ณ - Speedline ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์บก์ณ๋œ ์ด๋ฏธ์ง€ ๋ถ„์„ | Speed Index | ๊ธฐ์ค€ ๊ฒฐ๊ณผ | | ----------- | --------- | | >3400ms | ์ข‹์Œ | | >5800ms | ๋ณดํ†ต | | โ‰ค5800ms | ๋‚˜์จ |
  • Total Blocking Time
    • ๊ธด ์ž‘์—… โ‡’ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ํŠน์ • ์‹œ๊ฐ„(50ms) ์ด์ƒ ์‹คํ–‰๋˜๋Š” ์ž‘์—… โ‡’ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ
    • ์ด ์ฐจ๋‹จ ์‹œ๊ฐ„์€?
      • ๊ธด ์ž‘์—…์„ ์ „๋ถ€ ๋ชจ์•„์„œ ๊ฐ๊ฐ์˜ ์ž‘์—…์—์„œ 50ms๋ฅผ ๋บ€ ํ›„ ํ•ฉํ•จ
    • ๋Œ€์ƒ์€?
      • FCP๋ถ€ํ„ฐ TTI ์‚ฌ์ด์˜ ์ž‘์—…
      • ์ฆ‰, ์ตœ์ดˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์คฌ์„ ๋•Œ๋ถ€ํ„ฐ, ์ƒํ˜ธ ์ž‘์šฉ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์‚ฌ์ด์˜ ์ž‘์—…
        • ์‚ฌ์šฉ์ž ์ž…์žฅ โ‡’ ํ™”๋ฉด์— ๋ญ”๊ฐ€ ์žˆ๋Š”๋ฐ? ํŽ˜์ด์ง€๊ฐ€ ์•ˆ ์›€์ง์ธ๋‹ค (์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€ ์ž‘์—…์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑŒ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„)

์ ‘๊ทผ์„ฑ

  • ์›น ์ ‘๊ทผ์„ฑ์€, ์‹ ์ฒด์ ์œผ๋กœ ๋ถˆํŽธํ•œ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž์™€ ๋™๋“ฑํ•˜๊ฒŒ ์›นํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ
    • ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ง€์›
      • ๋Œ€์ฒด ๋ฌธ์ž, HTML + CSS ๋Œ€์•ˆ ์‚ฝ์ž…

๊ถŒ์žฅ์‚ฌํ•ญ

  • CSP, Content Security Policy๊ฐ€ XSS, Cross-Site Scripting์— ํšจ๊ณผ์ ์ธ๊ฐ€
    • ์ œ 3์ž ์‚ฝ์ž… ์Šคํฌ๋ฆฝํŠธ ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•œ ์š”์†Œ ex) eval, dangerouslySetInnerHTML ๋“ฑ
      • unsafe-inline, unsafe-eval
    • CSP๊ฐ€ ์—„๊ฒฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋น„์Šทํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํŽ˜์ด์ง€์—์„œ ๊ฐ์ง€๋˜๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์•Œ๋ ค์ง„ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ๋Š” JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์ธ
  • HTTPS ํ™•์ธ
  • ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ, ๊ถŒํ•œ ์š”์ฒญ ๋ฐฉ์ง€ โ‡’ ๋‹ค์งœ๊ณ ์งœ x, ์‚ฌ์šฉ์ž ์•ก์…˜ ์‹œ์— ๊ถŒํ•œ์š”์ฒญ&์‹คํ–‰
    • ์œ„์น˜์ •๋ณด: window.navigator.geolocation.getCurrentPosition(), watchPosition()
    • ์•Œ๋ฆผ: Notification.requestPermission()
  • ๋น„๋ฐ€๋ฒˆํ˜ธ input ๋ณต๋ถ™ ํ—ˆ์šฉ
  • ์ด๋ฏธ์ง€
    • ๊ฐ€๋กœ์„ธ๋กœ๋น„์œจ ์ผ์น˜ ํ™•์ธ
    • ์ด๋ฏธ์ง€ ํ•ด์ƒ๋„
  • ํŽ˜์ด์ง€ HTML Doctype

    ๊ณผ๊ฑฐ์—๋Š” ์›น ํ‘œ์ค€์ด ์•„์ง ์™„์ „ํžˆ ์ •์ฐฉ๋˜์ง€ ์•Š์•˜๊ณ , ๋‹ค์–‘ํ•œ ์›น ๋ธŒ๋ผ์šฐ์ €๋“ค์ด ๋…์ž์ ์œผ๋กœ ๋ Œ๋”๋ง ์—”์ง„์„ ๊ฐœ๋ฐœํ•˜์—ฌ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” DOCTYPE ์„ ์–ธ์ด ๋งค์šฐ ์ค‘์š”ํ–ˆ๋Š”๋ฐ, ์ด์ „์˜ HTML ๋ฒ„์ „๋“ค๊ณผ ๊ฐ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ๋™ํ•˜๊ธฐ ์œ„ํ•ด DOCTYPE ์„ ์–ธ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ex) ๋„ท์Šค์ผ€์ดํ”„(Netscape)์™€ ์ต์Šคํ”Œ๋กœ๋Ÿฌ(Internet Explorer)๊ฐ€ ์ฃผ์š” ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. HTML5๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค์–‘ํ•œ HTML ๋ฒ„์ „๋“ค์ด ์กด์žฌํ–ˆ๊ณ , ๊ฐ๊ฐ์˜ DOCTYPE ์„ ์–ธ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, HTML 4.01 Transitional, HTML 4.01 Strict, XHTML 1.0 Transitional, XHTML 1.0 Strict ๋“ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ DOCTYPE ์„ ์–ธ๋“ค์€ ํ•ด๋‹นํ•˜๋Š” ๋ฒ„์ „์˜ ๊ทœ๊ฒฉ์— ๋”ฐ๋ผ ๋ฌธ์„œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ HTML5์˜ ๋“ฑ์žฅ์œผ๋กœ DOCTYPE ์„ ์–ธ์ด ํ›จ์”ฌ ๊ฐ„์†Œํ™”๋˜์—ˆ๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹จ์ˆœํžˆ **<!DOCTYPE html>**๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

    {/* HTML5 ์ด์ „ doctype ์˜ˆ์‹œ */}
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
     "http://www.w3.org/TR/html4/loose.dtd">
    
    {/* HTML5 ์ดํ›„ ๊ฐ„์†Œํ™” */}
    **<!DOCTYPE html>**
    
  • charset, ๋ฌธ์ž ์ง‘ํ•ฉ ์ •์˜
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ ๋ฐ”์ดํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์ •
    <head>
      <meta charset="utf-8" /> {/* UTF-8๋กœ ์ธ์ฝ”๋”ฉ */}
    </head>
    
  • ์ง€์› ์ค‘๋‹จ API๊ฐ€ ์žˆ๋‚˜
  • ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๋‚˜
  • ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— Issue ์‚ฌํ•ญ์ด ์žˆ๋‚˜
  • ์œ ํšจํ•œ ์†Œ์Šค๋งต
    • ์••์ถ•๋œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์›๋ณธ ์†Œ์Šค์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ํŒŒ์ผ
  • font-display: optional ํฐํŠธ๊ฐ€ ๋ฏธ๋ฆฌ ๋กœ๋“œ๋จ(๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์ž„์˜ ํฐํŠธ โ‡’ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ์—†๋Š” ๋žœ๋”๋ง)

๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”

  • ์›นํŽ˜์ด์ง€๊ฐ€ ๊ตฌ๊ธ€๊ณผ ๊ฐ™์€ ๊ฒ€์ƒ‰์—”์ง„์ด ์›นํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ๊ฐ€์„œ ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”
    • ๋ฌธ์„œ ํฌ๋กค๋ง, robots.txt ์œ ํšจ, meta ๋ฐ์ดํ„ฐ

Lighthouse - Timespan

  • ์‹ค์ œ ์›น ํŽ˜์ด์ง€๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋™์•ˆ์˜ ์ง€ํ‘œ ์ธก์ •

| ๊ตฌ๋ถ„ | ํ•œ๊ธ€ | ๋‚ด์šฉ | | -------------------------------------------- | -------- | --------------------------------------------------------------------------- | | Performance | ์„ฑ๋Šฅ | ํ•ต์‹ฌ ์›น ์ง€ํ‘œ: FCP, LCP, CLS | | ๊ทธ ์™ธ: TTI, Speed Index, Total Blocking Time | | Best Practice | ๊ถŒ์žฅ์‚ฌํ•ญ | ๋ณด์•ˆ, ํ‘œ์ค€ ๋ชจ๋“œ, ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์†Œ์Šค ๋งต | | View Trace | ํ”์  | ์‹œ๊ฐ„์— ํ๋ฆ„์— ๋”ฐ๋ฅธ ์›น ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ƒ์„ธ | | Tree Map | ํŠธ๋ฆฌ๋งต | ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ๋กœ๋”ฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ์•„๋ณผ ์ˆ˜ ์žˆ์Œ, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ, ๋ฆฌ์†Œ์Šค ๋น„์œจ |

  • Tree Map
    • ๊ฐ ๋ฆฌ์†Œ์Šค์™€ ํฌ๊ธฐ
    • ๊ฐ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ฐ”์ดํŠธ ํฌ๊ธฐ

Lighthouse - Snapshot

  • ํ˜„์žฌ ํŽ˜์ด์ง€ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„์„

WebPageTest

  • ์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ - ํ…Œ์ŠคํŠธํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ๋จธ๋ฏ€๋กœ ์ฐธ๊ณ (๋ฏธ๊ตญ/์ธ๋„/์บ๋‚˜๋‹ค/๋…์ผ)

| ๋ถ„์„ ๋„๊ตฌ | ๊ธฐ๋Šฅ | | ----------------- | -------------------------------------------------------------- | | Site Performance | ์›น ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ๋ถ„์„ | | Core Web Vitals | ์›น ์‚ฌ์ดํŠธ ํ•ต์‹ฌ ์›น ์ง€ํ‘œ ํ™•์ธ | | Lighthouse | ๊ตฌ๊ธ€ ๋ผ์ดํŠธํ•˜์šฐ์Šค | | Visual Comparison | 2๊ฐœ ์ด์ƒ์˜ ์‚ฌ์ดํŠธ ๋™์‹œ์— ์‹คํ–‰, ์‹œ๊ฐ„ ํ๋ฆ„์— ๋”ฐ๋ฅธ ๋กœ๋”ฉ ๊ณผ์ • ๋น„๊ต | | Traceroute | ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ ํ™•์ธ |

image

  • Performance Summary

    • Opportunities & Experiments - Is It Quick: TTFB, ์ฝ˜ํ…์ธ  ๋žœ๋”๋ง, LCP - Is It Usable - Is It Resilient image image
  • run 3 times: Individual Runs image

  • ๊ธฐ๋Šฅ

    • TTFB ์ ๊ฒ€
    • TBT, Total Blocking Time, ๋žœ๋”๋ง ๋ธ”๋กœํ‚น ํ™•์ธ: CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    • FCP๊ฐ€ 2.5์ดˆ ์ด๋‚ด์ธ์ง€ ํ™•์ธ
  • ๊ฐœ์„  ๋ฐฉ์•ˆ ์ œ๊ณต

    • ์ฃผ์š” ์˜์—ญ ๊ธฐ์ค€, lazy-loading ์—ฌ๋ถ€ ํ™•์ธ
    • ํฐํŠธ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•œ ๋ฌธ์ž ๋…ธ์ถœ ์ง€์—ฐ ํ™•์ธ
      • ํฐํŠธ ์บ์‹ฑ๊ณผ 3์ž ํ˜ธ์ŠคํŠธ / https://wicki.io/posts/2020-11-goodbye-google-fonts/
        • CDN์— ์บ์‹œ๋˜์–ด ์žˆ๋Š” ์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„ ์—†์ด, ๋ชจ๋“  ์›น ์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œ
      • rel=preload, rel=preconnect๋กœ ๋ฏธ๋ฆฌ ์˜ค๋ฆฌ์ง„์— ์—ฐ๊ฒฐ
    • ๋ฆฌ์†Œ์Šค preload ํ™•์ธ
    • HTTP ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ฆฌ์†Œ์Šค ์—ฌ๋ถ€
      • ์ถ”๊ฐ€์ ์ธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์œ ๋ฐœํ•˜๊ธฐ ๋–„๋ฌธ์— ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์Œ. โ‡’ ๊ฐ€๋Šฅํ•œํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผํ•จ
    • ์ตœ์ดˆ ๋‹ค์šด๋กœ๋“œ HTML์™€ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ HTML ์‚ฌ์ด์˜ ํฌ๊ธฐ ๋น„๊ต
    • Snyk ๊ฒ€์ถœ ๋ณด์•ˆ ์œ„ํ˜‘ ํ™•์ธ
  • Filmstrip image

  • Optimizations

    • Keep-Alive: ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ ์œ ์ง€
    • Gzip ๋ฆฌ์†Œ์Šค ์••์ถ•
    • ์ด๋ฏธ์ง€ ์••์ถ•
    • Progressive JPEG ๋žœ๋”๋ง (๋ธ”๋Ÿฌ ๋žœ๋”๋ง)
    • ๋ฆฌ์†Œ์Šค ์บ์‹œ ์ •์ฑ…, CDN

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ

  • performance insights์— throttling ์„ค์ • ์žˆ์Œ
  • forced style recalculation: ๋งŽ์€ ๋ฆฌ์†Œ์Šค ์†Œ์š”, ์ตœ์ดˆ ๋กœ๋”ฉ ์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

์ •๋ฆฌ

  • npm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ~ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
    • ์ธก์ • ๋„๊ตฌ๋Š” ๋‹ฌ๋ผ๋„, ์–ด๋–ค ์ ์„ ๊ณ ์ณ์•ผํ•˜๋Š” ์ง€ ํƒ์ƒ‰ํ•˜๋Š” ๋ชฉ์ 
      • HTML, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, CSS ๊ธฐ๋ณธ โ†’ ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ง€์ผœ์•ผ ํ•  ์ฒ ์น™ ์ค€์ˆ˜
    • ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ธฐ
  • ์ฐธ๊ณ ์ž๋ฃŒ
    • https://blog.webpagetest.org/
    • https://web.dev/
    • https://developer.chrome.com/docs/devtools/overview?hl=ko
    • https://developer.chrome.com/docs/lighthouse/overview?hl=ko