์ค๋์ Next.js์์ ์ฌ์ฉํ ์ ์๋ 4๊ฐ์ง ๋ ๋๋ง ๋ฐฉ์์ ๋ํด ์์๋ดค๋ค. ๊ฐ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๋ค๋ฅธ์ง, ์ด๋จ ๋ ์ฐ๋ฉด ์ข์์ง, ๊ทธ๋ฆฌ๊ณ ์ ๋๋ก ๋์ํ๋์ง ์ด๋ป๊ฒ ํ ์คํธํ๋์ง ์ ๋ฆฌํ๋ค.
CSR์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ ๋๋งํ๋ ๋ฐฉ์์ด๋ค.
์ฒ์์ ๋น HTML์ ๋ฐ์์จ ๋ค์, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ฉด์ API๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ทธ๋์ ์ฒ์์ ๋น ํ๋ฉด์ด ๋ณด์ด๋ค๊ฐ ๋์ค์ ๋ฐ์ดํฐ๊ฐ ์ฑ์์ง๋ ๊ฒฝํ์ ํ๊ฒ ๋๋ค.


"use client";
import React from "react";
import PostListPage from "../components/PostListPage";
const page = () => {
return (
<>
<h1>CSRPage</h1>
<PostListPage />
</>
);
};
export default page;
์ฌ์ฉ์ ๋์๋ณด๋์ฒ๋ผ ๊ฐ์ธํ๋ ํ์ด์ง
SEO๊ฐ ์ค์ํ์ง ์์ ํ์ด์ง
๋ง์ ์ํธ์์ฉ์ด ํ์ํ ํ์ด์ง
SSR์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ HTML์ ์์ฑ์ํจ ๋ค์์ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ด๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์๋ ์ฒซ ๋ก๋ฉ๋ถํฐ ์์ฑ๋ ํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ค!

import { DEFAULT_POST_URL } from "../constants/postConstant";
import { Post } from "../types/posts";
import PostList from "../components/PostList";
const page = async () => {
const res = await fetch(`${DEFAULT_POST_URL}/posts`, {
cache: "no-store", // ์ด ์ต์
์ด SSR์ ํต์ฌ!
});
const data: Post[] = await res.json();
return (
<>
<h1>SSRPage</h1>
<PostList data={data} />
</>
);
};
export default page;
์ฌ๊ธฐ์ cache: "no-store" ์ต์
์ด ์ค์ํ๋ค! ์ด ์ต์
์ "์บ์ ์ฌ์ฉํ์ง ๋ง๊ณ ํญ์ ์๋ฒ์์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์!"๋ผ๋ ์๋ฏธ๋ค.
ISR์ ์ ์ ํ์ด์ง(SSG)์ด์ง๋ง ์ผ์ ์๊ฐ๋ง๋ค ๋ค์ ์์ฑ๋๋ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
๋ฏธ๋ฆฌ ์์ฑ๋ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ฉด์๋, ์ค์ ํ ์๊ฐ์ด ์ง๋๋ฉด ์๋ก์ด ๋ฐ์ดํฐ๋ก ์
๋ฐ์ดํธ๋๋ ๋ฐฉ์์ด๋ค!

import React from "react";
import { DEFAULT_POST_URL } from "../constants/postConstant";
import { Post } from "../types/posts";
const page = async () => {
const res = await fetch(`${DEFAULT_POST_URL}/posts`, {
next: {
revalidate: 20, // 20์ด๋ง๋ค ํ์ด์ง ์ฌ์์ฑ!
},
});
const data: Post[] = await res.json();
return (
<>
<h1>ISRPage</h1>
<ul>
{data.map((e) => (
<li key={e.id} className="flex flex-col">
<span>title: {e.title}</span>
<span>author: {e.author}</span>
</li>
))}
</ul>
</>
);
};
export default page;
next: { revalidate: 20 } ์ต์
์ด ํต์ฌ์ด๋ค! 20์ด๋ง๋ค ์๋ฒ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ด์ง๋ฅผ ๋ค์ ์์ฑํ๋ค๋ ์๋ฏธ๋ค.
SSG๋ ๋น๋ ํ์์ HTML์ ์์ฑํด๋๊ณ ๊ณ์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
ํ ๋ฒ ์์ฑ๋ HTML์ ๋ณ๊ฒฝ๋์ง ์๊ณ ๊ณ์ ๊ฐ์ ๋ด์ฉ์ ์ ๊ณตํ๋ค.

import React from "react";
import { DEFAULT_POST_URL } from "../constants/postConstant";
import { Post } from "../types/posts";
import PostList from "../components/PostList";
const page = async () => {
const res = await fetch(`${DEFAULT_POST_URL}/posts`); // ๊ธฐ๋ณธ๊ฐ์ด force-cache
const data: Post[] = await res.json();
return (
<>
<h1>SSGPage</h1>
<PostList data={data} />
</>
);
};
export default page;
fetch ํจ์์ ์๋ฌด๋ฐ ์บ์ ์ต์ ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ force-cache๋ก, ์ด๋ SSG ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
| ๋ ๋๋ง ๋ฐฉ์ | ๋ฐ์ดํฐ ๋ก๋ฉ ์์ | HTML ์์ค์ ๋ฐ์ดํฐ ํฌํจ? | ํน์ง | ์ ํฉํ ์ฌ์ฉ ์ผ์ด์ค |
|---|---|---|---|---|
| CSR | ๋ธ๋ผ์ฐ์ ์์ | โ ์์ | ์ฒ์์ ๋น ํ๋ฉด, ํ์ ๋ฐ์ดํฐ ๋ก๋ | ๋์๋ณด๋, ๊ด๋ฆฌ์ ํ์ด์ง |
| SSR | ๋งค ์์ฒญ๋ง๋ค ์๋ฒ์์ | โ ํฌํจ | ํญ์ ์ต์ ๋ฐ์ดํฐ ์ ๊ณต | ๋ธ๋ก๊ทธ, ๋ด์ค, SEO ์ค์ ํ์ด์ง |
| ISR | ์ผ์ ์๊ฐ๋ง๋ค ์๋ฒ์์ | โ ํฌํจ | ์ ์ ์ด์ง๋ง ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ | ์ ํ ๋ชฉ๋ก, ์ค๊ฐ ์ ๋ ๋ณ๊ฒฝ ๋น๋ |
| SSG | ๋น๋ ์ ํ๋ฒ๋ง | โ ํฌํจ | ํญ์ ๊ฐ์ ๋ด์ฉ ์ ๊ณต, ๋งค์ฐ ๋น ๋ฆ | ํ์ฌ ์๊ฐ, ๋ง์ผํ ํ์ด์ง |