๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Next

Next.js์˜ Pre-rendering

  • Next.js๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ Pre-renderingํ•œ๋‹ค
    • ์ฆ‰, Next.js๋Š” ํด๋ผ์ด์–ธํŠธ์ธก์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ HTML์„ ์ƒ์„ฑํ•œ๋‹ค
  • Pre-rendering์€ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ SEO์— ์ตœ์ ํ™” ๋˜์–ด ์žˆ๋‹ค.

 

Next.js ๊ณต์‹ํŽ˜์ด์ง€

 

Static Generation , Server-side Rendering

Next.js์—๋Š” Static Generation, Server-side Rendering ๋‘๊ฐ€์ง€ ํ˜•ํƒœ์˜ Pre-rendering ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค

๋‘๊ฐ€์ง€ Rendering ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์€ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ HTML์„ ์–ธ์ œ ์ƒ์„ฑ ํ•˜๋А๋ƒ์— ๋”ฐ๋ฅธ ์ฐจ์ด์ด๋‹ค.

 

Static Generation - HTML์€ ๋นŒ๋“œ ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋”ฐ๋ผ ์žฌ์‚ฌ์šฉ๋œ๋‹ค.

Server-side Rendering - HTML์€ ์‚ฌ์šฉ์ž ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ๋œ๋‹ค

 

Next.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ ํ•  Pre-rendering ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ์˜ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ด์šฉ ์—†์ด ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Static Generation์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ์˜ˆ) ํšŒ์‚ฌ ์†Œ๊ฐœ ํŽ˜์ด์ง€, ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€
  • ํŽ˜์ด์ง€์—์„œ ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค˜์•ผํ•˜๊ณ , ์‚ฌ์šฉ์ž ์š”์ฒญ๋งˆ๋‹ค ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด Server-side Rendering๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค

์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด Static Generation์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ •์ ์œผ๋กœ ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€๋Š” CDN์—์„œ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Next.js ๊ณต์‹ํŽ˜์ด์ง€

 

Static Generation without data

์ผ๋ถ€ ํŽ˜์ด์ง€๋Š” Pre-rendering์„ ์œ„ํ•ด ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์—๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‘˜ ๋‹ค ์ ์šฉ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

Next.js ๊ณต์‹ํŽ˜์ด์ง€

 

ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋ฉด getStaticProps

ํŽ˜์ด์ง€ ๊ฒฝ๋กœ๊ฐ€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋ฉด getStaticPaths

 

function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>{post.title}</li>
      ))}
    </ul>
  )
}

// ์ด ํ•จ์ˆ˜๋Š” ๋นŒ๋“œ ํƒ€์ž„ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค
export async function getStaticProps() {
// ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ API ํ˜ธ์ถœ
  const res = await fetch('https://.../posts')
  const posts = await res.json()

  // { props: { posts } }๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  Blog ์ปดํฌ๋„ŒํŠธ๊ฐ€ posts๋ฅผ props๋กœ ๋ฐ›๋„๋ก ํ•œ๋‹ค
  return {
    props: {
      posts,
    },
  }
}

 

getStaticPaths

Next.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์  ๊ฒฝ๋กœ ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

 pages/posts/[id].js

 

 [id].js ํŒŒ์ผ ๋นŒ๋“œ ์‹œ pre-rendering ํ•˜๋ ค๋Š” ๋ถ€๋ถ„์€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

getStaticPath๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ํŽ˜์ด์ง€๋ฅผ ๋นŒ๋“œ ํƒ€์ž„ ๋•Œ pre-rendering ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

๋™์ ๋ผ์šฐํŒ… + getStaticProps๋ฅผ ์›ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค

 

function Post({ post }) {
  // Render post...
}

// ์ด ํ•จ์ˆ˜๋Š” ๋นŒ๋“œ ์‹œ ํ˜ธ์ถœ๋œ๋‹ค 
export async function getStaticPaths() {
  const res = await fetch('https://.../posts')
  const posts = await res.json()

// pre-renderํ•  Path๋ฅผ ์–ป๋Š”๋‹ค
  const paths = posts.map((post) => ({
    params: { id: post.id },
  }))

  // paths ๋ฐฐ์—ด์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ์˜ ํŽ˜์ด์ง€๋งŒ ๋นŒ๋“œ ํƒ€์ž„์— pre-rendering
  // { fallback: false } ๋‹ค๋ฅธ routes๋“ค์€ 404
  return { paths, fallback: false }
}

// ์ด ํ•จ์ˆ˜๋„ ๋นŒ๋“œ ์‹œ ํ˜ธ์ถœ๋œ๋‹ค 
export async function getStaticProps({ params }) {
  // params contains the post `id`.
  // params๋Š” post.id๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค
	// ๊ฒฝ๋กœ๊ฐ€ /posts/1์ด๋ฉด params.id๋Š” 1์ด๋‹ค
  const res = await fetch(`https://.../posts/${params.id}`)
  const post = await res.json()

// ์™ธ๋ถ€์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ props๋กœ ์ „๋‹ฌ 
  return { props: { post } }
}

 

Server-side Rendering

 

getServerSideProps๋Š” ๋งค ํŽ˜์ด์ง€ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ๋‹ค

 

function Page({ data }) {
  // Render data...
}

// ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค
export async function getServerSideProps() {
  // API ํ˜ธ์ถœ 
  const res = await fetch(`https://.../data`)
  const data = await res.json()

// ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋Š” props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ๋‹ค
  return { props: { data } }
}

export default Page

 

๋ณด์‹œ๋‹ค์‹œํ”ผ getServerSideProps์€  getStaticProps ์™€ ์œ ์‚ฌ ํ•˜์ง€๋งŒ  getServerSideProps ๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

reference

https://nextjs.org/docs/basic-features/pages#pre-rendering

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

Next.js Image ์•Œ์•„๋ณด๊ธฐ  (0) 2022.09.18
Next.js์˜ _app๊ณผ _document ์•Œ์•„๋ณด๊ธฐ  (0) 2022.09.05
Next.js ์•Œ์•„๋ณด๊ธฐ  (1) 2022.08.31