๐ Next.js์ Static Generation: ์ ์ ์์ฑ์ ๋ชจ๋ ๊ฒ ๐ผ๏ธ
Next.js๋ React ์ํ๊ณ์์ SSR(Server Side Rendering)๊ณผ SSG(Static Site Generation)๋ฅผ ๋งค๋๋ฝ๊ฒ ํตํฉํ์ฌ ๊ฐ๋ ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋ ํ๋ ์์ํฌ์ ์ ์ ์ด์์. ์ค๋์ **์ ์ ์์ฑ(Static Generation)**์ ๋ํด ๊น์ด ํ๊ณ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ ์ฌ์ฉํด์ผ ํ๋์ง, ์ด๋ป๊ฒ ๊ตฌํํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ์ด๋ค ์ด์ ์ ์ป์ ์ ์๋์ง๊น์ง์. ๐ ๏ธ
โจ Static Generation์ด๋?
์ ์ ์์ฑ(Static Generation)์ ๋น๋ ํ์์ HTML ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฌํ HTML์ ์์ฒญ ์ ์๋ฒ์์ ์์ฑ๋์ง ์๊ณ , ๋ฏธ๋ฆฌ ๋น๋๋ ์ํ๋ก ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋ฉ๋๋ค.
• ์ฅ์ :
• ๋น ๋ฅธ ์๋: ์ ์ ํ์ผ์ CDN(Content Delivery Network)์ ์บ์ฑ๋์ด ์์ฒญ ์ ์ฆ์ ์ ๊ณต๋ฉ๋๋ค.
• ๋ณด์: ์๋ฒ ๋ก์ง์ด ์คํ๋์ง ์์ผ๋ฏ๋ก ๊ณต๊ฒฉ ํ๋ฉด์ด ์ ์ต๋๋ค.
• SEO ์ต์ ํ: ๊ฒ์ ์์ง์ ์ ์ HTML ํ์ผ์ ๋ฐ๋ก ํฌ๋กค๋งํ ์ ์์ต๋๋ค.
๐ก Static Generation์ด ์ ํฉํ ๊ฒฝ์ฐ
๐ ์ ์ ์ฝํ ์ธ
๋ธ๋ก๊ทธ, ๋ฌธ์, ๋ง์ผํ ํ์ด์ง ๋ฑ ๋ณ๊ฒฝ ๋น๋๊ฐ ๋ฎ์ ์ฝํ ์ธ ์ ์ ํฉํฉ๋๋ค.
๐ฆ API ๊ธฐ๋ฐ ์ฝํ ์ธ
API์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๊ฐ ๋น๋ฒํ ์ ๋ฐ์ดํธ๋์ง ์๋๋ค๋ฉด, ์ด๋ฅผ ์ ์ ์ผ๋ก ๋น๋ํ์ฌ ํจ์จ์ฑ์ ๊ทน๋ํํ ์ ์์ด์.
๐ง Static Generation ๊ตฌํ ๋ฐฉ๋ฒ
Next.js์์๋ getStaticProps์ getStaticPaths ๋ ๊ฐ์ง ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ์์ฑ์ ๊ตฌํํฉ๋๋ค.
1๏ธโฃ getStaticProps: ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋น๋ ํ์์ ๊ฐ์ ธ์ค๊ธฐ
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
export async function getStaticProps() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: {
posts
}
};
}
• **getStaticProps**๋ ๋น๋ ํ์์ ์คํ๋์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
• ๋ฐํ๋ props๋ ํ์ด์ง ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ฉ๋๋ค.
์์ : ๋ธ๋ก๊ทธ ํฌ์คํธ ๋ฆฌ์คํธ
const Blog = ({ posts }) => (
<div>
<h1>Blog</h1>
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
export default Blog;
export async function getStaticProps() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: {
posts
}
};
}
2๏ธโฃ getStaticPaths: ๋์ ๋ผ์ฐํ ๊ณผ ์ ์ ์์ฑ
๋์ ์๋ฆฌ
getStaticPaths๋ ๋์ ๊ฒฝ๋ก([id])๋ฅผ ์ ์ ์ผ๋ก ๋น๋ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
export async function getStaticPaths() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
const paths = posts.map(post => ({
params: { id: post.id.toString() }
}));
return {
paths,
fallback: false
};
}
• paths: ์ ์ ์ผ๋ก ์์ฑํ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
• fallback:
• false: ์ง์ ๋ ๊ฒฝ๋ก ์ธ์๋ 404๋ฅผ ๋ฐํํฉ๋๋ค.
• true: ์์ฒญ ์ ๊ฒฝ๋ก๋ฅผ ์์ฑํฉ๋๋ค.
• 'blocking': ์์ฒญ์ด ๋๋ ๋๊น์ง ์ฌ์ฉ์์๊ฒ ์๋ฌด๊ฒ๋ ํ์ํ์ง ์์ต๋๋ค.
์์ : ๋ธ๋ก๊ทธ ์์ธ ํ์ด์ง
const Post = ({ post }) => (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
);
export default Post;
export async function getStaticProps({ params }) {
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post
}
};
}
export async function getStaticPaths() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
const paths = posts.map(post => ({
params: { id: post.id.toString() }
}));
return {
paths,
fallback: false
};
}
๐ ISR(Incremental Static Regeneration)์์ ์ฐจ์ด์
Next.js๋ SSG์ ISR์ ์ถ๊ฐํ์ฌ, ๊ธฐ์กด ๋น๋ ํ์์๋ง ์์ฑ๋๋ ์ ์ ํ์ผ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
ISR ์ฌ์ฉ ์์
export async function getStaticProps() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: {
posts
},
revalidate: 10 // 10์ด๋ง๋ค ์ฌ์์ฑ
};
}
• revalidate: ํ์ด์ง๊ฐ **์ง์ ๋ ์๊ฐ(์ด)**๋ง๋ค ๋ค์ ์์ฑ๋ฉ๋๋ค.
๐ Static Generation์ ์ฃผ์ ์ด์
1. SEO ์ต์ ํ
์ ์ HTML ํ์ผ์ ๊ฒ์ ์์ง์ด ์ฝ๊ฒ ํฌ๋กค๋งํ ์ ์์ต๋๋ค.
2. ๋น ๋ฅธ ๋ก๋ ์๋
CDN์์ ์บ์ฑ๋ ์ ์ ํ์ผ์ ์ง์ ์ ๊ณตํ๋ฏ๋ก ์ง์ฐ ์๊ฐ์ด ๊ฑฐ์ ์์ต๋๋ค.
3. ๋น์ฉ ํจ์จ์ฑ
์๋ฒ ์์ฒญ์ด ์ค์ด๋ค์ด ๋น์ฉ์ ์ ๊ฐํ ์ ์์ต๋๋ค.
4. ๋ณด์ ๊ฐํ
์๋ฒ์ฌ์ด๋ ๋ก์ง์ด ์์ผ๋ฏ๋ก ๊ณต๊ฒฉ ํ๋ฉด์ด ์ค์ด๋ญ๋๋ค.
๐ค Static Generation์ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
์ ํฉํ ๊ฒฝ์ฐ:
• ๋ธ๋ก๊ทธ, ๋ฌธ์ ์ฌ์ดํธ
• ๋ณ๊ฒฝ์ด ์ ์ ๋ง์ผํ ํ์ด์ง
• SEO๊ฐ ์ค์ํ ์ฝํ ์ธ
๋ถ์ ํฉํ ๊ฒฝ์ฐ:
• ์ฌ์ฉ์ ๋ง์ถคํ ๋ฐ์ดํฐ(๋ก๊ทธ์ธ ์ํ, ๊ถํ ๋ฑ)
• ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฝํ ์ธ (์: ์ฃผ์ ๊ฐ๊ฒฉ)
๐ ์ค๋ฌด์์์ ํ
1. API ํธ์ถ ์ฃผ์:
SSG๋ ๋น๋ ํ์์ ์คํ๋๋ฏ๋ก, ๋ฐ์ดํฐ ์์ค๊ฐ ์์ ์ ์ด๊ณ ๋น ๋ฅธ ์๋ต์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
2. ISR๊ณผ ์กฐํฉ:
์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ISR๊ณผ SSG๋ฅผ ์กฐํฉํ์ธ์.
3. Fallback ์ค์ :
๋์ ๋ผ์ฐํ ์ ๊ฒฝ์ฐ fallback ์ต์ ์ ์ํฉ์ ๋ง๊ฒ ์ค์ ํ์ธ์. ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด 'blocking'์ด ์ ํฉํ ์ ์์ต๋๋ค.
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น!๐ท
Static Generation์ ๋น ๋ฅธ ๋ก๋ฉ ์๋์ SEO ์ต์ ํ๋ฅผ ๋ชจ๋ ์ก์ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. Next.js์ ์ ์ ์์ฑ์ ํ์ฉํ์ฌ ์ต๊ณ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํด ๋ณด์ธ์! ๐
'Front-end > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ Next.js๋ก API ๋ง๋ค๊ธฐ: ์ฝ๊ณ ๊น๋ํ ๋ฐฑ์๋ ๊ตฌ์ถ๋ฒ ๐ก (0) | 2025.02.17 |
---|---|
Next.js์ useRouter ์์ ์ ๋ณต: ๋ผ์ฐํ ์ ํต์ฌ ์ดํดํ๊ธฐ (1) | 2025.02.15 |
[Next] SSG(Static Site Generation)๋? ๐ (1) | 2025.02.01 |