๋ด๋ณด๋ด๋ฒ(๋ด๊ฐ ๋ณด๋ ค๊ณ ๋ด๊ฐ ๋ฒ์ญํ...) Next.js docs
2021๋ 3์ 26์ผ ๊ธฐ์ค Next.js ๊ณต์ ๋ฌธ์๋ฅผ ๋ฒ์ญํ๋ค.
โป ์์ด ์ ๊ณต์๋ ํด์ธ ์ ํํ๋ ์๋๊ธฐ์ ๋ฒ์ญ์๋ ์์ญ, ์ค์ญ์ด ๋ฌด์ํ ๋ง์ ์ ์์ผ๋ฉฐ, ํผ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ์กฐํด๊ฐ๋ฉฐ ๋ฒ์ญํ๋ค ๋ณด๋ ์คํ๋ ๋ง์ ์ ์๋ค. ์ ํํ ๋ด์ฉ์ ๊ณต์๋ฌธ์๋ฅผ ์ง์ ์ดํด๋ณด๊ฑฐ๋ ๋ค๋ฅธ ์ ๋ณด๋ค์ ๋ ์ฐพ์๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
(ํ์ง๋ง ๋๊ธ ํผ๋๋ฐฑ๋ ํ์ํฉ๋๋ค๐ )
Next.js ๊ณต์๋ฌธ์ ํ์ธํ๊ธฐ>>
Pages
In Next.js, a page is a React Component exported from a .js, .jsx, .ts, or .tsx file in the pages directory. Each page is associated with a route based on its file name.
Next.js์์ ํ์ด์ง๋ pages ๋๋ ํ ๋ฆฌ ์์ ์๋ .js, .jsx, .ts, or .tsx ํ์ผ์ ์๋ export๋ React ์ปดํฌ๋ํธ์ด๋ค. ๊ฐ ํ์ด์ง๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๋ฅธ route๋ก ์ฐ๊ฒฐ๋๋ค.
Example: If you create pages/about.js
that exports a React component like below, it will be accessible at /about
.
์์: ์๋์ ๊ฐ์ React ์ปดํฌ๋ํธ๋ฅผ exportํ๋ pages/about.js๋ฅผ ์์ฑํ๋ฉด /about
์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
function About() {
return <div>About</div>}
export default About
pages with Dynamic Routes ๋์ ๊ฒฝ๋ก์ ํ์ด์ง
Next.js supports pages with dynamic routes. For example, if you create a file called pages/posts/[id].js, then it will be accessible at posts/1, posts/2, etc.
Next.js๋ ๋ค์ด๋๋ฏน(๋์ ) ๋ผ์ฐํธ๋ฅผ ์ง์ํ๋ค. ์๋ฅผ ๋ค์ด pages/posts/[id].js๋ ํ์ผ์ ์์ฑํ๋ฉด post/1, post/2 ๊ฐ์ ๊ฒฝ๋ก๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
Dynamic Routing documentation ์ฐธ์กฐ
Pre-rendering ์ฌ์ ๋ ๋๋ง
By default, Next.js pre-renders every page. This means that Next.js generates HTML for each page in advance, instead of having it all done by client-side JavaScript. Pre-rendering can result in better performance and SEO.
๊ธฐ๋ณธ์ ์ผ๋ก Next.js๋ ๋ชจ๋ ํ์ด์ง๋ฅผ ๋จผ์ ๋ ๋๋งํ๋ค. ๋จผ์ ๋ ๋๋ง ํ๋ค๋ ๊ฒ์ Next.js๊ฐ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ JavasScript์ ์ํด ๋ ๋๋ง ๋๊ธฐ ์ ์ ๊ฐ ํ์ด์ง์ HTML์ ๋จผ์ ์์ฑํ๋ค๋ ์๋ฏธ์ด๋ค. Pre-rendering(์ฌ์ ๋ ๋๋ง)์ ๋ ๋์ ์ฑ๋ฅ๊ณผ SEO(Search Engine Optimization)๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
Each generated HTML is associated with minimal JavaScript code necessary for that page. When a page is loaded by the browser, its JavaScript code runs and makes the page fully interactive. (This process is called hydration.)
์์ฑ๋ ๊ฐ HTML์ ๊ฐ ํ์ด์ง์ ํ์ํ ์ต์ํ์ JS์ฝ๋์ ์ฐ๊ฒฐ๋๋ค. ํ์ด์ง๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ํด์ ๋ก๋๋๋ฉด ํ์ด์ง์ ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋์ํ๋ฉด์ ๊ทธ ํ์ด์ง๊ฐ ์ธํฐ๋ํฐ๋ธ ํ๊ฒ ๋ง๋ค์ด์ค๋ค. (์ด ๊ณผ์ ์ ํ์ด๋๋ ์ด์ ์ด๋ผ๊ณ ๋ถ๋ฆ)
Two forms of Pre-rendering ๋ ๊ฐ์ง ํํ์ ์ฌ์ ๋ ๋๋ง
Next.js has two forms of pre-rendering: Static Generation and Server-side Rendering. The difference is in when it generates the HTML for a page.
Next.js๋ ์ฌ์ ๋ ๋๋ง์ ๋๊ฐ์ง ํํ๊ฐ ์๋ค: ์ ์ ์์ฑ, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง. ์ฐจ์ด์ ์ ์ธ์ ํ์ด์ง๋ฅผ ์ํ HTML๋ฅผ ์์ฑํ๋๊ฐ์ ์๋ค.
- Static Generation (Recommended): The HTML is generated at build time and will be reused on each request.
์ ์ ์์ฑ(์ถ์ฒ): ๋น๋ ์๊ฐ์ HTML์ด ์์ฑ๋๊ณ ๊ฐ ์์ฒญ๋ง๋ค ์ฌ์ฌ์ฉ์ด ๋๋ค. - Server-side Rendering: The HTML is generated on each request.
์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง: ๊ฐ ์์ฒญ๋ง๋ค HTML์ด ์์ฑ๋๋ค.
Importantly, Next.js lets you choose which pre-rendering form you'd like to use for each page. You can create a "hybrid" Next.js app by using Static Generation for most pages and using Server-side Rendering for others.
์ค์ํ๊ฒ๋ Next.js๋ ๊ฐ ํ์ด์ง๋ง๋ค ๋น์ ์ด ์ํ๋ ์ฌ์ ๋ ๋๋ง ํํ๋ฅผ ์ ํํ ์ ์๊ฒ ๋์ด ์๋ค. ๋๋ถ๋ถ์ ํ์ด์ง๋ฅผ ์ ์ ์ธ ์์ฑ์ ์ฌ์ฉํ๊ณ ๋๋จธ์ง์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ Next.js ์ฑ์ ์์ฑํ ์๋ ์๋ค.
We recommend using Static Generation over Server-side Rendering for performance reasons. Statically generated pages can be cached by CDN with no extra configuration to boost performance. However, in some cases, Server-side Rendering might be the only option.
์ฐ๋ฆฌ๋ ์ฑ๋ฅ์์ ์ด์ ๋ก ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๋ณด๋ค๋ ์ ์ ์์ฑ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ถ์ฒํ๋ค. ์ ์ ์ผ๋ก ์์ฑ๋๋ ํ์ด์ง๋ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์ ์ถ๊ฐ์ ์ธ ์ค์ ์์ด๋ CDN์ ์ํด์ ์บ์ฑ๋๋ค. ํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฌ์ฉํ ์๋ฐ์ ์์ ์๋ ์๋ค.
You can also use Client-side Rendering along with Static Generation or Server-side Rendering. That means some parts of a page can be rendered entirely by client side JavaScript. To learn more, take a look at the Data Fetching documentation.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง๋ ์ ์ ์์ฑ์ด๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ง์ ์๋ฏธ๋ ํ์ด์ง์ ์ด๋ค ๋ถ๋ถ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ํด์๋ง ๋ ๋ํ ์๋ ์๋ค.
Static Generation(Recommended) ์ ์ ์์ฑ(์ถ์ฒ)
If a page uses Static Generation, the page HTML is generated at build time. That means in production, the page HTML is generated when you run next build
. This HTML will then be reused on each request. It can be cached by a CDN.
ํ์ด์ง๊ฐ ์ ์ ์์ฑ์ ์ฌ์ฉํ๋ค๋ฉด ํด๋น ํ์ด์ง์ HTML์ ๋น๋ ํ์์ ์์ฑ๋๋ค. ์ด ๋ง์ ์๋ฏธ๋ ์ด์ ์์(?) ํด๋น ํ์ด์ง์ HTML๋ next build๋ฅผ ๋์์ํฌ ๋์ ์์ฑ๋๋ค. ์ด HTML์ ๋งค ์์ฒญ๋ง๋ค ์ฌ ์ฌ์ฉ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ CDN์ ์ํด์ ์บ์ฑ๋๋ค.
In Next.js, you can statically generate pages with or without data. Let's take a look at each case.
Next.js์์ ๊ฐ๋ฐ์๋ ํ์ด์ง๋ฅผ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์๋, ํฌํจํ์ง ์์ ์๋ ์๋ค. ๊ฐ ์ผ์ด์ค์ ๋ํด ์ดํด๋ณด์.
Static Generation without data ๋ฐ์ดํฐ ์์ด ์ ์ ์์ฑํ๊ธฐ
By default, Next.js pre-renders pages using Static Generation without fetching data. Here's an example:
๊ธฐ๋ณธ์ ์ผ๋ก Next.js๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค์ง ์๋ ์ ์ ์์ฑ์ผ๋ก ํ์ด์ง๋ฅผ ์ฌ์ ๋ ๋๋ง ํ๋ค.
Note that this page does not need to fetch any external data to be pre-rendered. In cases like this, Next.js generates a single HTML file per page during build time.
์ด ํ์ด์ง๋ ์ด๋ ํ ์ธ๋ถ์ ๋ฐ์ดํฐ๋ก ๊ฐ์ ธ์ฌ ํ์๊ฐ ์์ด ์ฌ์ ๋ ๋๋ง์ด ๋๋ ๊ฒ์ ์ ์ํ์์ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ Next.js๋ ๋น๋ ์๊ฐ์ ํ์ด์ง ๋น ํ ๊ฐ์ HTML ํ์ผ์ ์์ฑํ๋ค.
scenario 1: Your page content depends on external data ํ์ด์ง ์ฝํ ์ธ ๊ฐ ์ธ๋ถ ๋ฐ์ดํฐ์ ์์กดํด์์
Example: Your blog page might need to fetch the list of blog posts from a CMS (content management system).
์์: ๋น์ ์ ๋ธ๋ก๊ทธ ํ์ด์ง๊ฐ CMS๋ก๋ถํฐ ๋ธ๋ก๊ทธ ํฌ์คํธ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ.
// TODO: Need to fetch `posts` (by calling some API endpoint)
// before this page can be pre-rendered.
function Blog({ posts }) {
return (
<ul>
{posts.map((post) => (
<li>{post.title}</li>))}
</ul>)
}
export default Blog
To fetch this data on pre-render, Next.js allows you to export an async function called getStaticProps from the same file. This function gets called at build time and lets you pass fetched data to the page's props on pre-render.
์ฌ์ ๋ ๋ ์์ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด Next.js๋ ๋น์ ์ด ๋์ผํ ํ์ผ ๋ด์ getStaticProps๋ผ๋ async(๋น๋๊ธฐ) ํจ์๋ฅผ exportํ๋ ๊ฒ์ ํ์ฉํ๋ค. ์ด ํจ์๋ ๋น๋ ์๊ฐ์ ํธ์ถ๋์ด ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ๋ ๋์์ ํ์ด์ง์ props์ผ๋ก ์ ๋ฌํ๋ค.
function Blog({ posts }) {
// Render posts...
}
// This function gets called at build time
export async function getStaticProps() {
// Call an external API endpoint to get posts
const res = await fetch('https://.../posts')
const posts = await res.json()
// By returning { props: { posts } }, the Blog component
// will receive `posts` as a prop at build time
return {
props: {
posts,
},
}
}
export default Blog
To learn more about how getStaticProps works, check out the Data Fetching documentation.
getStaticProps๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ ์์๋ณด๊ธฐ ์ํด์ Data Fetching ๋ฌธ์๋ฅผ ํ์ธํ๋ผ.
Scenario 2: Your page paths depend on external data ํ์ด์ง ๊ฒฝ๋ก๊ฐ ์ธ๋ถ ๋ฐ์ดํฐ์ ์์กดํด์์
Next.js allows you to create pages with dynamic routes. For example, you can create a file called pages/posts/[id].js to show a single blog post based on id. This will allow you to show a blog post with id: 1 when you access posts/1.
Next.js๋ ๋น์ ์ด ํ์ด์ง๋ฅผ ๋์ ์ธ ๋ผ์ฐํธ๋ก ์์ฑํ ์ ์๊ฒ ํ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ํ ๊ฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ id๊ธฐ๋ฐ์ผ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ pages/posts/[id].js๋ผ๋ ํ์ผ์ ์์ฑํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด id๊ฐ 1์ธ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ posts/1๋ก ์ ๊ทผํ์ฌ ๋ณผ ์ ์๊ฒ ํด์ค๋ค.
However, which id you want to pre-render at build time might depend on external data.
๊ทธ๋ฌ๋ ์ด๋ค id๋ฅผ ๋น๋ ์๊ฐ์ ์ฌ์ ๋ ๋ํ๊ณ ์ถ์์ง๋ ์ธ๋ถ ๋ฐ์ดํฐ์ ๋ฌ๋ ค์๋ค(?)
Example: suppose that you've only added one blog post (with id: 1) to the database. In this case, you'd only want to pre-render posts/1 at build time.
์์: ๋น์ ์ด id๊ฐ 1์ธ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ถ๊ฐํ๋ค. ์ด ๊ฒฝ์ฐ์ ๋น์ ์ ๋น๋ ์๊ฐ์ posts/1๋ง ์ฌ์ ๋ ๋ ํ๊ณ ์ถ์ ๊ฒ์ด๋ค.
Later, you might add the second post with id: 2. Then you'd want to pre-render posts/2 as well.
๊ทธ ํ์ id๊ฐ 2์ธ ๋ ๋ฒ์งธ ํฌ์คํธ๋ฅผ ์ถ๊ฐํ๋ค. ๊ทธ๋ผ posts/2๋ ์ฌ์ ๋๋ํ๊ณ ์ถ์ ๊ฒ์ด๋ค.
So your page paths that are pre-rendered depend on external data. To handle this, Next.js lets you export an async function called getStaticPaths from a dynamic page (pages/posts/[id].js in this case). This function gets called at build time and lets you specify which paths you want to pre-render.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋น์ ์ ์ฌ์ ๋ ๋๋ ํ์ด์ง ๊ฒฝ๋ก๋ ์ธ๋ถ ๋ฐ์ดํฐ์ ๋ฌ๋ ค์๋ค. ์ด๊ฒ์ ํธ๋ค๋ง ํ๊ธฐ ์ํด์ Next.js๋ ๋์ ์ธ ํ์ด์ง๋ฅผ ์ํด์ getStaticPaths๋ผ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ๋์ ์ธ ํ์ด์ง์์ exportํ ์ ์๊ฒ ํ๋ค. ์ด ํจ์๋ ๋น๋ ์๊ฐ์ ํธ์ถ๋๊ณ ์ด๋ค ๊ฒฝ๋ก๋ค์ ์ฌ์ ๋ ๋ํ๊ธฐ ์ํ๋์ง ํน์ ์ง์ ์ ์๋ค.
// This function gets called at build time
export async function getStaticPaths() {
// Call an external API endpoint to get posts
const res = await fetch('https://.../posts')
const posts = await res.json()
// Get the paths we want to pre-render based on posts
const paths = posts.map((post) => ({
params: { id: post.id },
}))
// We'll pre-render only these paths at build time.
// { fallback: false } means other routes should 404.
return { paths, fallback: false }
}
Also in pages/posts/[id].js
, you need to export getStaticProps
so that you can fetch the data about the post with this id
and use it to pre-render the page:
๋ํ pages/posts/[id].jsํ์ผ์์ ํฌ์คํธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ํด๋น id๋ก ๊ฐ์ ธ์ค๊ณ ์ฌ์ ๋ ๋์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ getStaticProps ํจ์๋ฅผ exportํด์ผํ๋ค.
*fallback: false๋ผ๋ ์ต์ ์ ํ์ฉ๋ ๊ฒฝ๋ก ์ธ์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ 404๋ฅผ ๋์ง๋ ๊ฒ.
function Post({ post }) {
// Render post...
}
export async function getStaticPaths() {
// ...
}
// This also gets called at build time
export async function getStaticProps({ params }) {
// params contains the post `id`.
// If the route is like /posts/1, then params.id is 1
const res = await fetch(`https://.../posts/${params.id}`)
const post = await res.json()
// Pass post data to the page via props
return { props: { post } }
}
export default Post
To learn more about how getStaticPaths works, check out the Data Fetching documentation.
getStaticPaths๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ ์์ธํ ๋ด์ฉ์ Data Fetching ๋ฌธ์ ์ฐธ์กฐ
When should I use Static Generation? ์ธ์ ์ ์ ์์ฑ์ ์ฌ์ฉํด์ผํ ๊น?
We recommend using Static Generation (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.
๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๊ทธ๋ ์ง ์๋ ๊ฐ๋ฅํํ ์ ์ ์์ฑ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ถ์ฒํ๋ค. ๋น์ ์ ํ์ด์ง๋ค์ด ํ๋ฒ์ ์์ฑ๋๊ณ CDN์ ์ํด ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ํ์ด์ง๋ค์ด ์์ฒญ ๋๋ง๋ค ์๋ฒ์์ ๋ ๋ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋น ๋ฅด๋ค.
You can use Static Generation for many types of pages, including:
- Marketing pages
- Blog posts
- E-commerce product listings
- Help and documentation
You should ask yourself: "Can I pre-render this page ahead of a user's request?" If the answer is yes, then you should choose Static Generation.
"์ฌ์ฉ์๊ฐ ์์ฒญํ๊ธฐ ์ ์ ์ด ํ์ด์ง๋ฅผ ์ฌ์ ๋ ๋ํด๋ ๋๋๊ฐ"ํ๊ณ ๋จผ์ ๋ฌผ์ด ๋ณผ ์ ์๋ค. ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ์ ์ ์ธ ์์ฑ์ ์ ํํ๋ ๊ฒ์ด ์ข๋ค.
On the other hand, Static Generation is not a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.
๋ฐ๋ฉด์ ์ฌ์ฉ์์ ์์ฒญ ์ ์ ํ์ด์ง๋ฅผ ์ฌ์ ๋ ๋ํ ์ ์๋ค๋ฉด ์ ์ ์์ฑ์ ์ข์ ์์ด๋์ด๊ฐ ์๋๋ค. ์๋ง๋ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง ์ด๊ฑฐ๋ ๋งค ์์ฒญ ๋ง๋ค ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด...
In cases like this, you can do one of the following:
- Use Static Generation with Client-side Rendering: You can skip pre-rendering some parts of a page and then use client-side JavaScript to populate them. To learn more about this approach, check out the Data Fetching documentation.
- Use Server-Side Rendering: Next.js pre-renders a page on each request. It will be slower because the page cannot be cached by a CDN, but the pre-rendered page will always be up-to-date. We'll talk about this approach below.
์ด๋ฐ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ค์์ ๋ด์ฉ ์ค ํ๋๋ฅผ ์๋ํด๋ณผ ์ ์๋ค.
- ์ ์ ์์ฑ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ: ํ์ด์ง์ ์ด๋ค ๋ถ๋ถ์ ์ฌ์ ๋ ๋๋งํ๋ ๊ณผ์ ์ ์๋ตํ๊ณ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ด ๋ฐฉ์์ ๋ํด์ ๋ ์๊ธฐ ์ํ๋ค๋ฉด Data Fetching ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ผ.
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์ฌ์ฉํ๊ธฐ: Next.js๋ ํ์ด์ง ์์ฒญ๋ง๋ค ์ฌ์ ๋ ๋ํ๋ค. ์ด ๋ฐฉ์์ CDN์ ์ํด ์บ์ฑ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋๋ฆด ์ ์๋ค. ๊ทธ๋ ์ง๋ง ์ฌ์ ๋ ๋๋ ํ์ด์ง๋ ํญ์ ์ต์ ์ ์ํ์ผ ๊ฒ์ด๋ค. ์ด ๋ฐฉ์์ ๋ํด์๋ ์๋์์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
Server-side Rendering (SSR, Dynamic Rendering) ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
If a page uses Server-side Rendering, the page HTML is generated on each request.
ํ์ด์ง๊ฐ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฌ์ฉํ๋ค๋ฉด HTMLํ์ด์ง๋ ์์ฒญ๋๋ง๋ค ์์ฑ๋ ๊ฒ์ด๋ค.
To use Server-side Rendering for a page, you need to export an async function called getServerSideProps. This function will be called by the server on every request.
ํ์ด์ง์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ getServerSideProps๋ผ๋ ๋น๋๊ธฐ ํจ์๋ฅผ exportํด์ผํ๋ค. ์ด ํจ์๋ ์๋ฒ์ ์ํด์ ๋งค ์์ฒญ ๋ง๋ค ํธ์ถ๋ ๊ฒ์ด๋ค.
For example, suppose that your page needs to pre-render frequently updated data (fetched from an external API). You can write getServerSideProps which fetches this data and passes it to Page like below:
์๋ฅผ ๋ค์ด ๊ฐ๋ น ๋น์ ์ ํ์ด์ง๊ฐ ์์ฃผ ์ ๋ฐ์ดํธ ๋๋ ๋ฐ์ดํฐ(์ธ๋ถ API์์ ๊ฐ์ ธ์ค๋)์ ์ํด ์ฌ์ ๋ ๋๋ ํ์๊ฐ ์๋ค๋ฉด ์ด ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ธ์์ ์ ๋ฌํ๊ธฐ ์ํด getServerSideProps๋ฅผ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
function Page({ data }) {
// Render data...
}
// This gets called on every request
export async function getServerSideProps() {
// Fetch data from external API
const res = await fetch(`https://.../data`)
const data = await res.json()
// Pass data to the page via props
return { props: { data } }
}
export default Page
As you can see, getServerSideProps is similar to getStaticProps, but the difference is that getServerSideProps is run on every request instead of on build time.
์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด getServerSideProp๋ getStaticProps์ ๋น์ทํ์ง๋ง ์ฐจ์ด์ ์ด๋ผ๋ฉด getServerSideProps๋ ๋น๋ ์๊ฐ๋๋ง์ด ์๋๋ผ ๋งค ์์ฒญ๋ง๋ค ํธ์ถ๋๋ค๋ ๊ฒ์ด๋ค.
To learn more about how getServerSideProps works, check out our Data Fetching documentation
getServerSideProps์ด ์ด๋ป๊ฒ ๋์ํ๋์ง๋ Data Fetching ๋ฌธ์ ์ฐธ์กฐ
Summary ์์ฝ
We've discussed two forms of pre-rendering for Next.js.
- Static Generation (Recommended): The HTML is generated at build time and will be reused on each request. To make a page use Static Generation, either export the page component, or export
getStaticProps
(andgetStaticPaths
if necessary). It's great for pages that can be pre-rendered ahead of a user's request. You can also use it with Client-side Rendering to bring in additional data. - Server-side Rendering: The HTML is generated on each request. To make a page use Server-side Rendering, export
getServerSideProps
. Because Server-side Rendering results in slower performance than Static Generation, use this only if absolutely necessary. - ์ ์ ์์ฑ(์ถ์ฒ): HTML์ด ๋น๋ ์๊ฐ์ ์์ฑ๋๊ณ ๋งค ์์ฒญ๋ง๋ค ์ฌ์ฌ์ฉ๋๋ค. ํ์ด์ง๋ฅผ ์ ์ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ง๋๋ ค๋ฉด ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ exportํ๊ฑฐ๋ getStaticProps๋ฅผ (๊ทธ๋ฆฌ๊ณ ํ์ํ๋ค๋ฉด getStaticPaths๋) exportํ๋ค. ์ฌ์ฉ์์ ์์ฒญ ์ ์ ์ฌ์ ๋ ๋๋์ด๋ ๋๋ ํ์ด์ง๋ค์ ์ข๋ค. ์ ์ ์์ฑ์ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ์ฌ์ดํธ ๋ ๋๋ง๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์๋ ์๋ค.
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง: HTML์ด ๋งค ์์ฒญ๋ง๋ค ์์ฑ๋๋ค. ํ์ด์ง์์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ํ๋ ค๋ฉด getServerSideProps exportํ๋ค. ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ ์ ์์ฑ๋ณด๋ค ๋ ๋ฎ์ ์ฑ๋ฅ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ผ.
'Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ด๋ณด๋ด๋ฒ] Next.js docs - next/image (0) | 2021.04.01 |
---|---|
[๋ด๋ณด๋ด๋ฒ] Next.js docs - Image Component and Image Optimization (0) | 2021.03.31 |
[๋ด๋ณด๋ด๋ฒ] Next.js docs - Built-In CSS Support (0) | 2021.03.31 |
[๋ด๋ณด๋ด๋ฒ] Next.js docs - Routing (0) | 2021.03.30 |
[๋ด๋ณด๋ด๋ฒ] Next.js docs - Data Fetching (0) | 2021.03.30 |