요약: Error Boundary는 하위 트리에서 발생한 렌더링 오류를 격리하고, 앱 전체 다운을 막아 대체 UI(fallback)를 보여주는 클래스 컴포넌트 기반 보호막입니다. 선언적으로 영역을 감싸 “에러 시 무엇을 보여줄지”를 명시하면, 구체적 처리 흐름은 리액트가 수행합니다.
getDerivedStateFromError, componentDidCatch). 함수 컴포넌트는 감싸여 사용할 수 있음.componentDidMount 등) 중 throw 된 오류setTimeout)에서의 오류(적절한 reject/throw 연결 필요)import React from "react";
type State = { hasError: boolean };
export class ErrorBoundary extends React.Component<
React.PropsWithChildren,
State
> {
state: State = { hasError: false };
static getDerivedStateFromError(error: unknown): State {
// 다음 렌더에서 대체 UI 표시
return { hasError: true };
}
componentDidCatch(error: unknown, info: React.ErrorInfo) {
// 로깅/알림 전송 지점
console.error("Caught by ErrorBoundary:", error, info.componentStack);
}
render() {
if (this.state.hasError) {
return <FallbackUI />; // 대체 화면
}
return this.props.children;
}
}
function FallbackUI() {
return <div>문제가 발생했습니다. 잠시 후 다시 시도해 주세요.</div>;
}
// 사용
// <ErrorBoundary>
// <FeatureArea />
// </ErrorBoundary>
함수 컴포넌트 중심 프로젝트에서는 검증된 유틸 컴포넌트(예: 커스텀 래퍼 또는 외부 라이브러리)를 만들어 경계 배치만 함수식으로 관리하는 방식을 권장합니다.
componentDidCatch에서 로깅/모니터링(Sentry 등) 전송.// key를 바꾸면 하위 트리를 재생성하여 복구 시도
<ErrorBoundary key={retryKey}>
<ProblematicArea />
</ErrorBoundary>
window.onunhandledrejection)은 보조 수단이지 경계 대체가 아님.fallback 이 담당 → 나란히 배치해 역할 분리.
<ErrorBoundary>
<React.Suspense fallback={<Spinner />}>
<UserPanel />
</React.Suspense>
</ErrorBoundary>
componentDidCatch 에서 에러/스택 로깅