Next.js App Router์์๋ ์กด์ฌํ์ง ์๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด ์๋์ผ๋ก 404 ํ์ด์ง๊ฐ ๋ณด์ฌ์ง๋ค.
๊ฒฝ๋ก์ ํด๋นํ๋ ํด๋๋ ํ์ผ์ด ์์ผ๋ฉด, ์๋์ ๊ฐ์ ๊ธฐ๋ณธ 404 ํ์ด์ง๊ฐ ๋ณด์ฌ์ง๋ค.
404 ํ์ด์ง๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ ค๋ฉด ํด๋น ํด๋์ not-found.tsx
ํ์ผ์ ๋ง๋ค๋ฉด ๋๋ค.
๐ ์ฐ์ ์์๋
page.tsx
์ ๊ฐ์ ์์น์not-found.tsx
๊ฐ ๊ฐ์ฅ ๋๋ค!
๋์ ๋ผ์ฐํ
(params
)๋ฅผ ์ฌ์ฉํด, URL์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ์ถ์ ์ ์๋ค.
์ด๋๋ **usePathname()
ํ
** ์ ์ด์ฉํด ๊ฒฝ๋ก์์ ๊ฐ์ ์ถ์ถํด ํ์ํ๋ฉด ๋๋ค.
๐ ๋จ, ํ ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฏ๋ก
"use client"
์ ์ธ์ด ํ์ํ๋ค.
// app/products/[productId]/reviews/[reviewId]/not-found.tsx
"use client";
import { usePathname } from "next/navigation";
export default function NotFound() {
const pathname = usePathname();
const productId = pathname.split("/")[2];
const reviewId = pathname.split("/")[4];
return (
<div>
<h1>๋ฆฌ๋ทฐ Not Found</h1>
<h2>์ ํ {productId}์ ๋ํ ๋ฆฌ๋ทฐ {reviewId}๊ฐ ์์ต๋๋ค.</h2>
</div>
);
}
ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ 404 ํ์ด์ง๋ก ์ ํํ๊ณ ์ถ๋ค๋ฉด
next/navigation
์์ ์ ๊ณตํ๋ notFound()
ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
import { notFound } from "next/navigation";
export default async function ProductReview({
params,
}: {
params: Promise<{ productId: string; reviewId: string }>;
}) {
const { productId, reviewId } = await params;
if (parseInt(reviewId) > 1000) {
notFound(); // โ ์๋์ผ๋ก not-found.tsx๋ฅผ ๋ ๋๋งํจ
}
return (
<h1>
ProductDetail {productId} {reviewId}
</h1>
);
}