Web Vitals - ChoDragon9/posts GitHub Wiki

https://web.dev/vitals/

Web Vitals은 쒋은 UXλ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ Googleμ—μ„œ μ œμ•ˆν•˜λŠ” μ„±λŠ₯ ν’ˆμ§ˆ 지침이닀. Googleμ—μ„œ μ œκ³΅ν•œ 도ꡬ와 μΈ‘μ • ν•­λͺ©μ€ μˆ™λ ¨λ„μ— λ”°λΌμ„œ UX ν’ˆμ§ˆμ„ νŒŒμ•…ν•˜κΈ° νž˜λ“€λ‹€λŠ” 사싀을 λ°œκ²¬ν–ˆλ‹€. κ·Έλž˜μ„œ Web Vitals은 ν™˜κ²½μ„ λ‹¨μˆœν™”ν•΄μ„œ ν’ˆμ§ˆ κ°œμ„ μ— 도움이 λ˜λŠ” 것에 μ΄ˆμ μ„ λ§žμ·„λ‹€.

λ‘œλ”© μ‹œκ°„, μƒν˜Έμž‘μš© μ‹œκ°„, μ‹œκ°μ  λ³€ν™”λŸ‰ ν•­λͺ©μ— λŒ€ν•œ μ’‹μŒ/λ‚˜μ¨μ„ νŒλ‹¨ν•  수 μžˆλŠ” 숫자 λ²”μœ„λ₯Ό κ°€μ΄λ“œν•œλ‹€. μ„±λŠ₯ μΈ‘μ • ν•­λͺ© 쀑 μ£Όμš” μ§€ν‘œλŠ” Core Web Vitals둜 κ΅¬λΆ„ν•œλ‹€.

λ‘œλ”© μ‹œκ°„ μΈ‘μ • ν•­λͺ©

Time to First Byte (TTFB)

  • λΈŒλΌμš°μ €κ°€ νŽ˜μ΄μ§€ μ½˜ν…μΈ μ˜ 첫 번째 λ°”μ΄νŠΈλ₯Ό μˆ˜μ‹ ν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ˜λ―Έν•œλ‹€.
  • 600ms 이상 걸리면 λ‚˜μ¨μ„ μ˜λ―Έν•œλ‹€.

κ°œμ„  방법

  • μ„œλ²„μ˜ μ‘μš© ν”„λ‘œκ·Έλž¨ μ΅œμ ν™”
  • λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μΏΌλ¦¬ν•˜λŠ” 방법 μ΅œμ ν™”
  • 더 λ§Žμ€ λ©”λͺ¨λ¦¬ λ˜λŠ” CPUλ₯Ό 가지도둝 μ„œλ²„ ν•˜λ“œμ›¨μ–΄ μ—…κ·Έλ ˆμ΄λ“œ

First Contentful Paint (FCP)

  • νŽ˜μ΄μ§€ λ‘œλ“œκ°€ μ‹œμž‘λœ ν›„ νŽ˜μ΄μ§€ μ½˜ν…μΈ μ˜ 일뢀가 화면에 λ Œλ”λ§ 될 λ•ŒκΉŒμ§€μ˜ μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.
  • μ½˜ν…μΈ λŠ” ν…μŠ€νŠΈ, 이미지(λ°°κ²½ 이미지 포함), svg μš”μ†Œ λ˜λŠ” 흰색이 μ•„λ‹Œ canvas μš”μ†Œλ₯Ό μ˜λ―Έν•œλ‹€.

κ°œμ„  방법

  • λ‘œλ“œ
    • μš”μ²­ 수λ₯Ό 쀄이고 전솑 크기λ₯Ό μž‘κ²Œ μœ μ§€
    • ν•„μš”ν•œ μ˜€λ¦¬μ§„μ— 사전 μ—°κ²°
    • μ„œλ²„ 응닡 μ‹œκ°„(TTFB) κ°μ†Œ
    • μ—¬λŸ¬ νŽ˜μ΄μ§€ λ¦¬λ‹€μ΄λ ‰μ…˜ 방지
    • μš”μ²­ ν”„λ¦¬λ‘œλ“œ
    • 큰 νŽ˜μ΄λ‘œλ“œ 방지
    • 효율적인 μΊμ‹œ μ •μ±…μœΌλ‘œ 정적 에셋 제곡
    • CSS μš©λŸ‰ μ΅œμ ν™”
    • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” CSS 제거
    • μ€‘μš”ν•œ μš”μ²­ 깊이 μ΅œμ†Œν™”
    • μ›Ή 폰트 λ‘œλ“œ 쀑에 ν…μŠ€νŠΈκ°€ 계속 λ³΄μ΄λŠ”μ§€ 확인
    • λ Œλ”λ§ 차단 λ¦¬μ†ŒμŠ€ 제거
  • κ³Όλ„ν•œ DOM 크기 ν”Όν•˜κΈ°
    • λ„€νŠΈμ›Œν¬ νš¨μœ¨μ„±μ΄ 떨어짐
    • λŸ°νƒ€μž„μ— λ Œλ”λ§ 속도 μ €ν•˜
    • μ‚¬μš©μž 기기의 λ©”λͺ¨λ¦¬ μ„±λŠ₯ 영ν–₯

Largest Contentful Paint (LCP)

  • νŽ˜μ΄μ§€κ°€ 처음 λ‘œλ“œλ₯Ό μ‹œμž‘ν•œ μ‹œμ μ„ κΈ°μ€€μœΌλ‘œ 뷰포트 내에 ν‘œμ‹œλ˜λŠ” κ°€μž₯ 큰 이미지 λ˜λŠ” ν…μŠ€νŠΈ λΈ”λ‘μ˜ λ Œλ”λ§ μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.
  • img, imageλ‚΄μ˜ svg, video, url() λ°°κ²½, ν…μŠ€νŠΈλ₯Ό κ³ λ €ν•œλ‹€.
  • μ΄λ―Έμ§€λŠ” λ³΄μ΄λŠ” 크기와 고유 크기 쀑 더 μž‘μ€ 크기λ₯Ό κ³ λ €ν•œλ‹€.
  • ν…μŠ€νŠΈ μš”μ†Œμ˜ 경우 ν•΄λ‹Ή ν…μŠ€νŠΈ λ…Έλ“œμ˜ 크기만 κ³ λ €λœλ‹€.

κ°œμ„  방법

  • 느린 μ„œλ²„ 응닡 μ‹œκ°„μ„ μ΅œμ ν™”
  • JavaScript와 CSS 같은 λ Œλ”λ§ 차단 μš”μ²­ μ΅œμ ν™”
    • CSS μ΅œμ ν™”
    • JavaScript μ΅œμ ν™”
  • λ¦¬μ†ŒμŠ€ λ‘œλ”© μ‹œκ°„ μ΅œμ ν™”
    • μ›Ή 폰트 μ΅œμ ν™”
    • 이미지 μ΅œμ ν™”
    • PRPL νŒ¨ν„΄
      • Push(Preload), Render, Pre-cache, Lazy load
  • ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λ Œλ”λ§ μ΅œμ ν™”
    • CRP μ΅œμ ν™”

μƒν˜Έμž‘μš© μ‹œκ°„ μΈ‘μ • ν•­λͺ©

Total Blocking Time (TBT)

  • FCP와 TTI μ‚¬μ΄μ˜ 총 μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.
  • 메인 μŠ€λ ˆλ“œλŠ” 50ms 이상 μ‹€ν–‰λ˜λŠ” μž‘μ—…μΈ Long Taskκ°€ μžˆμ„ λ•Œ 차단 된 κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€.
  • FCP와 TTI 사이에 λ°œμƒν•˜λŠ” 각 Long Task의 차단 μ‹œκ°„μ˜ 합계가 TBTλ‹€.
  • 예λ₯Ό λ“€μ–΄ Long Task 250ms, 90msκ°€ μžˆλ‹€λ©΄ 각각 50msλ₯Ό μ œμ™Έν•œ 240msκ°€ TBTλ‹€.

κ°œμ„  방법

  • third-party μ½”λ“œ 영ν–₯ κ°μ†Œ
  • JavaScript μ‹€ν–‰ κ°μ†Œ
  • 메인 μ“°λ ˆλ“œ μ‹€ν–‰ μ΅œμ†Œν™”
  • 적은 μš”μ²­ μˆ˜μ™€ μž‘μ€ 응닡 μ‚¬μ΄μ¦ˆ

Time to Interactive (TTI)

  • νŽ˜μ΄μ§€κ°€ λ‘œλ“œ 되기 μ‹œμž‘ν•œ μ‹œμ λΆ€ν„° κΈ°λ³Έ ν•˜μœ„ λ¦¬μ†ŒμŠ€κ°€ λ‘œλ“œ 된 μ‹œμ κΉŒμ§€μ˜ μ‹œκ°„μ„ μΈ‘μ •ν•˜λ©° μ‚¬μš©μž μž…λ ₯이 κ°€λŠ₯ν•œ μ‹œμ μ„ μΈ‘μ •ν•œλ‹€.
  • FCPκ°€ μ‹œμž‘λ˜κ³ , 5초 λ™μ•ˆ 메인 μŠ€λ ˆλ“œλ₯Ό μ°¨λ‹¨ν•˜μ§€ μ•ŠλŠ” μ‹œκΈ°λ₯Ό μ°ΎλŠ”λ‹€. κ·Έ μ‹œκΈ°μ—μ„œ 과거둜 κ²€μƒ‰ν•˜λ©° Long Task의 μ’…λ£Œ μ‹œμ μ„ μ°ΎλŠ” λ‹€. κ·Έ μ‹œμ μ΄ TTI μ™„λ£Œ μ‹œμ μ΄λ‹€.

κ°œμ„  방법

  • JavaScript μ΅œμ†Œν™”
  • ν•„μš”ν•œ μ˜€λ¦¬μ§„μ— 사전 μ—°κ²°
  • μš”μ²­ preload
  • μ£Όμš” μš”μ²­ 깊이 μ΅œμ†Œν™”
  • TBT와 κ°™μŒ
    • third-party μ½”λ“œ 영ν–₯ κ°μ†Œ
    • JavaScript μ‹€ν–‰ κ°μ†Œ
    • 메인 μ“°λ ˆλ“œ μ‹€ν–‰ μ΅œμ†Œν™”
    • 적은 μš”μ²­ μˆ˜μ™€ μž‘μ€ 응닡 μ‚¬μ΄μ¦ˆ

First Input Delay (FID)

  • μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€μ— 처음 μΈν„°λ ‰μ…˜ ν•œ μ‹œκ°„λΆ€ν„° 이벀트 ν•Έλ“€λŸ¬ 처리λ₯Ό μ‹œμž‘ν•  수 μžˆλŠ” μ‹œκ°„κΉŒμ§€μ˜ μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.

κ°œμ„  방법

  • TBT와 κ°™μŒ
    • third-party μ½”λ“œ 영ν–₯ κ°μ†Œ
    • JavaScript μ‹€ν–‰ κ°μ†Œ
    • 메인 μ“°λ ˆλ“œ μ‹€ν–‰ μ΅œμ†Œν™”
    • 적은 μš”μ²­ μˆ˜μ™€ μž‘μ€ 응닡 μ‚¬μ΄μ¦ˆ

메인 μ“°λ ˆλ“œ μ‹€ν–‰ μ΅œμ†Œν™”

슀크립트 평가

  • third-party JavaScript μ΅œμ ν™”
  • μž…λ ₯ ν•Έλ“€λŸ¬ λ””λ°”μš΄μŠ€
  • μ›Ή μ›Œμ»€ μ‚¬μš©

μŠ€νƒ€μΌ 및 λ ˆμ΄μ•„μ›ƒ

  • μŠ€νƒ€μΌ κ³„μ‚°μ˜ λ²”μœ„μ™€ λ³΅μž‘μ„± κ°μ†Œ
  • 크고 λ³΅μž‘ν•œ λ ˆμ΄μ•„μ›ƒ 및 λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹± 방지

λ Œλ”λ§

  • 컴포지터 μ „μš© 속성에 μ‚¬μš© 및 λ ˆμ΄μ–΄ 수 관리
  • νŽ˜μ΄μ§€ λ³΅μž‘μ„±μ„ λ‹¨μˆœν™”ν•˜κ³  페인트 μ˜μ—­μ„ 쀄인닀.

μ‹œκ°μ  λ³€ν™”λŸ‰ μΈ‘μ • ν•­λͺ©

Cumulative Layout Shift (CLS)

  • νŽ˜μ΄μ§€μ—μ„œ λ°œμƒν•˜λŠ” λͺ¨λ“  예기치 μ•ŠλŠ” λ ˆμ΄μ•„μ›ƒ 이동에 λŒ€ν•œ λͺ¨λ“  κ°œλ³„ λ ˆμ΄μ•„μ›ƒ 이동 점수의 합계λ₯Ό μΈ‘μ •ν•œλ‹€.
  • CLS = 이동 거리 λΉ„μœ¨ x μ΄λ™ν•œ μ˜μ—­ λΉ„μœ¨

κ°œμ„  방법

  • 항상 이미지 및 λ™μ˜μƒ μš”μ†Œμ— 크기 속성을 포함
  • CSS κ°€λ‘œ, μ„Έλ‘œ λΉ„μœ¨ μƒμžμ™€ 같은 ν•­λͺ©μœΌλ‘œ ν•„μš”ν•œ 곡간을 μž‘λŠ”λ‹€.
  • μ‚¬μš©μž μƒν˜Έ μž‘μš©μ— λŒ€ν•œ 응닡을 μ œμ™Έν•˜κ³ λŠ” κΈ°μ‘΄ 컨텐츠 μœ„μ— 컨텐츠λ₯Ό μ‚½μž…ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λ ‡κ²Œν•˜λ©΄ λ ˆμ΄μ•„μ›ƒ 이동이 μ˜ˆμƒλœλ‹€.
  • λ ˆμ΄μ•„μ›ƒ 변경을 νŠΈλ¦¬κ±°ν•˜λŠ” μ†μ„±μ˜ μ• λ‹ˆλ©”μ΄μ…˜λ³΄λ‹€ transform μ• λ‹ˆλ©”μ΄μ…˜μœΌλ‘œ μ μš©ν•œλ‹€.

Core Web Vitals

μ„±λŠ₯ μΈ‘μ • ν•­λͺ© 쀑 μ£Όμš” μ§€ν‘œμΈ LCP, FID, CLSλ₯Ό μ˜λ―Έν•œλ‹€.

LCP의 μ’‹μŒ/λ‚˜μ¨ νŒλ‹¨ ꡬ간

  • μ’‹μŒ: 2500ms 미만
  • λ‚˜μ¨: 4000ms 초과

FID의 μ’‹μŒ/λ‚˜μ¨ νŒλ‹¨ ꡬ간

  • μ’‹μŒ: 100ms 미만
  • λ‚˜μ¨: 300ms 초과

CLS의 μ’‹μŒ/λ‚˜μ¨ νŒλ‹¨ ꡬ간

  • μ’‹μŒ: 0.1 미만
  • λ‚˜μ¨: 0.25 초과