최근 프로젝트에서 에러 처리 구조를 어떻게 잡을 것인가에 대해 고민이 많았다.
특히 Next.js (App Router) 환경에서는 error.tsx를 통한 전역 에러 처리 기능이 기본 제공되기 때문에, React의 react-error-boundary와 어떻게 조합할지 전략이 중요했다.
React 기반 프로젝트에서는 일반적으로 두 가지 방식이 존재한다.
| 구분 | 설명 | 사용 시점 |
|---|---|---|
error.tsx | Next.js App Router에서 제공하는 페이지 단위 에러 처리 | 페이지 전체가 터졌을 때 |
react-error-boundary | 컴포넌트 단위로 에러를 잡아 fallback UI를 보여줌 | 특정 섹션만 에러날 때 |
현재 프로젝트는 초기 단계이기 때문에 다음과 같은 전략을 선택했다.
✅ 전역 에러는
error.tsx로 먼저 처리하고, 후에 컴포넌트 단위에서 필요할 경우react-error-boundary를 추가하자!
'use client';
import { useEffect } from 'react';
type GlobalErrorProps = {
error: Error;
reset: () => void;
};
export default function GlobalError({ error, reset }: GlobalErrorProps) {
useEffect(() => {
console.error('🚨 Global error:', error);
}, [error]);
return (
<div className="flex flex-col items-center justify-center min-h-screen p-6 text-center text-gray-800 bg-white">
<h1 className="text-2xl font-bold mb-4">⚠️ 문제가 발생했어요</h1>
<p className="mb-6">{error.message}</p>
<button
onClick={() => reset()}
className="px-4 py-2 border border-gray-300 rounded-md bg-gray-100 hover:bg-gray-200 transition"
>
다시 시도하기
</button>
</div>
);
}
<html>, <body> 태그를 쓰면 안 됨 → hydration 에러 발생
reset()은 현재 페이지 상태를 초기화하고 다시 시도함
프로젝트 초기에는
error.tsx만으로 충분.
기능이 복잡해지고 UI가 복잡해질수록 react-error-boundary를 점진적으로 도입하자.
에러 처리도 초기부터 계획적으로 가져가야 불필요한 리팩토링 없이 유연하게 확장할 수 있다는 걸 배웠다.