단북
프론트엔드 기술 면접·리액트 핵심 개념

리액트 컴포넌트의 오류 처리를 어떻게 구현하나요?

렌더링 중 에러를 잡는 에러 바운더리(Error Boundary)의 동작과, 이벤트 핸들러·비동기 코드를 try/catch로 다뤄야 하는 이유를 정리합니다.

컴포넌트 렌더링 중에 에러가 나면, 기본적으로 리액트는 전체 컴포넌트 트리를 언마운트해 화면이 깨집니다. 이를 막고 대체 UI(fallback) 를 보여 주는 장치가 에러 바운더리(Error Boundary) 입니다.

에러 바운더리

에러 바운더리는 두 생명주기 메서드 중 하나 이상을 구현한 클래스 컴포넌트입니다(2026년 기준 훅 버전은 없어, 보통 라이브러리를 씁니다).

  • static getDerivedStateFromError — 에러 발생 시 상태를 갱신해 폴백 UI를 렌더링합니다.
  • componentDidCatch — 에러 정보를 로깅합니다.
class ErrorBoundary extends React.Component {
  state = { hasError: false };
 
  static getDerivedStateFromError() {
    return { hasError: true };
  }
 
  componentDidCatch(error, info) {
    logErrorToService(error, info);
  }
 
  render() {
    if (this.state.hasError) return <h1>문제가 발생했어요.</h1>;
    return this.props.children;
  }
}

자신이 감싼 하위 트리의 렌더링 에러만 잡습니다. 그래서 앱 전체용, 위젯별용 등 여러 단계에 둘 수 있습니다.

<ErrorBoundary>
  <Profile />
</ErrorBoundary>

에러 바운더리가 못 잡는 것

에러 바운더리는 렌더링·생명주기·하위 트리 생성자에서 나는 에러만 잡습니다. 다음은 잡지 못하므로 직접 try/catch로 처리해야 합니다.

  • 이벤트 핸들러 (onClick 등) — 렌더링 흐름 밖이므로 try/catch 사용
  • 비동기 코드 (setTimeout, Promise) — try/catch 또는 .catch
  • 서버 사이드 렌더링
  • 에러 바운더리 자신에서 난 에러
function Button() {
  const onClick = async () => {
    try {
      await doSomething();
    } catch (e) {
      showToast('실패했어요');
    }
  };
  return <button onClick={onClick}>실행</button>;
}

실무에서는 직접 클래스를 만들기보다 react-error-boundary 라이브러리로 폴백과 재시도를 간편하게 구성하는 경우가 많습니다.

에러 바운더리(Error Boundary)에 대한 설명으로 옳은 것은?

이 레슨을 다 읽으셨나요?

완료 표시는 이 브라우저에 저장됩니다.