728x90
1๏ธโฃ CSR (Client Side Rendering)
ํด๋ผ์ด์ธํธ๊ฐ ๋ธ๋ผ์ฐ์ ์์ JS๋ฅผ ์คํํด UI๋ฅผ ๋ ๋๋ง
๐ ๋์ ๋ฐฉ์
- ์๋ฒ๋ ์ต์ํ์ HTML๊ณผ JS ๋ฒ๋ค์ ์ ์กํ๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ JS๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํ์ฌ DOM์ ์์ฑํ๋ค.
- ํ์ํ ๋ฐ์ดํฐ๋ฅผ API๋ก ํธ์ถํ ๋ค ํ๋ฉด์ ๋ ๋๋งํ๋ค.
โ ์ฅ์
- ํ์ด์ง ๊ฐ ์ ํ์ด ๋น ๋ฅด๊ณ ๋ถ๋๋ฌ์ (SPA ํน์ฑ)
- ์๋ฒ ๋ถํ๊ฐ ์ ๊ณ , ์บ์ฑ ๊ตฌ์กฐ ๋จ์
- ํด๋ผ์ด์ธํธ ์ํ ๊ด๋ฆฌ ์ฉ์ด (Redux, Zustand ๋ฑ)
โ ๋จ์
- ์ด๊ธฐ ๋ก๋ฉ ์ง์ฐ (JS ๋ค์ด๋ก๋ + ์คํ ์๊ฐ ํ์)
- ๋ฐ์ดํฐ ์์ฒญ ์ ๊น์ง ๋น ํ๋ฉด → CLS / LCP ์ ํ
- SEO์ ๋ถ๋ฆฌ (HTML์ ์ค์ ์ฝํ ์ธ ์์)
๐งฑ ์์
useEffect(() => {
fetch('/api/posts').then(r => r.json()).then(setPosts);
}, []);
2๏ธโฃ SSR (Server Side Rendering)
์๋ฒ์์ ์์ฒญ ์ HTML์ ์์ฑํด ๋ณด๋ด๋ ๋ฐฉ์
๐ ๋์ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ์๋ฒ์์ React๋ฅผ ์คํ.
- ๋ฐ์ดํฐ๋ฅผ fetch → HTML ์์ฑ ํ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌ.
- ๋ธ๋ผ์ฐ์ ๋ ์์ฑ๋ HTML์ ์ฆ์ ํ์ ํ, JS๊ฐ “hydrate”๋จ.
โ ์ฅ์
- ์ด๊ธฐ ํ๋ฉด์ด ์์ฑ๋ ์ํ๋ก ์ ๋ฌ → LCP / CLS ๊ฐ์
- SEO ์นํ์ (HTML์ ์ค์ ์ฝํ ์ธ ์กด์ฌ)
- ๋์ ๋ฐ์ดํฐ ํ์ ๊ฐ๋ฅ (์์ฒญ๋ง๋ค ์ต์ ํ)
โ ๋จ์
- ์๋ฒ ๋ถํ ์ฆ๊ฐ (๋งค ์์ฒญ๋ง๋ค ๋ ๋๋ง)
- ์๋ต ์๋ ๋๋ฆผ (๋ฐ์ดํฐ fetch + ๋ ๋๋ง ๋น์ฉ)
- CDN ์บ์ฑ ์ด๋ ค์
๐งฑ ์์
export async function getServerSideProps() {
const data = await fetch('<https://api.example.com/posts>').then(r => r.json());
return { props: { data } };
}
3๏ธโฃ SSG (Static Site Generation)
๋น๋ ํ์์ ๋ฏธ๋ฆฌ HTML ํ์ผ์ ์์ฑํด๋๋ ๋ฐฉ์
๐ ๋์ ๋ฐฉ์
- ๋ฐฐํฌ ์์ (๋น๋ ์)์ ๋ฐ์ดํฐ fetch → HTML ์์ฑ
- ์ฌ์ฉ์๋ CDN์์ ์ฆ์ ์์ฑ๋ HTML์ ๋ฐ์๋ณธ๋ค.
โ ์ฅ์
- ๊ฐ์ฅ ๋น ๋ฅธ ์ด๊ธฐ ๋ ๋ (CDN์์ ์ ์ ํ์ผ ์๋น)
- CLS 0, SEO ์ฐ์
- ์๋ฒ ๋ถํ ๊ฑฐ์ ์์
- ์บ์ฑ ํจ์จ ์ต๊ณ
โ ๋จ์
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ฐ์ ์ด๋ ค์ (์ฌ๋น๋ ํ์)
- ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฐ์ ๋ถ๊ฐ
๐งฑ ์์
export async function getStaticProps() {
const data = await fetch('<https://api.example.com/featured>').then(r => r.json());
return { props: { data } };
}
4๏ธโฃ ISR (Incremental Static Regeneration)
SSG์ “์ฃผ๊ธฐ์ ๊ฐฑ์ (revalidate)”์ ๋ํ ๋ฐฉ์
๐ ๋์ ๋ฐฉ์
- ๋น๋ ํ์์ ํ์ด์ง๋ฅผ ์ ์ ์ผ๋ก ์์ฑ.
- ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์ฒซ ์์ฒญ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฌ์์ฑ.
- ์ดํ ์์ฒญ์ ์๋ก์ด HTML์ ๋ฐํ.
โ ์ฅ์
- SSG์ ์๋ + SSR์ ์ ์ฐ์ฑ
- ์์ฃผ ๋ณํ์ง ์๋ ๋ฐ์ดํฐ์ ์ ํฉ (์: ๋ฉ์ธํ์ด์ง, ๋ฆฌ์คํธ)
- ์๋ฒฝํ SEO + CDN ์บ์ฑ
โ ๋จ์
- ์ฒซ ๋ฒ์งธ ์์ฒญ์ ์ด์ ๋ฐ์ดํฐ์ผ ์ ์์ (๊ฐฑ์ ์ง์ฐ)
- ๋ฐฑ์๋ API ์คํจ ์ ์ค๋๋ HTML ์ ์ง๋ ์ ์์
๐งฑ ์์
export async function getStaticProps() {
const data = await fetch('<https://api.example.com/posts>').then(r => r.json());
return { props: { data }, revalidate: 3600 }; // 1์๊ฐ๋ง๋ค ๊ฐฑ์
}
๐ ์์ฝ ๋น๊ตํ
๊ตฌ๋ถ ๋ ๋๋ง ์์ ๋ฐ์ดํฐ ์ ์ ๋ ์ด๊ธฐ ๋ก๋ฉ ์๋ SEO ์๋ฒ ๋ถํ ์ ํฉ ์ฌ๋ก
| CSR | ํด๋ผ์ด์ธํธ | ์ต์ | ๋๋ฆผ (JS ํ์) | โ | ๋ฎ์ | ๋์๋ณด๋, ๋ด๋ถ ํด |
| SSR | ์์ฒญ ์ | ์ต์ | ๋ณดํต | โ | ๋์ | ๋์ ์ฝํ ์ธ , ๋ก๊ทธ์ธ ํ์ด์ง |
| SSG | ๋น๋ ์ | ๊ณ ์ | ๋งค์ฐ ๋น ๋ฆ | โ | ๋งค์ฐ ๋ฎ์ | ๋ธ๋ก๊ทธ, ๋๋ฉํ์ด์ง |
| ISR | ๋น๋ + ์ฃผ๊ธฐ์ ์ฌ์์ฑ | ์ผ์ ์๊ฐ ๋ด ์ต์ | ๋งค์ฐ ๋น ๋ฆ | โ | ๋ฎ์ | ๋ฉ์ธํ์ด์ง, ๋ชฉ๋ก ๋ทฐ |
๐ก ์ ํ ๊ฐ์ด๋
์ํฉ ์ถ์ฒ ๋ ๋๋ง ๋ฐฉ์
| ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ฐ๋์ง ์์ | SSG |
| ํ๋ฃจ/๋ช์๊ฐ ๋จ์๋ก ๋ณ๊ฒฝ | ISR |
| ์ค์๊ฐ, ๋ก๊ทธ์ธ๋ณ ๊ฐ์ธํ ํ์ | SSR |
| ๋ก๊ทธ์ธ ์ดํ ์ํ ๊ธฐ๋ฐ ๋ํํ UI | CSR |
'๐ ํ๋ก ํธ์๋(FE)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| React ์ํ๊ด๋ฆฌ ( ์ง์ญ, ์ ์ญ, ์๋ฒ ์ปดํฌ๋ํธ ) (0) | 2026.01.20 |
|---|---|
| React ์ฑ๋ฅ ์ต์ ํ (0) | 2026.01.20 |
| Next.js 16 + Turbopack + pnpm ๋ชจ๋ ธ๋ ํฌ: Docker ๋น๋ ์์ ์ ๋ณต (0) | 2026.01.17 |
| ์ง๋ ๋ทฐํฌํธ ๊ธฐ๋ฐ ์ค์๊ฐ ์์ ๊ฒ์ ๊ตฌํ (0) | 2026.01.14 |
| ์น ์ ๋๋ฉ์ด์ ์ ๋๋ก ํ์ฉํ๊ธฐ: Transition, Keyframes, rAF, WAAPI ๋น๊ต์ ํ์ฉ๋ฒ (0) | 2025.09.24 |