Next.js ๊ณต์๋ฌธ์ ๋ฒ์ญ
Getting Started (์์ํ๊ธฐ)
์ ํ๋ฆฌ์ผ์ด์
๋ฃจํธ ๊ฒฝ๋ก์ pages์ public ๋๋ ํ ๋ฆฌ๊ฐ ์์ฑ๋๋ค.
pages: ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ ํ์ผ ๋ช ์ ๋ผ์ฐํฐ์ ์ฐ๊ฒฐ๋๋ค. ์๋ฅผ ๋ค์ด,pages/about.js๋/about๊ณผ ๋งคํ๋๋ค.public: ์ด๋ฏธ์ง, ํฐํธ ๋ฑ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ์ฅํ๋ค.publicํด๋ ์ ํ์ผ๋ค์ base URL(/)์ผ๋ก ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ฐธ์กฐํ ์ ์๋ค.
Next.js๋ ํ์ด์ง ๊ฐ๋
์ ์ค์ฌ์ผ๋ก ๋ง๋ค์ด์ก๋ค. ํ์ด์ง๋ pages ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ .js, .jsx, .ts, or .tsx ํ์
์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋งํ๋ค.
๋ฟ๋ง ์๋๋ผ ํ์ผ ์ด๋ฆ์ ํตํด dynamic route ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์ ์๋ค.
pages ๋๋ ํ ๋ฆฌ ์์ index.js ํ์ผ์ ์์์ ์ํ ํ์ผ์ด๋ค. ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฉ๋ฌธํ์ ๋ ๋ ๋๋ง ๋๋ ํ์ด์ง์ด๋ค.
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋:
- ์๋ ์ปดํ์ผ๊ณผ ๋ฒ๋ค๋ง
- React Fast Refresh
pages/์ ์ ์ generation ๋ฐ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง- base URL๊ณผ ๋งคํ๋๋
public/๋๋ ํ ๋ฆฌ๋ฅผ ํตํ ์ ์ ํ์ผ ์ ๊ณต
Basic Features (๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ)
Pages
pages/ ๋๋ ํ ๋ฆฌ์ ๊ฐ ํ์ด์ง๋ ํ์ผ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํฐ์ ์ฐ๊ฒฐ๋๋ค.
์: pages/about.js ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์๋ค๋ฉด ๊ทธ๊ฒ์ /about์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
Pages with Dynamic Routes
Next.js๋ ๋์ ๋ผ์ฐํ
ํ์ด์ง๋ฅผ ์ง์ํ๋ค. ์๋ฅผ ๋ค์ด, pages/posts/[id].js ํ์ผ์ ๋ง๋ค์๋ค๋ฉด,
๊ทธ๊ฒ์ posts/1, posts/2 ๋ฑ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ ์๋ค.
Pre-rendering
๊ธฐ๋ณธ์ ์ผ๋ก, Next.js๋ ๋ชจ๋ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ค. ์ด๊ฒ์ Next.js๋ client-side์์ ๋ชจ๋ ๊ฒ์ ์ํํ๋๊ฒ ์๋๋ผ ๋ฏธ๋ฆฌ ๊ฐ ํ์ด์ง์ HTML์ ์์ฑํ๋ค๋ ์๋ฏธ์ด๋ค. Pre-rendering์ ์ฑ๋ฅ๊ณผ SEO ์ธก๋ฉด์์ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์์ฑ๋ ๊ฐ HTML์ ํด๋น ํ์ด์ง์ ํ์ํ ์ต์ํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ฐ๊ด๋์ด ์๋ค. ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ํด๋น ํ์ด์ง๋ฅผ ์์ฒญ ๋ฐ์์ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๋ฉด์ ํ์ด์ง๋ฅผ ์์ ํ ์ํธ์์ฉํ๊ฒ ๋ง๋ ๋ค. (์ด ํ๋ก์ธ์ค๋ฅผ hydration์ด๋ผ๊ณ ํจ.)
Pre-rendering์ ๋๊ฐ์ง ํํ
Next.js๋ pre-rendering์ ๋๊ฐ์ง ํํ๋ฅผ ๊ฐ๊ณ ์๋ค: Static Generation๊ณผ Server-side Rendering. ์ด๊ฒ์ ์ธ์ HTML์ ์์ฑํ๋์ง์ ์ฐจ์ด๊ฐ ์๋ค.
- Static Generation (์ถ์ฒ): HTML์ด ๋น๋๋ ๋ ์์ฑ๋์ด ๊ฐ ์์ฒญ์ ์ํด ์ฌ์ฌ์ฉ๋๋ค.
- Server-side Rendering: HTML์ด ๊ฐ ์์ฒญ ๋ ์์ฑ๋๋ค.
์ค์ํ๊ฑด, Next.js๋ ๊ฐ ํ์ด์ง๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง์ ๋ฐ๋ผ pre-rendering ์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ค์์ ํ์ด์ง๋ฅผ ์ํ Static Generation๊ณผ ๊ทธ ์ธ์ ํ์ด์ง๋ค์ ์ํ Server-side Rendering์ ๋์์ ์ฌ์ฉํ๋ โhybridโ Next.js ์ฑ์ ๋ง๋ค ์ ์๋ค.
์ฑ๋ฅ์์ ์ด์ ๋ก Server-side Rendering ๋ณด๋ค๋ Static Generation ์ฌ์ฉ์ ์ถ์ฒํ๋ค. ์ ์ ์ผ๋ก ์์ฑ๋ ํ์ด์ง๋ ๋ณ๋์ ๊ตฌ์ฑ ์์ด CDN์ผ๋ก๋ถํฐ ์บ์ฑ๋์ด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค. ๊ทธ๋ฌ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ Server-side Rendering๋ง ์ฌ์ฉํด์ผํ ์ ์๋ค.
Static Generation ๋๋ Server-side Rendering๊ณผ ํจ๊ป Client-side data fetching ๋ํ ์ฌ์ฉํ ์ ์๋ค. ๋ฌด์กฐ๊ฑด ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ ๋๋ง ๋์ด์ผํ๋ ํ์ด์ง์ ๊ฒฝ์ฐ๋ฅผ ๋ปํ๋ค.
Static Generation
Static Generation์ ์ฌ์ฉํ๋ ํ์ด์ง๋ผ๋ฉด, ํด๋น ํ์ด์ง์ HTML์ ๋น๋ ์์ ์์ฑ๋๋ค. next build ๋ช
๋ น์ด๋ฅผ ์คํํ์ ๋ HTML์ด ์์ฑ๋๋ค๋ ๋ป์ด๋ค.
HTML์ ๊ฐ ์์ฒญ ์์ ์ฌ์ฌ์ฉ๋๋ค. ์ด๊ฒ ๋ํ CDN์ ํตํด ์บ์ฑ๋๋ค.
Next.js์์๋ ๋ฐ์ดํฐ์ ์ ๋ฌด์ ์๊ด์์ด ์ ์ ์ผ๋ก ํ์ด์ง๋ฅผ ์์ฑํ ์ ์๋ค.
Static Generation without data
๊ธฐ๋ณธ์ ์ผ๋ก, Next.js๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ Static Generation์ ์ฌ์ฉํ์ฌ pre-render ๋๋ค.
function About() {
return <div>About</div>
}
export default About์ด ํ์ด์ง๋ ์ฌ์ ์ ๋ ๋๋ง ๋ ๋ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ Next.js๋ HTML ํ์ด์ง๋ฅผ ๋น๋ ์์ ์์ฑํ๋ค.
Static Generation with data
๋ช๋ช ํ์ด์ง๋ค์ pre-rendering์ ์ํ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ Next.js์์ ์ ๊ณต๋๋ ๋๊ฐ์ง ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค:
- ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ํ์ด์ง ๋ด์ฉ๊ณผ ์์กด๋๋ ๊ฒฝ์ฐ:
getStaticProps - ์ธ๋ถ ๋ฐ์ดํฐ๊ฐ ๊ฒฝ๋ก์ ์์กด๋๋ ๊ฒฝ์ฐ:
getStaticPaths(์ผ๋ฐ์ ์ผ๋กgetStaticProps์ ํจ๊ป ์ฌ์ฉ)
์: ๋ธ๋ก๊ทธ์์ ๊ธ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ
์ฌ์ ๋ ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด Next.js๋ ๋์ผํ ํ์ผ์์ getStaticProps ๋น๋๊ธฐ ํจ์๋ฅผ export ํ๋ค.
์ด ํจ์๋ ๋น๋ ํ์ ๋ ํธ์ถ๋๋ฉฐ ์ฌ์ ๋ ๋๋ง ์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ page์ props๋ก ์ ๋ฌํ๋ค.
export default function Blog({ posts }) {
}
export async function getStaticProps() {
const res = await fetch('https://.../posts');
const posts = await res.json();
return {
props: {
posts,
},
}
}getStaticPaths()
export async function getStaticPaths() {
const res = await fetch('https://.../posts');
const posts = await res.json();
const paths = posts.map(post => ({
params: { id: posts.id },
}));
return { paths, fallback: false };
}์ธ์ Static Generation์ ์ฌ์ฉํด์ผํ ๊น?
์ธ์ ๋ ๊ฐ๋ฅํ๋ค๋ฉด Static Generation(๋ฐ์ดํฐ๊ฐ ์๋ ์๋ ) ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์๋ํ๋ฉด ํ์ด์ง๋ ํ๋ฒ ๋น๋๋๊ณ CDN์ผ๋ก๋ถํฐ ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ฒญ์ ์๋ฒ๊ฐ ๋ ๋๋ง ํด์ฃผ๋ ๊ฒ๋ณด๋ค ๋์ฑ ๋น ๋ฅด๋ค.
Server-side Rendering
Server-side Rendering์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ getServerSideProps ๋น๋๊ธฐ ํจ์๋ฅผ export ํด์ผ ํ๋ค.
์ด ํจ์๋ ๋งค ์์ฒญ๋ง๋ค ์๋ฒ๋ก๋ถํฐ ํธ์ถ๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ด์ง์์ ์์ฃผ ์
๋ฐ์ดํธ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด Page์ ์ ๋ฌํ๋
getServerSideProps๋ฅผ ์์ฑํ ์ ์๋ค.
export default function Page({ data }) {
}
export async function getServerSideProps() {
const res = await fetch('https://.../data');
const data = await res.json();
return { props: { data }};
}๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ด getServerSideProps๋ getStaticProps์ ๋น์ทํ๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ ์ getServerSideProps๋
๋น๋ ๋๋ง ํธ์ถ๋๋๊ฒ ์๋๋ผ ๋งค ์์ฒญ๋ง๋ค ํธ์ถ๋๋ค๋ ์ ์ด๋ค.
Data Fetching Overview (๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๊ฐ์)
Next.js์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ ์ ์๋ค. Server-side Rendering ๋๋ Static Generation ๊ณผ ๊ฐ์ pre-rendering์ ํฌํจํ๊ณ ๋ฐํ์ ์ ์์ ๋๋ ์ฝํ ์ธ ์์ฑ์ ์ํ Incremental Static Regeneration์ด ์๋ค.
getServerSideProps
๋ง์ฝ ํ์ด์ง๋ก๋ถํฐ getServerSideProps(Server-Side Rendering) ๊ฐ ํธ์ถ๋๋ค๋ฉด Next.js๋
getServerSideProps์์ ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์์ฒญ์ ์ํ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ค.
getServerSideProps๋ ์ค์ง ํ์ด์ง์์๋ง ์ฌ์ฉํ ์ ์๋ค. page๊ฐ ์๋ ํ์ผ์์๋ ์ฌ์ฉํ ์ ์๋ค.
์ธ์ getServerSideProps๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น
์์ฒญ ์ ๋ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํ๋ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ์๋ง getServerSideProps ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
getServerSideProps๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง๋ ์์ฒญ ์ ์๋ฒ ์ธก์์ ๋ ๋๋ง๋๋ฉฐ cache-control ํค๋๊ฐ ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ์๋ง ์บ์ฑ๋๋ค.
๋ง์ฝ ์์ฒญ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ ํ์๊ฐ ์๋ค๋ฉด, ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋๋ getStaticProps ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์
๊ณ ๋ คํด์ผ ํ๋ค.
getServerSideProps or API Routes
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ํ๋ค๋ฉด API Route์ ๋๋ฌํ ๋ค์ getServerSideProps์์ ํด๋น API๋ฅผ ํธ์ถํ๊ณ ์ถ์ ์๋ ์๋ค.
๊ทธ๊ฒ์ ์๋ฒ์์ ์คํ ์ค์ธ getServerSideProps์ API Routes๋ก ์ธํด ์ถ๊ฐ์ ์ธ request๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ์ด๋ ๋ถํ์ํ๊ณ ๋นํจ์จ์ ์ธ ์ ๊ทผ์ด๋ค.
์ด์ด์ง๋ ์์ ๋ฅผ ๋ณด๋ฉด, API route๋ CMS๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด API route๋ getServerSideProps๋ก๋ถํฐ ์ง์ ํธ์ถ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ถ๊ฐ ํธ์ถ์ด ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋๋ค. ๋์ ์ getServerSideProps ๋ด๋ถ๋ก API Route์์ ์ฌ์ฉ๋๋ ๋ก์ง์ importํ๋ฉด ๋๋ค.
์ด๊ฒ์ CMS, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๋ค๋ฅธ API๋ฅผ getServerSideProps ์์์ ์ง์ ํธ์ถํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
getServerSideProps with Edge API Routes
getServerSideProps๋ Serverless ๋ฐ Edge Runtimes์์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ๋ ๋ค props๋ฅผ ์ค์ ํ ์ ์๋ค.
๊ทธ๋ฌ๋, ํ์ฌ Edge Runtime์ reponse ๊ฐ์ฒด์ ์ ๊ทผ ๊ถํ์ด ์๋ค. ์ฆ ์๋ฅผ ๋ค์ด getSErverSideProps์์ ์ฟ ํค๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
response ๊ฐ์ฒด์ ์ ๊ทผ ๊ถํ์ ๊ฐ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ ๋ฐํ์์ธ Node.js ๋ฐํ์ ํ๊ฒฝ์ ๊ณ์ ์ฌ์ฉํด์ผ ํ๋ค.
์์ฒ๋ผ, config ํ์ผ์ ์์ ํ์ฌ per-page basis๋ฅผ ์ํ runtime์ ๋ช ์์ ์ผ๋ก ์ธํ ํ ์ ์๋ค.
export const config = {
runtime: 'nodejs',
}Fetching data on the client side
์์ฃผ ์ ๋ฐ์ดํธ ๋๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ํ์ด์ง๋ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ์ ๋ ๋๋งํ ํ์์์ด client side์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ฌ์ฉ์ ์์ธ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ค์ด๋ณธ๋ค๋ฉด
- ์ฒซ์งธ, ๋ฐ์ดํฐ ์์ด ์ฆ์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋ค. ํ์ด์ง ์ผ๋ถ๋ Static Generation์ ์ฌ์ฉํ์ฌ ์ฌ์ ์ ๋ ๋๋ง๋ ์ ์๋ค. ๋๋ฝ๋ ๋ฐ์ดํฐ์ ๋ก๋ฉ ์ํ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค.
- ๊ทธ๋ฆฌ๊ณ client side์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ค๋น๋์์ ๋ ๋ณด์ฌ์ค๋ค.
์ด๊ฒ์ ์๋ฅผ ๋ค์ด ์ฌ์ฉ์์ ๋์๋ณด๋ ํ์ด์ง์ ์ ํฉํ๋ค. ์๋ํ๋ฉด ๋์๋ณด๋๋ privateํ๊ณ ์ฌ์ฉ์์ ์์ธ ํ์ด์ง์ด๋ฉฐ SEO์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ๋ ๋๋ง์ด ํ์ํ์ง ์๋ค. ๋ฐ์ดํฐ๋ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ฏ๋ก ์์ฒญ ์ ๊ฐ์ ธ์์ผ ํ๋ค.
Using getServerSideProps to fetch data at request time
์๋ ์์ ๋ request time์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ ์ ๋ ๋๋ง ํ๋์ง ๋ณด์ฌ์ค๋ค.
function Page({ data }) {
}
export async function getServerSideProps() {
const res = await fetch('https://.../data');
const data = await res.json();
return { props: { data } };
}
export default PageCaching with Server-Side Rendering (SSR)
๋์ ์๋ต์ ์บ์ฑํ๊ธฐ ์ํด getServerSideProps ์์ caching headers(Cache-Control)์ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, stale-while-revalidate๋ฅผ ์ฌ์ฉํด๋ณด์.
export async function getServerSideProps({ req, res }) {
res.setHeader(
'Cache-Control',
'public, s-maxage=10, stale-while-revalidate=59'
)
return {
props: {},
}
}Does getServerSideProps render an error page
๋ง์ฝ getServerSideProps ๋ด๋ถ์ ์๋ฌ๊ฐ ์๋ค๋ฉด pages/500.js ํ์ผ์ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
์ด๊ฒ์ ์ด๋ป๊ฒ ๋ง๋๋์ง์ ๋ํด ์์ธํ ๋ด์ฉ์ 500 page ๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ฉด ๋๋ค.
๊ฐ๋ฐํ๋ ๋์์๋ ์ด ํ์ผ์ด ์ฌ์ฉ๋์ง ์๊ณ dev overlay ๊ฐ ๋์ ๋ณด์ฌ์ง๋ค.