웹 페이지를 보여주는 방법엔 대표적으로 3가지가 있다.
CSR, SSR, SSG 각 방식의 정의와 동작 과정 그리고 장단점을 정리해본다.
클라이언트 측 렌더링
먼저 빈 상자(html)만 받고, 안에 내용은 JS가 와서 화면을 채운다.
index.html
을 로드함// App.tsx
import { useEffect, useState } from 'react';
const App = () => {
const [data, setData] = useState<string | null>(null);
useEffect(() => {
// CSR에서 데이터를 클라이언트에서 fetch
fetch('/api/data')
.then((res) => res.json())
.then((json) => setData(json.message));
}, []);
return (
<div>
<h1>클라이언트 렌더링 예제</h1>
{data ? <p>데이터: {data}</p> : <p>로딩 중...</p>}
</div>
);
};
export default App;
서버 측 렌더링
서버에서 이미 내용을 다 만들어서 HTML을 완성해 보내준다.
// pages/ssr.tsx
import { GetServerSideProps } from 'next';
interface Props {
message: string;
}
const SSRPage = ({ message }: Props) => {
return (
<div>
<h1>서버 사이드 렌더링 예제</h1>
<p>{message}</p>
</div>
);
};
export const getServerSideProps: GetServerSideProps = async () => {
// 서버에서 데이터 패칭
const res = await fetch('https://api.example.com/message');
const data = await res.json();
return {
props: {
message: data.message,
},
};
};
export default SSRPage;
정적 사이트 생성
페이지를 미리 만들어 두고, 요청 시 그걸 던져준다.
// pages/ssg.tsx
import { GetStaticProps } from 'next';
interface Props {
message: string;
}
const SSGPage = ({ message }: Props) => {
return (
<div>
<h1>정적 사이트 생성 예제</h1>
<p>{message}</p>
</div>
);
};
export const getStaticProps: GetStaticProps = async () => {
// 빌드 타임에 한 번 실행됨
const res = await fetch('https://api.example.com/message');
const data = await res.json();
return {
props: {
message: data.message,
},
revalidate: 60, // ISR (옵션): 60초마다 새로 고침 가능
};
};
export default SSGPage;
오 사진이랑 코드랑 같이 보니까 이해가 잘되는것 같아요!