๐Ÿธminzzi
Minzzi์•ผ
๐Ÿธminzzi
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (131)
    • ์˜ค๋ฅ˜ํ•ด๊ฒฐ (14)
    • FE (36)
      • Next.js (17)
      • React (4)
      • React Native (0)
      • TypeScript (1)
      • JavaScript (14)
    • BE (0)
      • Nest.js (0)
    • ๋ฐ๋ธŒ์ฝ”์Šค (7)
    • ์›น ํ”„๋กœ์ ํŠธ (5)
    • CS (28)
      • Algorithm (5)
      • Python (4)
      • C++ (2)
      • Operating System (4)
      • Computer Networking (3)
      • Data Structure (1)
      • Machine Learning (3)
      • Tip (6)
    • Github (4)
    • Flutter (3)
      • ํ”„๋กœ์ ํŠธ (3)
    • Private (27)
      • ํšŒ๊ณ  (7)
      • ๋ฉด์ ‘ (17)
    • ๊ฐœ๋ฐœ๋„์„œ (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ํž™์˜์—ญ
  • next.js
  • ๋ชจ๋˜๋ฆฌ์•กํŠธ๋”ฅ๋‹ค์ด๋ธŒ
  • reflow
  • ํ˜ธ์ด์ŠคํŒ…
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  • ๋ ‰์‹œ์ปฌ
  • ์ฝœ์Šคํƒ
  • layout shift
  • ์‹คํ–‰์ปจํƒ์ŠคํŠธ
  • ์‹คํ–‰์ปจํ…์ŠคํŠธ
  • ๋ฉด์ ‘
  • ์›์‹œํƒ€์ž…
  • react
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • ์˜ค๋ธ”์™„
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • SSR
  • ์ด๋ฒคํŠธ๋ฃจํ”„
  • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๐Ÿธminzzi

Minzzi์•ผ

[Next.js] page router - SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ)
FE/Next.js

[Next.js] page router - SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ)

2025. 5. 6. 09:05
ํ•œ ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” Next.js ํ•™์Šต์ •๋ฆฌ์šฉ์ž…๋‹ˆ๋‹ค. 
2.13) SSG 1. ์†Œ๊ฐœ ๋ฐ ์‹ค์Šต
2.14) SSG 2. ์ •์  ๊ฒฝ๋กœ์— ์ ์šฉํ•˜๊ธฐ
2.15) SSG 3. ๋™์  ๊ฒฝ๋กœ์— ์ ์šฉํ•˜๊ธฐ
2.16) SSG 4. ํด๋ฐฑ์˜ต์…˜ ์„ค์ •ํ•˜๊ธฐ

2.13 SSG 1. ์†Œ๊ฐœ ๋ฐ ์‹ค์Šต

SSR์˜ ์žฅ๋‹จ์ 

์žฅ์  : ๋ธŒ๋ผ์šฐ์ €์— ์ ‘์† ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์‚ฌ์ „ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด์„œ ํŽ˜์ด์ง€ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ

๋‹จ์  : ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด ๋„ˆ๋ฌด ๋А๋ฆฌ๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์•ˆ์ข‹์•„์ง„๋‹ค.

SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ)๋ž€

SSR์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ „ ๋ Œ๋”๋ง ๋ฐฉ์‹.

๋นŒ๋“œ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์ „ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ•(ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋”ฑ ํ•œ ๋ฒˆ ์ƒ์„ฑํ•œ๋‹ค)

SSG์˜ ์žฅ๋‹จ์ 

์žฅ์  : ์‚ฌ์ „ ๋ Œ๋”๋ง ๊ณผ์ •์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ํŽ˜์ด์ง€๋”๋ผ๋„, ๋นŒ๋“œ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ๋‹ค ๋งŒ๋“ค์–ด๋‘๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์—๋Š” ํ•ญ์ƒ ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์  : ๋นŒ๋“œ ํƒ€์ž„ ์ดํ›„์—๋Š” ๋‹ค์‹œ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€๋“ค์—์„œ๋Š” SSG ๋ฐฉ์‹์ด ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.


2.14 SSG 2. ์ •์  ๊ฒฝ๋กœ์— ์ ์šฉํ•˜๊ธฐ

SSG ์‚ฌ์šฉํ•˜๊ธฐ

export const getStaticProps = async () => {
  console.log("์ธ๋ฑ์Šค ํŽ˜์ด์ง€");
  const [allBooks, recoBooks] = await Promise.all([
    fetchBooks(),
    fetchRandomBooks(),
  ]);

  return {
    props: { allBooks, recoBooks },
  };
};

export default function Home({
  allBooks,
  recoBooks,
}: InferGetStaticPropsType<typeof getStaticProps>) {
...

getStaticProps๋กœ export ํ•ด์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ

SSG ๋™์ž‘ ํ™•์ธ

npm run dev ๊ฐœ๋ฐœ๋ชจ๋“œ์—์„œ๋Š” ์ˆ˜์ •์‚ฌํ•ญ์ด ๋ฐ”๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— SSG์˜ ๋™์ž‘ ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ

npm run build๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ•ด์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

 

Collecting page data : ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

Generating static pages : SSG๋กœ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•œ ํŽ˜์ด์ง€๋“ค์ด ์ƒ์„ฑ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ

 

 

Route์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ธฐํ˜ธ๋“ค์„ ํ†ตํ•ด SSG ํŽ˜์ด์ง€์ธ์ง€ Dynamic ํŽ˜์ด์ง€(SSR)์ธ์ง€ ๋˜๋Š” Static ํŽ˜์ด์ง€์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ Static์€ ๊ธฐ๋ณธ์ ์œผ๋กœ SSG๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

npm run start๋กœ ํ™•์ธํ•ด๋ณด๋ฉด index ํŽ˜์ด์ง€๋Š” ์•„์ฃผ ๋น ๋ฅธ ์†๋„๋กœ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฐ›์•„ ์˜ฌ ๋•Œ SSG๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ

getStaticProps์—์„œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ param์œผ๋กœ ์ ‘์†์‹œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š”๊ฒฝ์šฐ, CSR๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

getServerSideProps๋‚˜ getStaticProps๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ SSG๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

import SearchableLayout from "@/components/searchable-layout";
import { ReactNode, useEffect, useState } from "react";
import BookItem from "@/components/book-item";
import fetchBooks from "@/lib/fetch-books";
import { useRouter } from "next/router";
import { BookData } from "@/types";

export default function Page() {
  const [books, setBooks] = useState<BookData[]>([]);
  const router = useRouter();
  const { q } = router.query;

  const fetchSearchResult = async () => {
    const data = await fetchBooks(q as string);
    setBooks(data);
  };

  useEffect(() => {
    if (q) {
      fetchSearchResult();
    }
  }, [q]);

  return (
    <div>
      {books.map((book) => (
        <BookItem key={book.id} {...book} />
      ))}
    </div>
  );
}

Page.getLayout = (page: ReactNode) => {
  return <SearchableLayout>{page}</SearchableLayout>;
};

 

๊ทธ๋Ÿฌ๋ฉด SSG์œผ๋กœ ๋ฐ˜ํ™˜๋œ ํŽ˜์ด์ง€๋Š” ๊ฐœ๋ฐœ์ž๋„๊ตฌ์˜ network ํƒญ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ƒˆ๋กœ๊ณ ์นจ ํ•„์š”)

 

๊ทธ๋ ‡๋‹ค๋ฉด SSG๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋œ HTML์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋งˆ์šดํŠธ ๋œ ์ดํ›„์— ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์นญํ•  ์ˆ˜ ์žˆ๋‹ค.


2.15 SSG 3. ๋™์  ๊ฒฝ๋กœ์— ์ ์šฉํ•˜๊ธฐ

๋™์  ๊ฒฝ๋กœ(Dynamic Path)๋ž€?

book/[id].tsx ์ฒ˜๋Ÿผ book/1, book/2, book/3 ๊ณผ ๊ฐ™์ด ๋‹ค์ด๋‚˜๋ฏนํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋™์  ๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ํŽ˜์ด์ง€์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋™์  ๊ฒฝ๋กœ๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ๋กœ๋กœ, ํŠน์ • URL์˜ ์ผ๋ถ€๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋™์ ๊ฒฝ๋กœ๊ฐ€ SSG ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„(๊ฒฝ๋กœ ์„ค์ •ํ•˜๊ธฐ)

์„œ๋ฒ„๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ๋™์ ๊ฒฝ๋กœ ํŽ˜์ด์ง€์˜ ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑ(SSG)ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๋™์  ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋“ค์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, book/1, book/2, book/3์ด ์กด์žฌํ•œ๋‹ค๋ฉด 1, 2, 3์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ ์„ค์ • ๊ณผ์ •์„ getStaticPaths ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

export const getStaticPaths = () => {
  return {
    paths: [
      { params: { id: "1" } },
      { params: { id: "2" } },
      { params: { id: "3" } },
    ],
  };
};

 

fallback

๋งŒ์ผ์˜ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•˜๋Š” ๋Œ€๋น„์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€(ex. book/4)์— ๋Œ€ํ•ด ๋Œ€๋น„ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์„ธ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค.

export const getStaticPaths = () => {
  return {
    paths: [
      { params: { id: "1" } },
      { params: { id: "2" } },
      { params: { id: "3" } },
    ],
    fallback: false,
  };
};

 

1. fallback :  false

์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์— ๋Œ€ํ•ด 404๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.


2.16 Fallback ์˜ต์…˜ ์„ค์ •ํ•˜๊ธฐ

Fallback ์˜ต์…˜ ์„ธ ๊ฐ€์ง€

1. fallback : false

2. fallback : "blocking"

3. fallback : true

 

2. fallback : "blocking"

blocking ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•ด๋†“์œผ๋ฉด StaticPath์— ๋ฏธ๋ฆฌ ์„ค์ •ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋“ค์€ SSR ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ๋‹ค.

SSR ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€ ์ดํ›„์—๋Š” SSG ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ด์„œ ์ €์žฅ๋œ ํŽ˜์ด์ง€๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

build ํ›„ ๋งŒ๋“ค์–ด์ง„ .next/server/pages/book ๋ณด๋ฉด path๋ฅผ ์ง€์ •ํ•ด๋†“์€ ํŽ˜์ด์ง€๋“ค์˜ html ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

path๋ฅผ ์ง€์ •ํ•ด๋†“์ง€ ์•Š์€ book/4์™€ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์— 4.html์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ด ๋•Œ๋ฌธ์— ๋‹ค์‹œ book/4์— ์ ‘๊ทผํ•˜๋ฉด ๋น ๋ฅด๊ฒŒ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ธ๋‹ค.

build ํ›„ .next(์ขŒ) book/4์— ์ ‘๊ทผ ํ›„ .next(์šฐ)

fallback = "blocking"  ์ฃผ์˜ ์‚ฌํ•ญ

Static Path์— ์กด์žฌํ•˜์ง€ ์•Š์•˜๋˜ ํŽ˜์ด์ง€๋ฅผ SSR ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•  ๋•Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์•ผ ๋œ๋‹ค๊ฑฐ๋‚˜ ์‚ฌ์ „ ๋ Œ๋”๋ง์„ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋˜๋ฉด ์ด ์‹œ๊ฐ„ ๋™์•ˆ์—๋Š” ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ƒ๊ธด๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ fallback = true๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

3. fallback = true

๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญ ๋ฐ›์•˜์„ ๋•Œ props(getStaticProps๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” props)๊ฐ€ ์—†๋Š” ๋ฒ„์ „์˜ ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ›„์†์œผ๋กœ ์ด ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์ธ props๋งŒ ๋”ฐ๋กœ ๊ณ„์‚ฐํ•ด์„œ ๋ณด๋‚ด์ค€๋‹ค.

 

fallback ์ƒํƒœ์ผ ๋•Œ๋งŒ ๋„์šฐ๊ณ  ์‹ถ์€ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

export default function Page({
  book,
}: InferGetStaticPropsType<typeof getStaticProps>) {
  const router = useRouter();
  if (router.isFallback) {
    return "๋กœ๋”ฉ์ค‘์ž…๋‹ˆ๋‹ค.";
  }
...

 

๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ์กด์žฌํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋กœ ๋„˜๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด

export const getStaticProps = async (context: GetStaticPropsContext) => {
  const id = context.params!.id;

  const book = await fetchOneBook(Number(id));

  if (!book) {
    return {
      notFound: true,
    };
  }

  return {
    props: { book },
  };
};

getStaticProps์—์„œ return notFound๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'FE > Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Next.js] Page Router ์žฅ๋‹จ์   (0) 2025.05.06
[Next.js] Page Router - ISR  (4) 2025.05.06
[Next.js] page router - SSR  (3) 2025.05.05
[Next.js] page router ์‚ฌ์ „ ๋ Œ๋”๋ง๊ณผ ๋ฐ์ดํ„ฐํŽ˜์นญ  (0) 2025.05.05
[Next.js] page router ํŽ˜์ด์ง€๋ณ„ ๋ ˆ์ด์•„์›ƒ ์„ค์ •  (1) 2025.05.03
    'FE/Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Next.js] Page Router ์žฅ๋‹จ์ 
    • [Next.js] Page Router - ISR
    • [Next.js] page router - SSR
    • [Next.js] page router ์‚ฌ์ „ ๋ Œ๋”๋ง๊ณผ ๋ฐ์ดํ„ฐํŽ˜์นญ
    ๐Ÿธminzzi
    ๐Ÿธminzzi

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”