클라이언트(브라우저)에서 JavaScript가 실행되어 화면을 렌더링한다.
서버는 기본 HTML과 JavaScript 파일을 전달하고, 브라우저에서 렌더링이 이루어진다.
import React, { useState, useEffect } from 'react';
function App() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then((response) => response.json())
.then((data) => setData(data));
}, []);
return (
<div>
<h1>Client-Side Rendering</h1>
{data ? <p>{data.title}</p> : <p>Loading...</p>}
</div>
);
}
export default App;
서버에서 HTML을 렌더링한 후 브라우저에 전달한다.
SEO가 필요하거나 초기 로딩 속도가 중요한 경우에 사용된다.
// pages/index.js
export async function getServerSideProps() {
const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const data = await res.json();
return {
props: { data },
};
}
export default function Home({ data }) {
return (
<div>
<h1>Server-Side Rendering</h1>
<p>{data.title}</p>
</div>
);
}
빌드 시점에 정적 HTML 파일을 생성하고, 요청 시 미리 생성된 파일을 제공한다.
// pages/index.js
export async function getStaticProps() {
const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const data = await res.json();
return {
props: { data },
};
}
export default function Home({ data }) {
return (
<div>
<h1>Static Site Generation</h1>
<p>{data.title}</p>
</div>
);
}
SSG와 SSR의 하이브리드 방식으로, 정적 페이지를 주기적으로 재생성한다.
// pages/index.js
export async function getStaticProps() {
const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const data = await res.json();
return {
props: { data },
revalidate: 10, // 10초마다 페이지 재생성
};
}
export default function Home({ data }) {
return (
<div>
<h1>Incremental Static Regeneration</h1>
<p>{data.title}</p>
</div>
);
}