React Error Boundary 실전 사용법 - 에러 나도 앱 안 죽게 하기
문제
하위 컴포넌트 하나에서 런타임 에러가 터지면 전체 앱이 하얀 화면으로 죽어버린다. 프로덕션에서 이러면 큰일이다.
해결
Error Boundary 클래스 컴포넌트를 만들어서 에러를 격리한다.
import { Component, ReactNode } from 'react';
interface Props {
fallback: ReactNode;
children: ReactNode;
}
interface State {
hasError: boolean;
}
class ErrorBoundary extends Component<Props, State> {
state: State = { hasError: false };
static getDerivedStateFromError(): State {
return { hasError: true };
}
componentDidCatch(error: Error, info: React.ErrorInfo) {
console.error('ErrorBoundary caught:', error, info);
// 여기서 Sentry 같은 에러 트래킹 서비스에 보고
}
render() {
if (this.state.hasError) {
return this.props.fallback;
}
return this.props.children;
}
}
사용할 때는 에러가 날 수 있는 영역을 감싸면 된다.
function App() {
return (
<div>
<Header />
<ErrorBoundary fallback={<p>이 섹션을 불러올 수 없습니다.</p>}>
<UserProfile />
</ErrorBoundary>
<ErrorBoundary fallback={<p>댓글을 불러올 수 없습니다.</p>}>
<Comments />
</ErrorBoundary>
<Footer />
</div>
);
}
UserProfile에서 에러가 나도 Comments와 나머지는 정상 동작한다.
핵심 포인트
- Error Boundary는 클래스 컴포넌트로만 만들 수 있다 (함수 컴포넌트에는
getDerivedStateFromError해당 없음) - 에러 범위를 좁게 잡을수록 좋다. 앱 전체를 하나로 감싸지 말고 섹션별로 감싸는 게 핵심이다
- 이벤트 핸들러 안의 에러는 잡지 못한다. 렌더링 중 에러만 잡는다는 점을 기억하자