Files
2nd/10_Wiki/Topics/Frontend/Error Boundaries.md
T

4.0 KiB

📌 Brief Summary

Error Boundaries는 React 컴포넌트 트리 하위에서 발생하는 JavaScript 런타임 에러를 포착하여 전체 애플리케이션의 크래시(White Screen)를 방지하는 선언적 에러 처리 메커니즘이다. 에러가 발생한 지점을 격리하고 대체 UI(Fallback UI)를 렌더링함으로써 시스템의 가용성과 사용자 경험을 보호한다.

📖 Core Content

  1. 작동 메커니즘 및 클래스 컴포넌트 의존성
    • React 16부터 도입되었으며, 자식 컴포넌트의 렌더링, 수명 주기 메서드, 생성자 내부의 에러를 감지한다.
    • 반드시 클래스 컴포넌트로 구현해야 하며, static getDerivedStateFromError()로 상태를 업데이트하고 componentDidCatch()로 에러를 로깅한다.
  2. 선언적 에러 격리 (Isolation)
    • 명령형 try/catch와 달리 React의 선언적 특성을 유지하며 컴포넌트 트리 수준에서 에러를 관리한다.
    • 애플리케이션 전체가 아닌, 실패 위험이 높은 특정 위젯(차트, 서드파티 폼 등)을 독립된 Boundary로 감싸 '장애 격리'를 실현한다.
  3. 포착 불가능한 영역 (Limitations)
    • 이벤트 핸들러, 비동기 코드(setTimeout, Fetch), 서버 사이드 렌더링(SSR), Error Boundary 자체 내의 에러는 포착하지 못한다.
    • 이러한 영역은 여전히 try/catch나 전역 에러 핸들러를 통한 보완이 필요하다.
  4. 미처리 에러의 결과
    • 포착되지 않은 에러는 전체 컴포넌트 트리의 마운트 해제(Unmounting)를 유발하며, 이는 손상된 데이터가 사용자에게 노출되는 것보다 안전한 선택으로 간주된다.

⚖️ Trade-offs & Caveats

  • 클래스 컴포넌트 유지 필요성: 최신 React가 Hooks 중심임에도 불구하고 Error Boundary 구현을 위해 클래스 컴포넌트를 유지해야 하는 아키텍처적 일관성 저하가 발생할 수 있다.
  • 성능 및 렌더링 오버헤드: 너무 많은 Error Boundary를 중첩할 경우 트리 깊이가 깊어지고 에러 전파 체크 로직에 따른 미세한 성능 영향이 있을 수 있다.
  • 비동기 에러 처리의 공백: 렌더링 에러만 포착하므로, 비동기 데이터 통신이 빈번한 현대 앱에서는 react-error-boundary와 같은 라이브러리를 통한 추가 처리가 필수적이다.

🔗 Knowledge Connections

  • Fallback UI: 에러 발생 시 사용자에게 노출되는 방어적 인터페이스 (관계: 출력 결과물)
  • Component Stack Traces: 에러 발생 위치를 추적하는 런타임 정보 (관계: 디버깅 핵심 데이터)
  • Sentry / LogRocket: 프로덕션 환경의 에러 수집 및 분석 플랫폼 (관계: 운영 모니터링 연동)

Deeper Research Questions

  1. React의 내부 Fiber 아키텍처는 Error Boundary를 만났을 때 어떻게 렌더링 작업을 중단하고 커밋 단계로 전이하는가?
  2. 이벤트 핸들러 내의 에러를 Error Boundary로 강제 전파하기 위한 'setState' 트릭의 원리와 한계는?
  3. react-error-boundary 라이브러리가 함수형 컴포넌트 환경에서 클래스 컴포넌트의 한계를 극복하는 방식은?
  4. 단일 전역 Error Boundary와 다중 지역 Error Boundary 간의 메모리 사용량 및 리렌더링 범위 트레이드오프는?
  5. 서버 사이드 렌더링(SSR) 환경에서 클라이언트 사이드 Error Boundary가 활성화되기 전의 에러는 어떻게 처리해야 하는가?

Practical Application Contexts

  • 결제 및 금융 모듈: 입력 폼의 작은 렌더링 오류가 전체 결제 프로세스 마비로 이어지지 않도록 격리.
  • 서드파티 위젯 통합: 안정성이 검증되지 않은 외부 라이브러리 기반 컴포넌트를 Boundary로 보호.

Adjacent Topics

  • Try/Catch Statement in JS
  • Observability in Frontend
  • Graceful Degradation Design