not-found.tsx
를 사용하면 된다.not-found.tsx
app/not-found.tsx
app/users/[id]/not-found.tsx
not-found.tsx
를 추가하고 컴포넌트를 작성해보자.app/not-found.tsx
import React from "react";
const NotFound = () => {
return <div>요청하신 페이지는 존재하지 않습니다.</div>;
};
export default NotFound;
not-found.tsx
파일을 사용할 수 있다.한 번 구현해보자!
not-found.tsx
파일을 생성하고 출력할 오류 컴포넌트를 작성한다.app/users/[id]/not-found.tsx
import React from "react";
const UserNotFound = () => {
return <div>사용자가 존재하지 않습니다.</div>;
};
export default UserNotFound;
next/navigation
모듈을 사용하면 다음과 같이 not-found, loading 등의 next.js에서 지정한 파일을 마치 함수처럼 호출할 수 있다.import { notFound } from "next/navigation";
app/users/[id]/page.tsx
import React from "react";
import { notFound } from "next/navigation";
interface Props {
params: { id: number };
}
const UserDetailPage = ({ params: { id } }: Props) => {
if (id > 10) notFound();
return <div>UserDetailPage {id}</div>;
};
export default UserDetailPage;
http://localhost:3000/users/11
app/users/UserTable.tsx
import React from "react";
import Link from "next/link";
import { sort } from "fast-sort";
interface User {
id: number;
name: string;
email: string;
}
interface Props {
sortOrder: string;
}
const UserTable = async ({ sortOrder }: Props) => {
// 잘못된 주소 작성
const res = await fetch("https://jsonplaceholder.typicode.com/users-error");
const users: User[] = await res.json();
const sortedUsers = sort(users).asc(
sortOrder === "email" ? (user) => user.email : (user) => user.name
);
return (
<table>
<thead>
<tr>
<th>
<Link href="/users?sortOrder=name">Name</Link>
</th>
<th>
<Link href="/users?sortOrder=email">Email</Link>
</th>
</tr>
</thead>
<tbody>
{sortedUsers.map((user) => (
<tr key={user.id}>
<td>{user.name}</td>
<td>{user.email}</td>
</tr>
))}
</tbody>
</table>
);
};
export default UserTable;
http://localhost:3000/users/11
npm run build
npm start
not-found.tsx
처럼 오류 메시지를 원하는 방식으로 작성하기 위해서는 어떻게 해야할까?error.tsx
를 사용하면 된다.error.tsx
use client
지시문을 정의해야한다.app/error.tsx
"use client";
import React from "react";
const ErrorPage = () => {
return <div>예상치 못한 오류가 발생했습니다.</div>;
};
export default ErrorPage;
error.tsx
파일은 발생한 오류에 대한 상세 정보를 컴포넌트의 인자 값 props로 전달받는다.app/error.tsx
"use client";
import React from "react";
interface Props {
error: Error;
}
const ErrorPage = ({ error }: Props) => {
console.log("Error: ", error);
return <div>예상치 못한 오류가 발생했습니다.</div>;
};
export default ErrorPage;
error.tsx
파일이 props로 전달받는 reset
메소드를 사용하면 된다.error.tsx
"use client";
import React from "react";
interface Props {
error: Error;
reset: () => void;
}
const ErrorPage = ({ error, reset }: Props) => {
console.log("Error: ", error);
return (
<>
<div>예상치 못한 오류가 발생했습니다.</div>
<button className="btn" onClick={() => reset()}>
Retry
</button>
</>
);
};
export default ErrorPage;
reset
버튼을 클릭하면, 페이지가 재로드되는 것을 확인할 수 있다.reset
메소드를 과도하게 사용하면 불필요한 오류 로그가 여러 번 기록될 수 있다.global-error.tsx
error.tsx
파일도 not-found.tsx
파일과 동일하게 app 폴더에 파일을 추가해 Global Unexpected Error 파일을 작성할 수도 있고, 각 라우터 폴더에 추가하면 개별적으로 오류를 처리할 수도 있다.app/error.tsx
app/users/error.tsx
error.tsx
는 루트 레이아웃(app/layout.tsx
) 에서 발생한 오류는 캐치하지 못한다.global-error.tsx
파일을 사용해야 한다.