getSnapshotBeforeUpdate
: 가장 마지막으로 렌더링 된 결과가 DOM 등에 반영되었을 때 호출
getDerivedStateFromError
: 하위의 자손 컴포넌트에서 오류가 발생했을 때 render 단계에서 호출, 오류를 인자로 받음
⇒ render()
가 실행되기 전에 호출 Virtual DOM에 영향을 끼칠 수 있는 작업은 하면 안됨
componentDidCatch
: 하위의 자손 컴포넌트에서 오류가 발생했을 때 commit 단계에서 호출, 해당 오류와 어떤 컴포넌트가 오류를 발생시켰는지에 대한 정보를 가진 componentStack key를 포함한 객체를 인자로 받음
render 단계: React가 DOM 갱신이 일어날 때 이전과 이후를 비교하며 변경 사항을 계산하는 단계
commit 단계: React가 비교를 끝내고 DOM에 직접적으로 갱신될 내용을 적용하는 단계
⇒ getDerivedStateFromError
단계에서 에러를 확인 hasError
의 상태를 true로 변경하고 ErrorPage
를 렌더링하도록 구성한다.
⇒ sentry와 같은 로깅 로직을 사용하고 싶을 경우 componentDidCatch
단계에서 호출하면 된다.
에러/예외 케이스 화면들
👉 일반적인 에러, 네트워크 에러, 강제 업데이트, 서비스 점검
위의 방식대로 여러 정보를 표시하는 화면에서 하나의 api 에러가 발생했을 때 에러 페이지로 이동한다면 사용자 경험이 저하될 것이다.
Error boundary를 이용하면 이와 같은 문제를 개선할 수 있다.
Error boundary의 한계
react-query
를 사용하면 useErrorBoundary
옵션을 이용하여 API 에서 발생시 Error Boundary가 캐치할 수 있도록 할 수 있다.에러 바운더리를 최상위에 하나만 배치하여 처리할 지 혹은 에러가 날 가능성이 있는 컴포넌트마다 따로 감싸줄지는 선택의 영역이다. 중첩해서 사용도 가능하다!
내가 원하는 방향은?
컴포넌트별로 Error Boundary의 관심사를 분리하여 감싸주고 전역에 ErrorBoundary를 중첩해서 감싸준다.
에러 원인별로 분류
예상 가능한 에러❓Error Boundary❗️
예상 불가능한 에러 ❓axios interceptor or 전역 Error boundary❗️
해결 방법의 종류별로 분류
에러 해결을 위해 특정 페이지로 라우팅을 해야 하거나 전역적으로 발생하는 에러
👉 axios interceptor or 전역 Error boundary
특정 컴포넌트 내에서 발생하거나 화면의 일부만을 에러 상태로 대응해야 하는 에러
👉 Error boundary