πŸ“¦ μž‘λ™μ‚¬λ‹ˆ

ν•˜λ‚˜μ˜ ν‚€μ›Œλ“œλ₯Ό 작고 μ’€ νŽΈν•˜κ²Œ μ •λ¦¬ν•˜κ³  μ‹Άμ–΄ λ§Œλ“  μž‘λ™μ‚¬λ‹ˆ

μž‘λ™μ‚¬λ‹ˆλŠ” μ‘°μ„  ν›„κΈ° ν•™μž μ•ˆμ •λ³΅μ΄ νŽΈμ°¬ν•œ μž‘λ™μ‚°μ΄(ι›œεŒζ•£η•°)μ—μ„œ 유래된 말이닀.
μž‘λ™μ‚°μ΄λŠ” 작기(ι›œθ¨˜)의 ν˜•νƒœλ₯Ό 빌렀온 μ±…μœΌλ‘œ ꡬ체적인 체계가 μž‘ν˜€μžˆμ§€ μ•Šμ€ ν˜•μ‹μ΄λ‹€.
ν•­λͺ©μ΄ λ‹€μ†Œ λ‚œμž‘ν•˜κ³  λ‚΄μš©μ˜ ꡬ뢄이 ν˜Όλ™λ˜μ–΄μžˆλ‹€κ³  ν•œλ‹€. 🀣

듀어가기에 μ•žμ„œ

이 글은 μ›ν‹°λ“œμ—μ„œ μ£Όκ΄€ν•˜λŠ” ν”„λ¦¬μ˜¨λ³΄λ”© ν”„λ‘ νŠΈμ—”λ“œ μ±Œλ¦°μ§€ 8μ›” - λ¦¬μ•‘νŠΈ λ¦¬νŒ©ν† λ§ μ‹€μ „κ°€μ΄λ“œ: ν…ŒμŠ€νŠΈλΆ€ν„° μ΅œμ ν™”κΉŒμ§€ 에 μ œμΆœν•  μ‚¬μ „κ³Όμ œλ₯Ό 기반으둜 μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.

πŸ—‚οΈ 1) ν…ŒμŠ€νŠΈ

1-1) μœ λ‹›ν…ŒμŠ€νŠΈ vs ν†΅ν•©ν…ŒμŠ€νŠΈ vs E2Eν…ŒμŠ€νŠΈλ₯Ό λΉ„κ΅ν•˜μ—¬ μ„€λͺ…ν•΄μ£Όμ„Έμš”

μœ λ‹›ν…ŒμŠ€νŠΈ

  • μ‹€ν–‰ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ μ†Œν”„νŠΈμ›¨μ–΄(주둜 ν•¨μˆ˜)λ₯Ό ν…ŒμŠ€νŠΈ
  • 일반적으둜 ν•¨μˆ˜, class의 method λ‹¨μœ„λ‘œ μ§„ν–‰ν•œλ‹€.
  • κ°€μž₯ μž‘μ€ λ‹¨μœ„λ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ”λ§ŒνΌ 쒀더 직관적이고 λΉ λ₯Έ ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•˜λ‹€.
  • 사싀상 ν…ŒμŠ€νŠΈμ˜ 기본이라고 ν•  수 μžˆλ‹€.
  • JS μ§„μ˜μ—μ„œλŠ” 주둜 Jestλ₯Ό μ‚¬μš©ν•œλ‹€.
// sum.test.js

const sum = (a, b) => a + b;

describe('λ”ν•˜κΈ°', () => {
  it('1κ³Ό 2λ₯Ό λ”ν•˜λ©΄ 3이 λ°˜ν™˜λœλ‹€.', () => {
    expect(sum(1, 2)).toBe(3);
  });
});

ν†΅ν•©ν…ŒμŠ€νŠΈ

  • μœ λ‹›ν…ŒμŠ€νŠΈλ³΄λ‹€λŠ” 큰 λ‹¨μœ„μ˜ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό ν…ŒμŠ€νŠΈ
  • κ°œλ°œμžκ°€ λ³€κ²½ν•  수 μ—†λŠ” μ™ΈλΆ€ μ˜μ‘΄μ„±μ„ 가진 λͺ¨λ“ˆμ„ ν…ŒμŠ€νŠΈν•  λ•Œ μ‚¬μš©ν•œλ‹€.
    • ex) DB에 μ ‘κ·Όν•˜λŠ” 것, λ‹€λ₯Έ λͺ¨λ“ˆμ„ import ν•˜λŠ” 것, μ™ΈλΆ€ APIλ₯Ό ν˜ΈμΆœν•˜λŠ” 것 λ“±
  • ν…ŒμŠ€νŠΈμ˜ λ²”μœ„κ°€ 넓어지기 λ•Œλ¬Έμ— μœ λ‹›ν…ŒμŠ€νŠΈλ³΄λ‹€ μ—λŸ¬ κ²€μΆœμ΄ μ–΄λ ΅λ‹€.
  • 사싀상 μœ λ‹›ν…ŒμŠ€νŠΈμ˜ ν™•μž₯판이라고 ν•  수 μžˆλ‹€.
  • JS μ§„μ˜μ—μ„œλŠ” 주둜 Jestλ₯Ό μ‚¬μš©ν•œλ‹€.
// sum.test.js

import sum from './sum'; // μ™ΈλΆ€μ˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ κ°€μ Έμ˜¨ ν•¨μˆ˜λΌκ³  μƒκ°ν•˜μž

describe('λ”ν•˜κΈ°', () => {
  it('1κ³Ό 2λ₯Ό λ”ν•˜λ©΄ 3이 λ°˜ν™˜λœλ‹€.', () => {
    expect(sum(1, 2)).toBe(3);
  });
});

E2Eν…ŒμŠ€νŠΈ

  • End to End ν…ŒμŠ€νŠΈμ˜ μ•½μžλ‘œ, μ‚¬μš©μžμ˜ μ‹œμ μ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•œλ‹€.
  • μ†Œν”„νŠΈμ›¨μ–΄μ˜ λ‚΄λΆ€ μ½”λ“œ ꡬ쑰λ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ°λ³΄λ‹¨ λΉ„μ¦ˆλ‹ˆμŠ€μͺ½μ— μ΄ˆμ μ„ 두고 μ‚¬μš©μžκ°€ μ‚¬μš©ν•˜λŠ” κ΄€μ μ—μ„œ λ™μž‘μ΄ 잘 λ˜λŠ”μ§€λ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€.
  • Acceptance Test(인수 ν…ŒμŠ€νŠΈ), UI Test라고도 λΆˆλ¦°λ‹€.
  • JS μ§„μ˜μ—μ„œλŠ” 주둜 Cypressλ₯Ό μ‚¬μš©ν•œλ‹€.
// sum.spec.js

describe('λ”ν•˜κΈ°', () => {
  it('1κ³Ό 2λ₯Ό λ”ν•˜λ©΄ 3이 λ°˜ν™˜λœλ‹€.', () => {
    cy.visit('http://localhost:3000');
    cy.get('input[name="a"]').type('1');
    cy.get('input[name="b"]').type('2');
    cy.get('button[type="submit"]').click();
    cy.get('div[name="result"]').should('have.text', '3');
  });
});

1-2) λ¦¬μ•‘νŠΈ ν…ŒμŠ€νŠΈμ— μ‚¬μš©λ˜λŠ” 도ꡬ듀을 λΉ„κ΅ν•˜μ—¬ μ„€λͺ…ν•΄μ£Όμ„Έμš”

ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•œλ‹€λŠ” 것은

ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” 방법은 크게 2가지가 μžˆλ‹€.

  1. HTML νŽ˜μ΄μ§€λ₯Ό λ§Œλ“€κ³  JS ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ λΈŒλΌμš°μ €μ—μ„œ 직접 ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” 방법
  2. Headless λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜μ—¬ λΈŒλΌμš°μ €λ₯Ό λ„μš°μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” 방법
    • Headless λΈŒλΌμš°μ €: λΈŒλΌμš°μ €μ˜ 화면을 λ„μš°μ§€ μ•Šκ³  λΈŒλΌμš°μ €μ˜ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλŠ” λΈŒλΌμš°μ €(주둜 λΈŒλΌμš°μ €μ˜ Headless modeλ₯Ό μ‚¬μš©ν•œλ‹€.)
    • μš°λ¦¬κ°€ 일반적으둜 μ‚¬μš©ν•˜λŠ” 크둬, νŒŒμ΄μ–΄ν­μŠ€ λ“±μ˜ λΈŒλΌμš°μ €λŠ” Headful λΈŒλΌμš°μ €λΌκ³  ν•œλ‹€.
  3. λΈŒλΌμš°μ €κ°€ μ•„λ‹Œ Node.js ν™˜κ²½μ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” 방법 => λ‹Ήμ—°νžˆ 직접 λ Œλ”λ§μ„ ν•  μˆ˜λŠ” μ—†κ³  jsdomκ³Ό 같은 가상 DOM(ν˜Ήμ€ 가상 λΈŒλΌμš°μ €)λ₯Ό μ‚¬μš©ν•œλ‹€.
    • 이 λ•Œ, λΈŒλΌμš°μ €μ˜ Headless modeμ™€λŠ” λ‹€λ₯΄λ‹€. Headless modeλŠ” μ‹€μ œ λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ λΈŒλΌμš°μ €μ˜ 화면을 λ„μš°μ§€ μ•ŠλŠ” 것이닀.

3번의 방법을 μΆ”μ²œν•œλ‹€. λ˜ν•œ, 일반적으둜 3번의 방법이 자주 μ‚¬μš©λœλ‹€.

ν…ŒμŠ€νŒ… 툴 in JS

ν…ŒμŠ€νŒ… νˆ΄λ“€μ˜ μ’…λ₯˜λŠ” 맀우 λ§Žλ‹€. ν•˜λ‚˜μ˜ κΈ°λŠ₯λ§Œμ„ μ œκ³΅ν•˜λŠ” 것듀뢀터 μ—¬λŸ¬ κΈ°λŠ₯을 μ‘°ν•©ν•΄μ„œ μ œκ³΅ν•˜λŠ” κ²ƒλ“€κΉŒμ§€ 말이닀. 보톡은 ν›„μžμ˜ ν…ŒμŠ€νŒ… νˆ΄μ„ μ‚¬μš©ν•œλ‹€.

πŸ—‚οΈ μ΅œμ ν™”

CDN(Content Distributed Network)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • 전세계 μ—¬λŸ¬ 지역에 λΆ„μ‚°λœ μ„œλ²„ λ„€νŠΈμ›Œν¬λ‘œ μœ μ €μ—κ²Œ μ›Ήμ‚¬μ΄νŠΈ μ½˜ν…μΈ λ₯Ό 효율적이고 λΉ λ₯΄κ²Œ μ „λ‹¬ν•˜λŠ” 역할을 ν•œλ‹€.
  • μ›Ήμ‚¬μ΄νŠΈμ˜ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜κ³  데이터 λ‘œλ”© μ‹œκ°„μ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ„œλ²„λ“€μ΄ μ—¬λŸ¬ 곳에 λΆ„μ‚° λ°°μΉ˜λ˜μ–΄ μžˆλ‹€.
    • 일반적으둜 μœ μ €κ°€ μ›Ήμ‚¬μ΄νŠΈμ— μ—‘μ„ΈμŠ€ν•˜λ €λ©΄ ν•΄λ‹Ή μ›Ήμ‚¬μ΄νŠΈμ˜ 원격 호슀트 μ„œλ²„λ‘œλΆ€ν„° 정보λ₯Ό κ°€μ Έμ™€μ•Όν•˜λŠ”λ°, 거리가 λ©€μˆ˜λ‘ 더 λ§Žμ€ μ‹œκ°„μ΄ μ†Œλͺ¨λœλ‹€.
  • CDN은 μ›Ήμ‚¬μ΄νŠΈμ˜ μ½˜ν…μΈ λ₯Ό μ—¬λŸ¬ 지역에 μœ„μΉ˜ν•œ μ—¬λŸ¬ μ„œλ²„μ— λ³΅μ œν•˜μ—¬, μœ μ €κ°€ μ›Ήμ‚¬μ΄νŠΈμ— 접속할 λ•Œ κ°€μž₯ κ°€κΉŒμš΄ μ„œλ²„μ—μ„œ μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•œλ‹€.
    • 전솑 μ‹œκ°„μ΄ 쀄어든닀.
    • μ›Ήμ‚¬μ΄νŠΈμ˜ λ‘œλ”© μ‹œκ°„μ΄ λ‹¨μΆ•λœλ‹€.
    • νŠΈλž˜ν”½μ΄ λΆ„μ‚°λ˜μ–΄ 원격 호슀트 μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄일 수 μžˆλ‹€.

Web Vitals에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • UX(μ‚¬μš©μž κ²½ν—˜)λ₯Ό ν‰κ°€ν•˜κ³  κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ›Ή μ„±λŠ₯ μΈ‘μ • μ§€ν‘œ
  • Googleμ—μ„œ μ œκ³΅ν•˜λŠ” Web VitalsλŠ” μ›Ή νŽ˜μ΄μ§€μ˜ λ‘œλ”© 속도, μƒν˜Έμž‘μš© κ°€λŠ₯μ„±, μ‹œκ°μ • μ•ˆμ •μ„± 등을 μΈ‘μ •ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ ν’ˆμ§ˆμ„ ν‰κ°€ν•˜κ³  κ°œμ„ ν•˜λŠ” 데 도움을 μ€€λ‹€.

크게 3가지 μ§€ν‘œκ°€ μžˆλ‹€.

Largest Contentful Paint(LCP)

  • μœ μ €κ°€ μ›Ή νŽ˜μ΄μ§€λ₯Ό 처음으둜 λ³Ό λ•Œ κ°€μž₯ 큰 μ½˜ν…μΈ  μš”μ†Œκ°€ 화면에 ν‘œμ‹œλ˜λŠ” μ‹œκ°„
  • 일반적으둜 μ΄λ―Έμ§€λ‚˜ ν…μŠ€νŠΈ 블둝과 같은 λŒ€ν˜• μš”μ†Œκ°€ κ°€μž₯ 큰 μ½˜ν…μΈ κ°€ λœλ‹€.
  • 쒋은 UXλ₯Ό μœ„ν•΄μ„œλŠ” LCPκ°€ μ›Ή νŽ˜μ΄μ§€μ˜ λ‘œλ”© μ‹œκ°„ 내에 λ°œμƒν•΄μ•Ό ν•˜λ©°, 2.5초 μ΄λ‚΄λ‘œ μ™„λ£Œλ˜λŠ” 것이 ꢌμž₯λœλ‹€.

First Input Delay(FID)

  • μ›Ή νŽ˜μ΄μ§€κ°€ λ‘œλ”©λœ ν›„, μœ μ €μ˜ 첫 번째 μƒν˜Έμž‘μš©(클릭, ν„°μΉ˜ λ“±)κ³Ό μ‹€μ œλ‘œ λΈŒλΌμš°μ €κ°€ ν•΄λ‹Ή μƒν˜Έμž‘μš©μ— μ‘λ‹΅ν•˜λŠ” μ‹œκ°„
  • μ›Ή νŽ˜μ΄μ§€κ°€ μ–Όλ§ˆλ‚˜ λΉ λ₯΄κ²Œ λŒ€ν™”ν˜•μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€ λ‚˜νƒ€λ‚΄λ©°, μœ μ €κ°€ νŽ˜μ΄μ§€μ™€ μƒν˜Έμž‘μš©ν•˜κΈ°κΉŒμ§€ λŠλΌλŠ” 지연 μ‹œκ°„μ„ ν‰κ°€ν•œλ‹€.
  • 쒋은 UXλ₯Ό μœ„ν•΄μ„œλŠ” FIDκ°€ 100ms 미만이 λ˜λ„λ‘ μ΅œμ ν™”ν•˜λŠ” 것이 ꢌμž₯λœλ‹€.

Cumulative Layout Shift(CLS)

  • μ›Ή νŽ˜μ΄μ§€μ˜ λ‘œλ”©λœ λ™μ•ˆ μ½˜ν…μΈ μ˜ λ ˆμ΄μ•„μ›ƒ 변화에 λ”°λ₯Έ μ‹œκ°μ  μ•ˆμ •μ„±μ„ μΈ‘μ •ν•œλ‹€.
  • μœ μ €κ°€ λ²„νŠΌμ„ ν΄λ¦­ν•˜κ±°λ‚˜ 이미지가 λ™μ μœΌλ‘œ λ‘œλ“œλ˜λŠ” 경우 νŽ˜μ΄μ§€μ˜ λ ˆμ΄μ•„μ›ƒμ΄ 변경될 수 μžˆλ‹€. 이 λ•Œ, λ ˆμ΄μ•„μ›ƒμ˜ λ³€ν™”κ°€ μ‚¬μš©μž κ²½ν—˜μ— 뢀정적인 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ μ΅œμ ν™”ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.
  • 쒋은 UXλ₯Ό μœ„ν•΄μ„œλŠ” CLSκ°€ 0.1 미만이 λ˜λ„λ‘ μ΅œμ ν™”ν•˜λŠ” 것이 ꢌμž₯λœλ‹€.
    • CLS에 λŒ€ν•œ 점수 μ‚°μΆœ 방법은 CLS 점수 μ‚°μΆœ 방법을 μ°Έκ³ ν•˜μž!
    • 정말 λ‹¨μˆœν•˜κ²Œ λ§ν•˜λ©΄ λ ˆμ΄μ•„μ›ƒ λ³€ν™”κ°€ 일어날 λ•Œλ§ˆλ‹€ λ³€ν™”λœ μš”μ†Œμ˜ 크기와 μœ„μΉ˜λ₯Ό κ³±ν•œ 값을 λͺ¨λ‘ λ”ν•œ 것이닀.

Web VitalsλŠ” μ›Ή νŽ˜μ΄μ§€ μ„±λŠ₯ 츑정을 μœ„ν•΄ Chrome λΈŒλΌμš°μ €μ™€ λ‹€λ₯Έ μ„±λŠ₯ μΈ‘μ • λ„κ΅¬λ“€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. Google Search Consoleμ—μ„œ μ›Ή νŽ˜μ΄μ§€μ˜ Web Vitals 데이터λ₯Ό ν™•μΈν•˜κ³  κ°œμ„  λ°©μ•ˆμ„ μ œμ‹œν•΄ μ€λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΈ‘μ • μ§€ν‘œλ₯Ό λ°”νƒ•μœΌλ‘œ μ›Ή κ°œλ°œμžλ“€μ€ μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€κ³  μ›Ή νŽ˜μ΄μ§€μ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Lighthouse에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”

  • LighthouseλŠ” Googleμ—μ„œ κ°œλ°œν•œ μ˜€ν”ˆ μ†ŒμŠ€λ‘œ, μžλ™ν™”λœ μ›Ή νŽ˜μ΄μ§€ μ„±λŠ₯ μΈ‘μ • 도ꡬ
  • μ›Ή νŽ˜μ΄μ§€μ˜ μ„±λŠ₯κ³Ό ν’ˆμ§ˆμ„ ν‰κ°€ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ μΈ‘μ • ν•­λͺ©λ“€μ„ μ‹€ν–‰ν•˜κ³  UXλ₯Ό κ°œμ„ ν•˜λŠ” 데 도움이 λ˜λŠ” ν”Όλ“œλ°±κ³Ό ꢌμž₯ 사항을 μ œκ³΅ν•œλ‹€.
  • LighthouseλŠ” Chrome λΈŒλΌμš°μ €μ˜ DevTools에 ν¬ν•¨λ˜μ–΄ 있으며, μ»€λ§¨λ“œ λΌμΈμ—μ„œλ„ μ‹€ν–‰ν•  수 μžˆλ‹€.
  1. μ„±λŠ₯ μ§€ν‘œ:
  • First Contentful Paint(FCP): μ›Ή νŽ˜μ΄μ§€κ°€ λ‘œλ”©λœ ν›„ 첫 번째 μ½˜ν…μΈ κ°€ 화면에 ν‘œμ‹œλ˜λŠ” μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.
  • Largest Contentful Paint(LCP): μ›Ή νŽ˜μ΄μ§€μ—μ„œ κ°€μž₯ 큰 μ½˜ν…μΈ  μš”μ†Œκ°€ 화면에 ν‘œμ‹œλ˜λŠ” μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€. Web Vitals의 ν•˜λ‚˜λ‘œλ„ μ‚¬μš©λœλ‹€.
  • Speed Index(SI): μ›Ή νŽ˜μ΄μ§€μ˜ λ‘œλ”© κ³Όμ •μ—μ„œ μ–Όλ§ˆλ‚˜ 빨리 μ½˜ν…μΈ κ°€ ν‘œμ‹œλ˜λŠ”μ§€μ— λŒ€ν•œ μΈ‘μ • μ§€ν‘œμž…λ‹ˆλ‹€.
  • Time to Interactive(TTI): μ›Ή νŽ˜μ΄μ§€κ°€ λ‘œλ”©λœ ν›„ μƒν˜Έμž‘μš© κ°€λŠ₯ν•œ μƒνƒœκ°€ λ˜λŠ” μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.
  • Total Blocking Time(TBT): μ›Ή νŽ˜μ΄μ§€κ°€ λ‘œλ”©λœ ν›„ μ‚¬μš©μžμ˜ μƒν˜Έμž‘μš©κ³Ό λΈŒλΌμš°μ €μ˜ 응닡 μ‚¬μ΄μ˜ 지연 μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€. Web Vitals의 ν•˜λ‚˜λ‘œλ„ μ‚¬μš©λœλ‹€.
  • Cumulative Layout Shift(CLS): μ›Ή νŽ˜μ΄μ§€μ˜ λ‘œλ”© 쀑 λ°œμƒν•˜λŠ” μ½˜ν…μΈ μ˜ μ‹œκ°μ  μ•ˆμ •μ„±μ„ μΈ‘μ •ν•œλ‹€. Web Vitals의 ν•˜λ‚˜λ‘œλ„ μ‚¬μš©λœλ‹€.
  1. ν’ˆμ§ˆ μΈ‘μ • ν•­λͺ©:
  • Accessibility(μ ‘κ·Όμ„±): μ›Ή νŽ˜μ΄μ§€κ°€ μ ‘κ·Όμ„± 지침을 λ”°λ₯΄κ³  μžˆλŠ”μ§€λ₯Ό ν‰κ°€ν•œλ‹€.
  • Best Practices(λͺ¨λ²” 사둀): μ›Ή νŽ˜μ΄μ§€κ°€ λͺ¨λ²” 사둀λ₯Ό λ”°λ₯΄κ³  μžˆλŠ”μ§€λ₯Ό ν‰κ°€ν•œλ‹€.
  • SEO(검색 엔진 μ΅œμ ν™”): μ›Ή νŽ˜μ΄μ§€μ˜ 검색 엔진 μ΅œμ ν™” μƒνƒœλ₯Ό ν‰κ°€ν•œλ‹€.
  • Progressive Web App(PWA; 점진적 μ›Ή μ•±): μ›Ή νŽ˜μ΄μ§€κ°€ 점진적 μ›Ή μ•±μœΌλ‘œμ„œμ˜ 쑰건을 μΆ©μ‘±ν•˜λŠ”μ§€λ₯Ό ν‰κ°€ν•œλ‹€.

LighthouseλŠ” μ΄λŸ¬ν•œ μ„±λŠ₯ μ§€ν‘œμ™€ ν’ˆμ§ˆ μΈ‘μ • ν•­λͺ©λ“€μ„ μ‚¬μš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ μ „λ°˜μ μΈ ν’ˆμ§ˆμ„ ν‰κ°€ν•˜κ³ , κ°œλ°œμžλ“€μ΄ μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ μ–΄λ–€ 뢀뢄을 κ°œμ„ ν•΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€. λ˜ν•œ, Lighthouse κ²°κ³Ό λ³΄κ³ μ„œλŠ” μ›Ή κ°œλ°œμžλ“€μ΄ μ„±λŠ₯ μ΅œμ ν™” μž‘μ—…μ„ μΆ”μ ν•˜κ³  κ²€μ¦ν•˜λŠ” 데도 μœ μš©ν•˜κ²Œ ν™œμš©λ  수 μžˆλ‹€.

μ°Έκ³