개요 및 원칙

핵심: 오류 해결은 재현 → 관측 → 원인 분리 → 수정 → 검증 → 회귀 테스트의 순환입니다. 표준 준수와 접근성은 문제 예방의 가장 강력한 기본기입니다.

일반 오류 유형과 빠른 진단

콘솔 에러/경고

증상: 브라우저 콘솔에 빨간 에러, 노란 경고가 반복적으로 출력됩니다.

진단: 에러 메시지와 스택트레이스를 기록하고, 가장 위의 원인부터 추적하세요.

중요: 사용자 인터랙션 차단 가능

네트워크 실패

증상: 요청이 4xx/5xx 또는 CORS 차단으로 실패합니다.

진단: 상태코드, 응답 헤더, 프리플라이트(OPTIONS) 확인.

경고: 데이터 불일치 발생 가능

레이아웃 깨짐

증상: 특정 해상도/브라우저에서 UI가 겹치거나 보이지 않습니다.

진단: CSS 검증, 컨테이너/그리드 기준 확인, 접근성 대비 점검.

경고: 사용성 저하

접근성 실패

증상: 키보드 포커스 이동 불가, 스크린 리더 읽기 오류.

진단: 포커스 순서, ARIA 라벨, 이름/역할/값 검사.

개선 시 UX 큰 폭 향상

HTML/CSS 오류 해결

시맨틱 구조와 유효성

예시: 올바른 양식 마크업과 에러 상태

필수 항목을 정확히 입력해 주세요.

레이아웃 깨짐 디버깅

예시: 안정적인 그리드 카드

카드 A

내용

카드 B

내용

카드 C

내용

유효성 검사 포인트

자바스크립트 및 런타임 오류 해결

콘솔/스택트레이스 해석

예시: 안전한 DOM 접근

// 위험: null 요소에 접근
// const node = document.querySelector('.target').textContent;

// 안전: 존재 확인 후 접근
const node = document.querySelector('.target');
if (node) {
  node.textContent = '준비 완료';
} else {
  console.warn('요소(.target)를 찾을 수 없습니다.');
}
        

에러 경계와 복구

예시: 네트워크 재시도 유틸

async function fetchWithRetry(url, opts = {}, { retries = 3, backoff = 500 } = {}) {
  let lastErr;
  for (let i = 0; i < retries; i++) {
    try {
      const res = await fetch(url, opts);
      if (!res.ok) throw new Error('HTTP ' + res.status);
      return res;
    } catch (err) {
      lastErr = err;
      await new Promise(r => setTimeout(r, backoff * (i + 1)));
    }
  }
  throw lastErr;
}
        

네트워크 및 SEO 문제 해결

HTTP 상태코드와 CORS

예시: CORS 프리플라이트 응답 헤더

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 600
        

SEO 기본 점검

접근성 개선(WCAG)

이름/역할/값

예시: 포커스 가시성과 키보드 순서

탭 순서는 DOM 순서를 따르며, 숨김 요소는 포커스가 가지 않도록 합니다.

색 대비와 텍스트

성능 최적화와 관련 오류

로드 성능

예시: 반응형 이미지 반응형 이미지 예시

런타임 성능

보안 점검과 오류 예방

XSS/CSRF

예시: 엄격한 CSP 헤더

Content-Security-Policy: default-src 'self'; img-src 'self' https:; script-src 'self'; style-src 'self'; connect-src 'self' https:;
        

에러 노출 최소화

체크리스트

릴리즈 전 점검

항목 설명 상태
HTML 유효성 중복 ID, 닫힘 태그, 속성 값 검증 완료
접근성 키보드 내비, 대체 텍스트, 대비 점검
네트워크 상태코드, CORS, 타임아웃 완료
성능 LCP/CLS/INP 기준 만족 점검
보안 CSP, XSS/CSRF 방지, 비밀관리 완료

장애 대응 절차

  1. 감지: 모니터링 알림 수신, 영향 범위 파악.
  2. 완화: 기능 플래그/롤백으로 사용자 영향 최소화.
  3. 분석: 로그/추적 기반 원인 규명.
  4. 수정: 패치 배포, 재발 방지 테스트 추가.
  5. 회고: 문서화 및 프로세스 개선.

부록 및 예시 코드 모음

에러 페이지(404/500) 접근성


<main role="main">
  <section aria-labelledby="error-title">
    <h1 id="error-title">요청하신 페이지를 찾을 수 없습니다 (404)</h1>
    <p>주소를 확인하거나 <a href="/">홈으로 이동</a>하세요.</p>
  </section>
</main>
      

서비스 워커 네트워크 오류 처리


self.addEventListener('fetch', (event) => {
  event.respondWith((async () => {
    try {
      const network = await fetch(event.request);
      return network;
    } catch {
      const cache = await caches.match(event.request);
      return cache || new Response('오프라인입니다.', { status: 503 });
    }
  })());
});
      

로그 필드 표준화


{
  "timestamp": "2025-10-26T21:25:00+09:00",
  "level": "error",
  "message": "API 응답 실패",
  "errorId": "e-20251026-001",
  "context": {
    "route": "/checkout",
    "userAgent": "Mozilla/5.0",
    "locale": "ko-KR"
  }
}