9.0 KiB
9.0 KiB
React 애플리케이션 예외 및 에러 처리
📌 Brief Summary
React 애플리케이션 예외 및 에러 처리는 런타임 중 발생하는 JavaScript 에러로 인해 애플리케이션 전체가 멈추거나 빈 화면(White screen of death)이 표시되는 것을 방지하는 메커니즘입니다. 핵심적으로 'Error Boundary(에러 경계)' 컴포넌트를 사용하여 UI의 렌더링 에러를 포착하고 안전한 폴백(Fallback) UI를 제공하며, Sentry 등 프론트엔드 로깅 도구와 결합하여 프로덕션 환경의 에러를 모니터링하고 복원력을 확보합니다.
📖 Core Content
- Error Boundary의 개념 및 동작 원리: Error Boundary는 하위 컴포넌트 트리의 렌더링, 생명주기 메서드 및 생성자에서 발생하는 JavaScript 에러를 포착하는 React의 특수 클래스 컴포넌트입니다 [1, 2].
static getDerivedStateFromError()메서드를 통해 에러 발생 후 폴백 UI를 렌더링하도록 상태를 업데이트하며,componentDidCatch()메서드를 사용하여 에러 정보를 로깅합니다 [3]. - 에러 포착의 한계 (잡지 못하는 에러): Error Boundary는 컴포넌트의 선언적 렌더링 과정에서 발생하는 에러만 포착합니다. 즉, 이벤트 핸들러(Event handlers), 비동기 코드(
setTimeout등), 서버 사이드 렌더링(SSR), 그리고 Error Boundary 자체에서 발생한 에러는 포착하지 못합니다 [3, 4]. 이벤트 핸들러의 경우 일반적인 자바스크립트의try / catch구문을 사용하여 에러를 처리해야 합니다 [5, 6]. - 컴포넌트 트리 마운트 해제 정책: React 16부터는 Error Boundary에 의해 포착되지 않은 에러가 발생할 경우, 손상된 UI를 그대로 노출하는 것(예: 잘못된 대상에게 메시지가 보내지는 현상 등)이 더 큰 문제를 유발할 수 있다고 판단하여 전체 React 컴포넌트 트리를 마운트 해제(unmount)시킵니다 [7, 8].
- 전략적 배치 (Granularity): 단일 Error Boundary로 앱 전체를 감싸는 대신, 서드파티 위젯, 차트, 복잡한 폼 등 불안정할 수 있는 섹션 단위로 개별적인 Error Boundary를 배치하는 것이 권장됩니다. 이를 통해 특정 컴포넌트가 다운되더라도 나머지 UI 부분은 계속 상호작용 가능한 상태를 유지할 수 있습니다 [7, 9, 10].
- 클라우드 로깅 도구를 활용한 모니터링: 프로덕션 환경에서는 Error Boundary와 Sentry, LogRocket, SigNoz 등의 프론트엔드 모니터링 툴을 결합하여 사용해야 합니다 [10-12]. 이러한 도구들은 중복 에러를 지능적으로 그룹화하고, 세션 리플레이 기능 및 컴포넌트 스택 트레이스를 제공하여 로컬 밖에서 일어난 예외 상황을 정확하게 디버깅할 수 있게 해줍니다 [11-14].
⚖️ Trade-offs & Caveats
- 클래스 컴포넌트의 강제성: 최신 React 개발이 훅(Hooks)을 활용한 함수형 컴포넌트 위주로 이루어짐에도 불구하고, Error Boundary 자체는 반드시 클래스 컴포넌트로만 작성해야 한다는 제약이 있습니다 [4, 15]. (
react-error-boundary와 같은 외부 라이브러리를 통해 훅 기반 래퍼로 우회할 수는 있습니다 [4]). - 보이지 않는 에러의 치명성 vs. 빈 화면의 위험성: 포착되지 않은 에러 발생 시 컴포넌트를 마운트 해제하는 정책은 사용자에게 '빈 화면'을 보여줄 수 있는 위험(UX 저하)을 감수하는 것입니다. 이는 오작동하는 UI를 남겨두어 발생할 수 있는 심각한 비즈니스 논리적 오류를 막기 위한 기술적 반대 급부(Trade-off)입니다 [8].
- 성능 모니터링 도구의 오버헤드: Sentry나 LogRocket과 같이 상세한 세션 리플레이와 에러 트래킹을 제공하는 도구를 도입하면 강력한 디버깅 컨텍스트를 얻을 수 있으나, 번들 사이즈 증가 및 일부 도구의 경우 최대 120ms의 추가 로딩 시간을 유발하는 성능적 부작용이 발생할 수 있습니다 [16-18].
🔗 Knowledge Connections
Related Concepts
[아키텍처 및 기반 기술]
- Error Boundaries
- 연결 이유: React 애플리케이션의 선언적 에러 처리를 위한 핵심 내장 기능입니다.
- 이 개념을 통해 더 깊게 이해할 수 있는 부분:
getDerivedStateFromError와componentDidCatch의 동작 원리 및 선언형 UI 모델에서 예외가 전파되는 방식.
- Fallback UI
- 연결 이유: 에러가 발생했을 때 애플리케이션의 크래시를 숨기고 사용자 경험을 보호하는 대체 렌더링 기술입니다.
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 예외 발생 시나리오에서도 시스템의 일부를 격리시켜 정상적인 서비스를 이어가게 만드는 UI/UX 설계.
[구현 및 활용 도구]
- Sentry / LogRocket
- 연결 이유: Error Boundary에서 잡아낸 에러 및 포착하지 못한 런타임 에러를 중앙 서버로 수집하고 시각화해 주는 클라우드 관측성 도구입니다.
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 소스 맵(Source Map)을 활용한 스택 트레이스 복원 및 세션 리플레이(Session Replay)를 통한 실사용자 에러 컨텍스트 파악.
- Memory Leaks (메모리 누수)
- 연결 이유: 직접적인 에러 스로우(Throw)를 발생시키진 않지만 애플리케이션 크래시나 성능 저하, UI 먹통을 유발하는 치명적인 예외적 결함입니다.
- 이 개념을 통해 더 깊게 이해할 수 있는 부분:
useEffect의 클린업 누락 등으로 인해 분리된 DOM 노드(Detached DOM nodes)가 발생하여 메모리가 회수되지 않는 현상 및 이를 Chrome DevTools의 Heap Snapshot으로 추적하는 방법 [19-22].
Deeper Research Questions
- React 16의 '포착되지 않은 에러 시 전체 컴포넌트 트리 마운트 해제'라는 설계 결정이, 데이터 손실에 민감한 금융권 등의 애플리케이션에서 실제로 어떤 장단점을 가지는가?
- 비동기 코드(Async) 및 이벤트 핸들러(Event Handler)에서 발생하는 에러를 Error Boundary 패턴과 어떻게 단일화(Unify)하여 중앙 집중식으로 관리할 수 있는가?
- LogRocket이나 Sentry와 같은 프론트엔드 로깅 도구를 도입할 때, 민감한 사용자 개인정보(PII)가 캡처되는 것을 막으면서도 유효한 에러 스택을 수집하는 최적화 방법은 무엇인가?
- 함수형 패러다임이 정착된 현재, React 팀이 Error Boundary 기능을 훅(Hook) 생태계에 직접 편입시키지 않는 구조적 이유는 무엇인가?
- Feature-Sliced Design (FSD) 아키텍처를 사용할 때, Error Boundary를 Feature 레벨에 배치할 것인가 아니면 Widget 및 Pages 레벨에 배치할 것인가에 대한 전략적 기준은 무엇인가?
Practical Application Contexts
- Implementation: React 클래스 컴포넌트를 활용해 재사용 가능한 Error Boundary 컴포넌트를 작성하고, 그 내부에 자식 컴포넌트(
children)를 렌더링하며, 이벤트 핸들러 내에는 반드시try/catch구문을 별도로 구현합니다. - System Design: 대규모 애플리케이션 기획 시 전체 화면을 감싸는 전역 에러 핸들러와 더불어 탭, 모달, 차트, 서드파티 위젯 등 격리 가능한 요소마다 지역적 Error Boundary를 설계하여 장애 영향을 최소화(Blast radius 제한)합니다.
- Operation / Maintenance: 프로덕션 환경에 Sentry와 같은 Observability 툴을 연동하고, 에러 바운더리 내
componentDidCatch에서 해당 툴의 로거를 호출하여 에러 발생 빈도와 사용자 세션을 모니터링/운영합니다. - Learning Path: 컴포넌트 생명주기 및 렌더링 흐름 이해 ➔ Error Boundary 작성법 숙지 ➔ 예외 상황(렌더링 중 에러 vs 이벤트 처리 중 에러) 구분 방법 학습 ➔ 로깅 라이브러리를 통한 프로덕션 모니터링으로 학습을 전개합니다.
- My Project Relevance: 현재 개발 중인 React 앱에서 특정 컴포넌트 내부의 사소한 데이터 결함으로 인해 앱 전체가 다운되는 현상(빈 화면)을 방지하고 서비스 안정성을 높이기 위해 즉시 적용해야 합니다.
Adjacent Topics
- Frontend Observability (프론트엔드 관측성)
- 확장 방향: 단순 에러 캐치를 넘어서 Tracing, Metrics 시각화 등을 통해 애플리케이션의 상태와 백엔드와의 통합 통신 과정 전체를 모니터링(예: Datadog RUM, Grafana 등)하는 아키텍처로 지식을 확장할 수 있습니다.
- React Performance Optimization (성능 최적화)
- 확장 방향: 렌더링 중 발생하는 예외뿐만 아니라, 과도한 리렌더링이나 잘못 사용된 React 훅(예: 의존성 배열 오류)으로 인해 애플리케이션 응답성이 저하되고 최종적으로 크래시를 유발하는 이슈를 디버깅하는 방법론으로 확장합니다.
Last updated: 2026-04-30