본문 바로가기

쉽게 배우는 리액트 프로그래밍

리액트 프로그래밍 에러 방지: Error Boundary 완벽 가이드

반응형

리액트 앱을 개발하다 보면, 갑자기 앱이 멈추거나 엉뚱한 화면이 뜨면서 당황스러운 경험을 하셨을 거예요. 😫 특히 사용자들이 직접 보는 UI에서 에러가 터지면, 개발자로서 괜히 뻘쭘하고 빨리 고쳐야겠다는 생각이 들죠.

 

이런 에러들을 좀 더 깔끔하고 사용자 친화적으로 처리해주는 게 바로 오늘 주제인 Error Boundary에요. 리액트 16부터 등장한 이 녀석은 컴포넌트 트리 안에서 발생하는 에러들을 잡아서 앱이 뻗는 걸 막아주고, 대신 사용자에게 좀 더 보기 좋은 폴백 UI를 보여주는 역할을 한답니다.

 

앱이 갑자기 멈추거나 이상한 화면이 뜨는 걸 막고 싶다면, Error Boundary를 제대로 이해하고 활용하는 게 중요해요!

 


리액트 앱의 에러, 왜 Error Boundary가 필요할까요?

리액트 앱에서 에러는 어디서든 튀어나올 수 있어요. API 호출이 실패하거나, 잘못된 데이터에 접근하거나, 컴포넌트 렌더링 중에 예상치 못한 일이 벌어질 때도 에러가 발생하죠.

 

이런 에러들은 사용자들에게 혼란을 주고, 앱 사용 경험을 망칠 수도 있거든요. 예를 들어, 사용자가 중요한 데이터를 입력 중인데 갑자기 에러가 터져서 입력 내용이 사라지거나, 화면이 하얗게 변하면 사용자는 짜증이 날 수밖에 없겠죠?

 

그래서 리액트에서는 앱이 에러로 인해 뻗는 것을 막고, 사용자에게 안정적인 경험을 제공하기 위해 Error Boundary라는 멋진 기능을 제공하는 거랍니다.

 


Error Boundary, 어떤 역할을 할까요?

Error Boundary는 마치 든든한 보디가드처럼 컴포넌트 트리 안에서 발생하는 에러들을 감시하고, 문제가 생기면 즉각적으로 대응해요.

 

Error Boundary는 다음과 같은 핵심 기능들을 가지고 있어요.

 

  • 에러 감지 및 기록: Error Boundary는 자바스크립트 에러를 감지하고, 에러 발생 정보를 기록해요. 어디서 어떤 에러가 발생했는지 알려주는 로그를 남기는 거죠.
  • 폴백 UI 제공: 에러가 발생하면, Error Boundary는 미리 설정해둔 폴백 UI를 보여줘요. 예를 들어, "죄송합니다. 오류가 발생했어요."와 같은 메시지나, 에러 해결을 위한 안내를 표시할 수도 있고, 예쁜 이미지를 띄워서 사용자의 불안감을 줄여줄 수도 있답니다.
  • 생명주기 메서드 활용: 와 라는 생명주기 메서드를 사용해서, 에러 발생 시 컴포넌트의 상태를 변경하거나, 에러 리포팅 서비스에 에러 정보를 전송할 수도 있어요.

이렇게 Error Boundary는 앱이 에러로 인해 망가지는 것을 막아주고, 사용자에게는 좀 더 나은 경험을 제공하며, 개발자에게는 에러 분석 및 수정에 필요한 정보를 제공해주는 아주 유용한 기능이랍니다.

 


Error Boundary, 모든 에러를 다 잡을 수 있을까요?

아쉽지만 Error Boundary는 모든 에러를 잡아낼 수 있는 건 아니에요. 🙅🏻‍♀️ 다음과 같은 경우에는 Error Boundary가 무력해진답니다.

 

  • 이벤트 핸들러 내의 에러: 이벤트 핸들러 안에서 발생하는 에러는 Error Boundary가 잡아내지 못해요.
  • 비동기 코드 내의 에러:  , ,  등 비동기 코드에서 발생하는 에러도 Error Boundary가 잡아내지 못한답니다.
  • 서버 사이드 렌더링 (SSR) 중 에러: 서버에서 렌더링되는 과정에서 발생하는 에러는 Error Boundary가 처리하지 못해요.
  • Error Boundary 자체의 에러: Error Boundary 컴포넌트 자체에서 에러가 발생하면, Error Boundary는 자기 자신을 구할 수 없어요.

Error Boundary, 어떻게 만들까요?

Error Boundary를 만들려면 클래스 컴포넌트를 사용해야 해요.

 

Error Boundary 컴포넌트 만들기:

 

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // 에러 발생 시 상태 업데이트
    return { hasError: true }; 
  }

  componentDidCatch(error, errorInfo) {
    // 에러 로그 기록 등 추가 작업
    console.error("에러 발생!", error, errorInfo); 
  }

  render() {
    if (this.state.hasError) {
      // 에러 발생 시 폴백 UI 렌더링
      return <h1>앗! 뭔가 잘못되었어요! </h1>; 
    }

    // 에러 없으면 자식 컴포넌트 렌더링
    return this.props.children; 
  }
}

 코드에서  메서드는 에러가 발생하면 컴포넌트의 상태를 업데이트해서 폴백 UI를 보여주도록 해요.  메서드는 에러 정보를 콘솔에 기록하는 예시인데, 여기에 에러 리포팅 서비스를 호출하는 등의 추가 작업을 할 수도 있답니다.

 


Error Boundary를 더 쉽게 만들어주는 라이브러리

Error Boundary를 직접 만들기 귀찮다면, 라는 라이브러리를 사용하면 훨씬 편리하게 Error Boundary를 만들 수 있어요.

 

react-error-boundary 설치 및 사용 예시:

 

import { ErrorBoundary } from 'react-error-boundary';

function MyFallbackComponent({ error, resetErrorBoundary }) {
  return (
    <div>
      <p>앗! 뭔가 문제가 생겼네요! 😢</p>
      <pre>{error.message}</pre>
      <button onClick={resetErrorBoundary}>다시 시도해볼래요?</button>
    </div>
  );
}

function MyComponent() {
  // ...
}

function App() {
  return (
    <ErrorBoundary FallbackComponent={MyFallbackComponent}>
      <MyComponent /> 
    </ErrorBoundary>
  );
}
npm install react-error-boundary

Error Boundary, 어디에 써야 할까요?

Error Boundary는 컴포넌트 트리의 적절한 위치에 배치하는 게 중요해요.

 

  • 너무 넓은 범위를 감싸면 에러가 어디서 발생했는지 찾기 어려워질 수 있어요.
  • 너무 좁은 범위를 감싸면 에러가 발생했을 때 원하는 대로 UI를 처리하지 못할 수도 있어요.

Error Boundary를 배치할 때는 에러가 자주 발생하는 부분이나, 에러가 발생했을 때 사용자에게 보여줄 폴백 UI를 미리 정의해두는 게 좋아요. 예를 들어, 특정 API를 호출하는 컴포넌트나, 사용자 입력을 받는 컴포넌트를 Error Boundary로 감싸면, 해당 컴포넌트에서 에러가 발생하더라도 앱 전체가 망가지는 것을 막을 수 있답니다.

 


Error Boundary 사용 시 주의 사항

  • Error Boundary는 클래스 컴포넌트로만 만들 수 있어요. 함수형 컴포넌트에서는 Error Boundary를 사용할 수 없답니다. (하지만  라이브러리를 사용하면 함수형 컴포넌트에서도 Error Boundary를 사용할 수 있답니다.)
  • 에러가 발생했을 때 사용자에게 보여주는 폴백 UI는 최대한 명확하고 친절하게 만들어주는 게 좋아요. 사용자가 에러가 발생했다는 것을 인지하고, 어떻게 해야 할지 알 수 있도록 안내해주는 게 좋겠죠?

Error Boundary, 마무리

Error Boundary는 리액트 앱의 안정성과 사용자 경험을 향상시키는 데 정말 중요한 역할을 해요.

 

Error Boundary를 잘 활용하면, 앱이 에러로 인해 망가지는 것을 방지하고, 사용자에게 좀 더 안정적이고 긍정적인 경험을 제공할 수 있답니다.

 

오늘 배운 내용을 토대로, 여러분의 리액트 앱을 더욱 안전하고 견고하게 만들어보세요! 💪

 

Error Boundary 관련 자주 묻는 질문 (FAQ)

Q1. Error Boundary는 꼭 클래스 컴포넌트로만 만들어야 하나요?

 

A1. 네, 기본적으로는 클래스 컴포넌트로만 만들 수 있어요. 하지만  라이브러리를 사용하면 함수형 컴포넌트에서도 Error Boundary를 사용할 수 있답니다.

 

Q2. Error Boundary가 처리하지 못하는 에러는 어떻게 처리해야 하나요?

 

A2. Error Boundary가 처리하지 못하는 에러는  문이나 Promise의  메서드를 사용하여 직접 처리해야 해요.

 

Q3. Error Boundary를 어디에 배치하는 게 좋을까요?

 

A3. Error Boundary는 에러가 자주 발생하는 컴포넌트나, 에러 발생 시 사용자에게 보여줄 폴백 UI를 미리 정의해둔 컴포넌트를 감싸는 게 좋아요.

 

에러 포착 및 기록 하위 컴포넌트에서 발생하는 자바스크립트 에러를 감지하고, 에러 정보를 기록합니다.
폴백 UI 제공 에러 발생 시, 사용자에게 보여줄 대체 UI를 렌더링합니다.
생명주기 메서드 활용 getDerivedStateFromError 및 componentDidCatch 메서드를 통해 상태를 업데이트하고 에러를 리포팅할 수 있습니다.

Error Boundary 기능 설명

 

마무리

리액트, React, ErrorBoundary, 에러바운더리, 에러처리, 컴포넌트, 폴백UI, 앱개발, 프로그래밍, 개발, javascript, 자바스크립트, 웹개발, 개발팁, React팁, 개발자, 프론트엔드, frontend, reactjs, reactnative, 리액트공부, 리액트강의, reacterrorboundary, 생명주기, lifecycle, componentDidCatch, getDerivedStateFromError, trycatch, 비동기, async, promise, 폴백, fallback, 안정성, 사용자경험, UX, UI, 웹앱, 모바일앱

 

 

반응형