๐ก TIL 20230817 - SSR vs SSG vs ISR
์ ๋ฒ ๊ธ์์๋ CSR(ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง)๊ณผ SSR(์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง)์ ์ฐจ์ด์ ์ ๋ํด ๊ณต๋ถํ๋ค๋ฉด, ์ค๋์ SSR, SSG, ISR์ ๋ํด ์ ๋ฆฌํด๋ณด์๋ค.
1. SSR (Server Side Rendering)
1) ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
SSR์ CSR๊ณผ ๋ฐ๋๋๋ ๊ฐ๋ ์ผ๋ก ์๋ฒ์์ ํ์ด์ง๋ฅผ ๋ ๋๋งํด์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์์ด๋ค. Next.js์์ SSG๋ ISR๊ณผ ๊ตฌ๋ถ๋๋ ์ด์ ๋ ๋ ๋๋ง๋๋ ์์ ๋๋ฌธ์ธ๋ฐ, SSR์ ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋๋ง๋ค ๊ทธ ์์ ์ ํ์ด์ง๋ฅผ ์๋กญ๊ฒ ๋ ๋๋งํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ fetch ํด์ผํ๋ ๋ฐ์ดํฐ๊ฐ ๋น๋ฒํ๊ฒ ๋ณ๊ฒฝ๋ ๋ ์ฌ์ฉ๋๋ค.
2) getServerSideProps
- getServerSideProps ํจ์๋ server์์๋ง ์คํ๋๋ค. broswer์์๋ ์คํ๋์ง ์๋๋ค.
- getServerSideProps ํจ์๋ runtime์์๋ง ์คํ๋๋ค.
- getServerSideProps์์๋ context ๊ฐ์ฒด๋ฅผ ํตํด, ํด๋น ํ์ด์ง์์๋ next router๋ฅผ ํตํด URL Query ํ๋ผ๋ฏธํฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- getServerSideProps์ ๋ฐํ ๊ฐ์ ํด๋น ํ์ด์ง์ props๋ก ์ ๋ฌ๋๋ค.
import Seo from "@/components/Seo";
import { InferGetServerSidePropsType, GetServerSideProps } from "next";
export interface MovieProps {
// ์๋ต
}
const Home = ({ results }: InferGetServerSidePropsType<GetServerSideProps>) => {
return (
<div className="container">
<Seo title="Home" />
{results?.map((movie: MovieProps) => (
<div className="movie" key={movie.id}>
<img src={`https://image.tmdb.org/t/p/w500/${movie.poster_path}`} />
<h4>{movie.title}</h4>
</div>
))}
<style jsx>{`
// ์๋ต
`}</style>
</div>
);
};
export default Home;
export const getServerSideProps = async ({}) => {
const { results } = await (
await fetch(`http://localhost:3000/api/movies`)
).json();
return {
props: {
results,
},
};
};
3) ํญ์ SSR์ ํด์ผํ๋ ๊ฒ์ธ์ง?
โ ์ ํ์ ๋ฌธ์
- SSR์ getServerSideProps() ์ฌ์ฉ
- Loading ํ๋ฉด์์ด fetchํด์จ ๋ฐ์ดํฐ๊ฐ ์ ํจํ ๋(์๋ฒ์์ fetch๊ฐ ์๋ฃ๋ ํ) ํ๋ฉด์ด ๋ณด์ฌ์ง๊ฒ ํ๋ ๊ฒ์ด ์ข์ ๋
- SSG getServerSideProps() ์ฌ์ฉ
- Static shell์ ๊ฐ์ง ์ฑ๋ก ์ ์ ๋ค์๊ฒ Loading ํ๋ฉด์ ๋ณด์ฌ์ค ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๊ฒ ์ข์ ๋
- ๋ฐ์ดํฐ๋ฅผ pre-render ํ ํ์๊ฐ ์์ผ๋ฉด ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ณ ๋ คํ ๊ฒ
2. SSG (Static Site Generation)
1) ์ ์ ์ฌ์ดํธ ์์ฑ
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ์์ ์ด ์๋, ๋น๋ ์์ ์ ํ์ด์ง๋ฅผ ์์ฑํด๋๋ ๊ฒ
- ๋ฐ๋ก ์ค์ ์ ํ์ง ์๋๋ค๋ฉด, next.js๋ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๋ ํ์ด์ง๋ฅผ Static Generationํ๋ ค๊ณ ํ๋ค.
- data fetching์ด ํ์ํ ๊ฒฝ์ฐ, getStaticProps๊ฐ ์คํ๋๊ณ ๋ฆฌํดํ๋ ๊ฐ์ ์ปดํฌ๋ํธ์์ ๋ฐ์์ ํ์ด์ง๋ฅผ pre-renderingํ๊ฒ ๋๋ค.
- ๋จ, ๋น๋ ์์ ์ ํ์ด์ง๊ฐ ๋ฏธ๋ฆฌ ์์ฑ๋๋ฏ๋ก fetching data๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ค์ ๋น๋ํ์ง ์๋ ์ด์ ๋ฐ์๋์ง ์๋๋ค.
2) getStaticProps, getStaticPaths
- SSG๋ฅผ ์ํ๋ ํ์ด์ง์ getStaticProps๋ฅผ ์ถ๊ฐํ๋ฉด, ํด๋น ํ์ด์ง๋ ๋น๋ํ ๋ ๋ ๋๋ง ๋๋ค.
- getStaticProps ํจ์๋ server์์๋ง ์คํ๋๋ค. Browser์์๋ ์คํ๋์ง ์๋๋ค.
- getStaticProps ํจ์๋ ๋น๋ํ๋ ๊ทธ ์๊ฐ๋ง ์คํ๋๋ค.
- getStaticProps์์๋ getServerSideProps์์ context๋ฅผ ํตํด ์ฝ๊ฒ query์ ์ ๊ทผํ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ dynamic routing์ ์ง์ํ๋ ค๋ฉด ํน๋ณํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- getStaticProps์ return๊ฐ์ ํด๋น ํ์ด์ง์ props๋ก ์ ๋ฌ๋๋ค.
3. ISR (Incremental Static Regeneration)
1) ์ฆ๋ถ ์ ์ ์ฌ์์ฑ
- ๋น๋ ์์ ์ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ ํ, ์ค์ ํ ์๊ฐ๋ง๋ค ํ์ด์ง๋ฅผ ์๋ก ๋ ๋๋งํ๋ค.
- SSG์ ํฌํจ๋๋ ๊ฐ๋
์ด์ง๋ง, revaildate ์์ฑ์ด ์ถ๊ฐ๋ ๊ฐ๋
์ด๋ผ๊ณ ์ดํดํ ์ ์๋ค.
- SSG๋ ๋น๋ํ ๋ ํ์ด์ง๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ fetching data๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ๋น๋ํด์ผํ์ง๋ง, ISR์ ์ผ์ ์๊ฐ๋ง๋ค ์์์ ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํธ ํด์ค๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
2) revaildate
ISR์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. getStaticProps์ revalidate ์์ฑ๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
export async function getStaticProps() {
const res = await fetch('https://.../posts')
const posts = await res.json()
return {
props: {
posts,
},
// Next.js will attempt to re-generate the page:
// - When a request comes in
// - At most once every 10 seconds
revalidate: 10, // 10์ด ๋ค์ ํด๋น ํ์ด์ง๋ฅผ ๋ค์ ๋น๋ํ๋ค.
}
}
์ฐธ๊ณ ์ฌ์ดํธ
์๋ํ ํํฐ๋ ๊ฐ์์๋ฃ (๋ ธ์ )
Visual Explanation and Comparison of CSR, SSR, SSG and ISR
[Next js] SSR, SSG, ISR ์ดํดํ๊ธฐ
'โ๏ธ What I Learned > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] Tailwind CSS ์ฅ๋จ์ , ์ฐ์ต์์ (0) | 2023.08.19 |
---|---|
[TIL] Next.js 13 - getStaticProps, getStaticPaths (feat. 12๋ฒ์ ์์์ getServerSideProps) (0) | 2023.08.18 |
[TIL] Next.js - redirect์ rewrite (0) | 2023.08.16 |
[TIL] React.js์ Next.js์ ์ฐจ์ด์ - Library vs Framework, CSR vs SSR (0) | 2023.08.15 |
[TIL] npm vs npx vs yarn (0) | 2023.08.15 |