웹 개발
개인 프로젝트에 에러 페이지를 추가하고 나서 달라진 것
404나 500이 발생했을 때 기본 에러 화면을 보여주는 것만으로도 프로젝트의 완성도가 달라진다.
혼자 만든 프로젝트에 에러 페이지가 없으면 어떻게 되냐면, 없는 경로로 접근했을 때 Next.js 기본 404 화면이 나온다. 하얀 배경에 "404 | This page could not be found." 한 줄. 내 사이트 디자인과는 아무 관계없는 화면이다.
개인 프로젝트라서 사용자가 많지도 않고, 당장 문제가 되진 않는다. 그러다가 어느 날 Google Search Console에서 크롤링 오류 목록을 보다가 직접 그 URL을 눌러봤고, 그 기본 화면이 불편하게 느껴졌다. 그날 에러 페이지를 만들었다.
Next.js App Router에서 에러 페이지 추가하기
App Router에서는 파일 이름 규칙으로 에러 페이지를 지정한다.
app/
not-found.tsx # 404
error.tsx # 500 및 런타임 에러
global-error.tsx # 루트 레이아웃 에러
// app/not-found.tsx
import Link from 'next/link'
export default function NotFound() {
return (
<main className="min-h-screen flex flex-col items-center justify-center gap-4">
<h1 className="text-4xl font-bold">404</h1>
<p className="text-gray-500">찾을 수 없는 페이지입니다.</p>
<Link href="/" className="underline">
홈으로 돌아가기
</Link>
</main>
)
}
error.tsx는 클라이언트 컴포넌트여야 한다.
// app/error.tsx
'use client'
import { useEffect } from 'react'
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string }
reset: () => void
}) {
useEffect(() => {
console.error(error)
}, [error])
return (
<main className="min-h-screen flex flex-col items-center justify-center gap-4">
<h1 className="text-4xl font-bold">문제가 발생했습니다</h1>
<button onClick={reset} className="underline">
다시 시도하기
</button>
</main>
)
}
에러 페이지 추가 후 달라진 점
기능상으로 달라지는 건 없다. 없는 페이지는 여전히 없다. 그런데 에러 페이지를 추가하고 나면 프로젝트가 좀 더 완성된 느낌이 든다. 외부 링크가 깨져도, 사용자가 URL을 잘못 입력해도 최소한 "여기는 내 사이트야"라고 알려줄 수 있다.
실제로 유용한 건 개발할 때다. error.tsx에서 reset 함수를 제공하면 런타임 에러가 났을 때 페이지를 새로고침하지 않고도 복구를 시도할 수 있어서, 개발 중에 상태를 유지한 채로 에러를 확인하기 편하다.
개인 프로젝트일수록 이런 디테일을 챙기게 되면 코드를 다시 열었을 때 손이 가기 쉬워진다.