[Next.js 15] ๐Ÿšซ 404 ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌํ•˜๊ธฐ (not-found.tsx)

ํ˜œ์—ฐยท2025๋…„ 5์›” 11์ผ
0

Next.js

๋ชฉ๋ก ๋ณด๊ธฐ
4/20

Next.js App Router์—์„œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ฉด ์ž๋™์œผ๋กœ 404 ํŽ˜์ด์ง€๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.


๊ธฐ๋ณธ ๋™์ž‘

๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ํด๋”๋‚˜ ํŒŒ์ผ์ด ์—†์œผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ 404 ํŽ˜์ด์ง€๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.
404ํŽ˜์ด์ง€


๐Ÿ› ๏ธ ์ง์ ‘ 404 ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

404 ํŽ˜์ด์ง€๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋ ค๋ฉด ํ•ด๋‹น ํด๋”์— not-found.tsx ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

  • app/ ํด๋”์—์„œ ๋งŒ๋“  ๊ฒฝ์šฐ : ์ „์—ญ 404 ํŽ˜์ด์ง€
  • ํŠน์ • ํด๋”์— ๋งŒ๋“  ๊ฒฝ์šฐ: ํ•ด๋‹น ๊ฒฝ๋กœ ์ „์šฉ 404 ํŽ˜์ด์ง€

    ๐Ÿ“Œ ์šฐ์„ ์ˆœ์œ„๋Š” page.tsx์™€ ๊ฐ™์€ ์œ„์น˜์˜ not-found.tsx๊ฐ€ ๊ฐ€์žฅ ๋†’๋‹ค!


URL ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€ ๋ฐ”๊พธ๊ธฐ

๋™์  ๋ผ์šฐํŒ…(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>
  );
}

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ notFound() ํ˜ธ์ถœํ•˜๊ธฐ

ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ 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>
  );
}

๊ฒฐ๊ณผ ํ™”๋ฉด

0๊ฐœ์˜ ๋Œ“๊ธ€