react 16 버전부터 도입된 개념이다
자식 컴포넌트 트리에서 에러가 발생하면 해당 컴포넌트 트리를 깨지는 대신, 이러한 에러의 로그를 남기고 잡아내서 Fallback UI를 보여주는 React 컴포넌트이다
쉽게 말해서 리액트에서는 예외 발생 시 모든 컴포넌트가 언마운트 상태로 바뀌기 때문에 이는 사용자에게 나쁜 경험을 제공하게 되며 이를 해결하기 위해 등장한 것이 Error Boundary
이다
npm install react-error-boundary
함수형 컴포넌트에서는 라이브러리를 사용하여 구현해야하며 클래스형 컴포넌트에서는 설치할 필요가 없다
기본적인 구조는 아래와 같다
<ErrorBoundary>
<SomeComponent />
</ErrorBoundary>
만약 SomeComponent
에서 예외가 발생하면 ErrorBoundary
에 의해 catch
가 된다
// ErrorBoundaryExample.tsx
import { useEffect, useState } from "react";
const throwError = () => {
throw new Error("Something Broken");
}
export default function ErrorBoundaryExample() {
const [error, setError] = useState(false);
const throwErrorInRender = () => setError(true);
useEffect(() => {
if (error) throwError();
}, [error]);
return (
<div>
<button onClick={throwErrorInRender}>에러 만들기</button>
</div>
);
}
버튼을 누르면 예외가 발생하도록 하게 하는 컴포넌트이다
// Fallback.tsx
import { FallbackProps } from "react-error-boundary";
export default function Fallback({error, resetErrorBoundary}: FallbackProps ) {
return (
<div>
<h1>An error occurred: {error.message}</h1>
<button onClick={resetErrorBoundary}>Try again</button>
</div>
);
}
예외가 발생한다면 보여줄 Fallback UI에 대한 컴포넌트이다
fallback 컴포넌트는 prop으로 error
, resetErrorBoundary
를 받는데 error
는 에러 정보가 담겨있고, resetErrorBoundary
는 실행 시 에러를 초기화 시킨다
import { ErrorBoundary } from "react-error-boundary";
import ErrorBoundaryExample from "./components/ErrorBoundaryExample";
import Fallback from "./components/Fallback";
export default function App() {
return (
<ErrorBoundary FallbackComponent={Fallback}>
<Suspense fallback={<div>Loading...</div>}>
<ErrorBoundaryExample />
</Suspense>
</ErrorBoundary>
);
}
ErrorBoundaryExample
에서 에러가 발생하면 Fallback
컴포넌트가 보여지게 된다
만약 ErrorBoundaryExample에서 API 패칭이 일어나고 있다면 데이터를 가져오는 동안의 랜더링 처리는 Suspense
에 위임하게 되며 데이터를 받기 전까지의 fallback UI화면을 보여준다
컴포넌트 단에서 발생하는 오류를 잡아낼 수 있지만, 아래 4가지 경우를 잡지는 못한다