What is the Error boundary?
μΌλΆλΆμ javascript
μλ¬κ° μ 체 application
μ μ€λ¨μν€λ κ²μ μ¬μ©μ±κ³Ό μ¬μ©μ κ²½ν μΈ‘λ©΄μμ μλͺ»λ λ°©μμ΄λ€. μλ¬κ° λ°μνλ€λ©΄ λ°μν λΆλΆμ λμλ§ λ©μΆλκ²μ΄ μ¬λ¬λͺ¨λ‘ ν©λ¦¬μ μ΄λ€. React
μ μ ν΅μ μΈ(λ§λ ννμΈμ§λ λͺ¨λ₯΄κ² λ€) error handling
λ°©λ²κ³Όλ λ€λ₯΄κ²,
React 16
μμλΆν° λ±μ₯ν Error boundary
λ₯Ό μ€μ ν΄μ£Όλ©΄ boundary
λ΄λΆμ component
μ λλ κ·Έ νμ component
μμ λ°μνλ error
λ₯Ό catch
ν κ²½μ° fallback ui
(μ£Όλ‘ error ui)λ₯Ό λμμ€ μ μλ€. error
μ λν μ€λΉκ° λ°λ‘ λμ΄μμ§ μλ€λ©΄, React
μμ μ 곡νλ error page
λ‘ λμ΄κ°λ€.
react-error-boundary
곡μλ¬Έμλ₯Ό μ΄ν΄λ³΄λ©΄, Error boundary
λ νμ¬ class component
μμλ§ μμ±(getDerivedStateFromError
, componentDidCatch
)μ΄ κ°λ₯νκ³ , functional component
λ‘ μμ±ν μ μλ λ°©λ²μ΄ λ°λ‘ μ‘΄μ¬νμ§ μλλ€. νμ§λ§ μμ¦ μλΉμ€ λλΆλΆμ functional component
λ‘ κ΅¬νλκΈ° λλ¬Έμ μ΄λ₯Ό λμμ£Όλ react-error-boundary ν¨ν€μ§λ₯Ό μ¬μ©νλ κ²½μ°κ° λ§λ€.
class component
λ‘ μμ±ν error boundary
μμ
import { Component, ErrorInfo, ReactNode } from 'react';
import { DefaultErrorFallback } from './DefaultErrorFallback';
export class ErrorBoundary {
constructor(props) {
super(props);
this.state = { hasError: false, error: undefined };
}
// νμ μ»΄ν¬λνΈμμ μλ¬κ° λ°μνλ©΄ νΈμΆλλ€.
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
// μλ¬μ μλ¬ μ 보λ₯Ό λ°μμ μ²λ¦¬νλ€.
componentDidCatch(error, errorInfo) {
console.error(error, errorInfo);
}
render() {
// μλ¬κ° μμΌλ©΄ fallback λ λλ§
if (this.state.hasError && this.state.error) {
return (
this.props.fallback || <DefaultErrorFallback error={this.state.error} />
);
}
// μλ¬ μμΌλ©΄ children λ λλ§
return this.props.children;
}
}
react-error-boundary
μ¬μ©μμ
import { ErrorBoundary } from "react-error-boundary";
const DetailApp = () => {
return (
<ErrorBoundary fallback={<div>Something went wrong</div>}>
<ExampleApplication/>
</ErrorBoundary>
)
}
Error boundaryμ catch λμ§ μλ case
Error boundary
λ rendering
μ€μ λ°μν μλ¬λ§μ catch νλ€
Event handler
:Error boundary
λevent handler
(onChange
λ±) λ΄μμ λ°μνλ μ€λ₯λ catchνμ§ λͺ»νλ€.Asynchronous action
:setTimeout
,requestAnimationFrame
λ± λΉλκΈ° λμ μ½λμμ λ°μνλ μ€λ₯λ catchνμ§ λͺ»νλ€.Server side rendering (SSR)
Error boundary μ체 μ€λ₯
:Error boundary
μ»΄ν¬λνΈ λ΄λΆμμ λ°μνλ μ€λ₯λ catch νμ§ λͺ»νλ€. μ΄λ¬ν errorμ κ²½μ° μμ μ»΄ν¬λνΈμerror boundary
λ₯Ό μ¬μ©ν΄μΌνλ€.
μΈμ λ λ κ·Έλ λ―μ΄, error boundary
λ₯Ό λ무 μ κ² μ¬μ©νλ κ²½μ°λ κ³Όλνκ² μ¬μ©νλ κ²½μ°, κ°κ°μ λ¨μ μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ μ μ ν μ¬μ©μ΄ νμνλ€. λ무 μ κ² μ¬μ©ν κ²½μ° νλΆλΆμμμ μ€λ₯κ° μ 체 μλΉμ€μ μ€λ¨μ μ΄λν μ μκ³ , κ·Έλ λ€κ³ κ° component
λ§λ€ error boundary
λ₯Ό μ€μ νλ€λ©΄ uxμ μν₯μ μ€ μ μλ€.
κ°μ₯ μ€μνκ²μ μλΉμ€λ₯Ό μ€κ³ν λμ error
μνλ₯Ό ν¬ν¨μμΌμ νλκ²μ΄λ€. error
κ° 0%
μΈ μλΉμ€λ μ‘΄μ¬νμ§ μλλ€. λλΆλΆμ κΈ°νμλ κ°λ°μλ€μ΄ μλΉμ€λ₯Ό ꡬννλλ°μ μ§μ€νμ¬ μ€κ³λ₯Ό νμ§λ§, κ·Έ μλΉμ€μλ error
κ° λ°μνμλ μΌλ§λ smooth
νκ² handling
νμ¬ μ¬μ©μ κ²½νμ ν΄μΉμ§ μλμ§λ ν¬ν¨λμ΄ μλκ²μ΄λ€.
- https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary
- https://github.com/bvaughn/react-error-boundary