1. 클라이언트 사이드 렌더링 CSR(Client Side Rendering)
- 페이지의 정적인 부분만 서버에서 생성하고, 데이터는 클라이언트에서 자바스크립트를 통해 동적으로 렌더링
장점 :
- 서버의 부담 감소
- 최초 한번 로드가 끝나면 사용자와 빠르게 상호작용 가능
- 서버에게 추가적인 요청을 보낼 필요가 없어 사용자 경험이 좋다
단점 :
- 첫 페이지 로딩시간(Time To View)이 길 수 있다
- js가 로딩 되고 실행될 때까지 페이지가 비어있어 검색 엔진 최적화(SEO)에 불리하다
'use client';
import { useEffect, useState } from 'react';
export default function Page() {
const [data, setData] = useState(null);
useEffect(() => {
async function fetchData() {
const res = await fetch('https://api.example.com/data');
const result = await res.json();
setData(result);
}
fetchData();
}, []);
return <div>{data ? data.message : 'Loading...'}</div>;
}
2. 정적 사이트 생성 SSG(Static Site Generation)
- 서버에서 페이지를 렌더링하여 정적인 HTML을 미리 만들어 놓고 이를 사용자에게 제공
- 최초 빌드시에만 생성됨
- 사전에 미리 정적 페이지 여러개 만들어놓음 -> 클라이언트가 홈페이지 요청하면 서버에서는 이미 만들어져있는 사이트 바로 제공
-> 클라이언트는 표기만 함
장점 :
- 첫 페이지 로딩 시간이 매우 짧아서 사용자가 빠르게 페이지 볼 수 있음
- SEO에 효과적
- CDN(Content Delivery Network) 캐싱 가능
단점 :
- 데이터가 변경되지 않는 정적 컨텐츠에만 적합
- 사용자와의 상호작용이 서버 통신에 의존하기 때문에, CSR보다 상호작용이 느릴 수 있다
- 서버 부하가 클 수 있다
// page.jsx
export default async function Page() {
const res = await fetch('https://api.example.com/data', { cache: 'force-cache' });
const data = await res.json();
return <div>{data.message}</div>;
}
3. 부분 정적 재생성 ISR(Incremental Static Regeneration)
- 설정한 주기만큼 페이지를 다시 생성하여 캐시된 정적인 페이지 제공 -> SSR과 SSG의 중간 상태
- 정적 페이지를 먼저 보여주고, 필요에 따라 서버에서 페이지 재생성하는 방식
장점 :
- 정적 페이지를 먼저 제공하기 때문에 사용자 경험이 좋다
- 컨텐츠가 변경되었을 때 서버에서 페이지를 재생성하여 최신 상태를(어느정도) 유지할 수 있다
- CDN 캐싱 가능
단점 :
- 동적인 컨텐츠를 다루기에 한계가 있다(실시간 페이지 아님)
- 마이페이지처럼 데이터에 의존하여 화면을 그려주는 경우 사용 불가
// page.jsx
export default async function Page() {
const res = await fetch('https://api.example.com/data', { next: { revalidate: 60 } });
const data = await res.json();
return <div>{data.message}</div>;
}
4. 서버 사이드 렌더링 SSR(Server Side Rendering)
- SSG, ISR처럼 렌더링 주체가 서버이다
- 서버가 클라이언트의 요청 시마다 데이터를 가져와 HTML을 생성하여 응답하는 방식
- 최신 데이터를 가져오지만 요청할 때마다 데이터를 가져오기 때문에 서버 부담이 클 수 있다
장점 :
- 항상 최신 데이터 표시 가능
- 빠른 로딩 속도(TTV)와 높은 보안성 제공
- SEO 최적화 좋음
- 마이페이지처럼 데이터에 의존한 페이지 구성 가능
- CDN 캐싱 불가
단점 :
- 사이트의 컨텐츠가 변경되면 전체 사이트를 다시 빌드해야하는데 이 과정이 시간이 오래 걸릴 수 있다 -> 서버 과부하
- 요청할 때마다 페이지 만들어야 함
// page.jsx
export default async function Page() {
const res = await fetch('https://api.example.com/data', { cache: 'no-store' });
const data = await res.json();
return <div>{data.message}</div>;
}
렌더링 방식 | 응답 시간 | 데이터 최신성 | 빌드 시간 | 성능 | SEO | 추천 사용 사례 |
SSR | 길다 | 높음 | 짧다 | 중간 | 좋음 | 자주 바뀌는 실시간 데이터 |
CSR | 보통 | 높음 | 짧다 | 높음 | 나쁨 | 즉각 로딩이 느려도 되는 데이터 |
ISR | 짧다 | 중간 | 길다 | 높음 | 좋음 | 블로그나 뉴스 사이트 |
SSG | 짧다 | 낮음 | 길다 | 매우 높음 | 좋음 | 거의 바뀌지 않는 마케팅 페이지 |
'2024내일배움캠프 > TIL' 카테고리의 다른 글
[TIL] 3/20 주특기 플러스주차_NextJS를 활용한 팀플! (0) | 2025.03.21 |
---|---|
[TIL] 3/19 nextJS에서 서버는 무엇일까? (0) | 2025.03.19 |
[TIL] 3/10 next.js (0) | 2025.03.11 |
[TIL] 3/7 TS(제네릭)! (0) | 2025.03.10 |
[TIL] 3/6 새로운 주차, 새로운 팀 (0) | 2025.03.07 |