웹 애플리케이션의 렌더링 방식은 크게 네 가지로 나뉩니다: SSR, CSR, SSG, 그리고 LSR. 각각의 작동 방식, 장단점, 그리고 API 호출 방식을 포함하여 자세히 설명합니다.
getServerSideProps
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } }; // 데이터를 페이지 컴포넌트로 전달
}
const Page = ({ data }) => {
return <div>{data.title}</div>;
};
export default Page;
import { useEffect, useState } from 'react';
const Page = () => {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then((res) => res.json())
.then((data) => setData(data));
}, []);
if (!data) return <div>Loading...</div>;
return <div>{data.title}</div>;
};
export default Page;
getStaticProps
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } }; // 정적 데이터로 페이지 생성
}
const Page = ({ data }) => {
return <div>{data.title}</div>;
};
export default Page;
getStaticProps
+ CSRexport async function getStaticProps() {
const res = await fetch('https://api.example.com/static-data');
const staticData = await res.json();
return { props: { staticData } }; // 정적 데이터 제공
}
const Page = ({ staticData }) => {
const [dynamicData, setDynamicData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/dynamic-data')
.then((res) => res.json())
.then((data) => setDynamicData(data));
}, []);
return (
<div>
<h1>{staticData.title}</h1>
{dynamicData ? <p>{dynamicData.detail}</p> : <p>Loading dynamic data...</p>}
</div>
);
};
export default Page;
특성 | SSR | CSR | SSG | LSR |
---|---|---|---|---|
초기 로드 속도 | 빠름 | 느림 | 매우 빠름 | 중간 |
SEO 친화성 | 매우 좋음 | 낮음 | 매우 좋음 | 중간 |
실시간 데이터 갱신 | 가능 | 가능 | 불가능 | 가능 |
서버 부하 | 높음 | 낮음 | 매우 낮음 | 중간 |
구현 복잡성 | 중간 | 낮음 | 중간 | 높음 |
적합한 사용 사례 | 동적 콘텐츠, SEO 필요한 웹앱 | 대화형 SPA | 정적 콘텐츠 중심의 웹사이트 | 초기 속도와 SEO가 중요한 앱 |
getServerSideProps
사용.useEffect
에서 API 호출.getStaticProps
사용.getStaticProps
+ 클라이언트 데이터 로드.