React, Vue

Next.js 렌더링 ✅ CSR, SSR, SSG, ISR 차이와 선택

jonbeo 2025. 11. 16. 09:46
반응형

 

 

React로 만든 SPA(Single Page Application)는 기본적으로 클라이언트 렌더링(CSR) 방식입니다.
하지만 이 방식은 SEO, 초기 로딩 속도에서 한계가 있었죠.
Next.js는 이런 단점을 보완하기 위해 다양한 렌더링 옵션을 제공합니다 👇


💻 1. CSR (Client-Side Rendering)

📌 렌더링 위치 → 브라우저(클라이언트)
📌 예시 → 순수 React 앱 (create-react-app)

 
function App() {
  const [data, setData] = useState(null);
  useEffect(() => {
    fetch("/api/data").then(res => res.json()).then(setData);
  }, []);
  return <div>{data ? data.title : "Loading..."}</div>;
}

 

✅ 장점

  • 빠른 상호작용
  • 클라이언트 상태 관리 유리

❌ 단점

  • SEO 취약 (HTML에 콘텐츠 없음)
  • 초기 로딩 느림 (JS 다운로드 후 렌더링)

🖥️ 2. SSR (Server-Side Rendering)

📌 렌더링 위치 → 서버
📌 HTML을 서버에서 완성 후 브라우저로 전송

 
export async function getServerSideProps() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();
  return { props: { data } };
}

 

✅ 장점

  • SEO 완벽 대응
  • 최초 렌더링 속도 빠름

❌ 단점

  • 요청마다 서버 렌더링 → 서버 부하 증가
  • 응답 속도는 네트워크 환경 의존

📘 3. SSG (Static Site Generation)

📌 렌더링 위치 → 빌드 시점 (Build-time)
📌 완성된 HTML을 정적으로 생성하여 배포

 
export async function getStaticProps() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();
  return { props: { data } };
}

 

✅ 장점

  • 속도 매우 빠름 (CDN 캐싱 가능)
  • 서버 부하 없음

❌ 단점

  • 데이터가 바뀌면 재빌드 필요

📌 대표 예시

블로그, 문서 페이지, 랜딩 페이지


🔄 4. ISR (Incremental Static Regeneration)

📌 렌더링 위치 → 빌드 + 주기적 갱신 (Revalidate)

 
export async function getStaticProps() {
  const res = await fetch("https://api.example.com/posts");
  const data = await res.json();
  return {
    props: { data },
    revalidate: 60, // 60초마다 새 데이터 갱신
  };
}

 

✅ 장점

  • SSG의 속도 + SSR의 최신성
  • 캐시 자동 갱신으로 효율적

❌ 단점

  • 실시간성이 필요한 서비스엔 부적합

⚖️ 5. 렌더링 방식 비교

방식 렌더링 시점 SEO 속도 데이터 최신성
CSR 클라이언트 느림
SSR 서버 중간
SSG 빌드 매우 빠름
ISR 빌드+주기적 빠름

🎯 6. 실무 적용 가이드

  • 블로그 / 마케팅 사이트 → SSG or ISR
  • 대시보드 / 로그인 페이지 → SSR
  • 앱 내부 데이터 갱신 많음 → CSR
  • 뉴스, 실시간 데이터 페이지 → ISR

🧠 7. 보너스: Next.js 최신 구조(App Router 기준)

 
// app/posts/page.tsx
export default async function PostsPage() {
  const res = await fetch("https://api.example.com/posts", {
    next: { revalidate: 60 }, // ISR 방식
  });
  const posts = await res.json();
  return <PostList posts={posts} />;
}

 

📌 App Router 환경에서는 getStaticProps 대신
fetch()에 next.revalidate 옵션을 줘서 ISR 구현 가능


📝 마무리 정리

  • CSR → 브라우저 렌더링 (SPA 전용)
  • SSR → 요청마다 서버에서 HTML 생성
  • SSG → 빌드 시 정적 페이지 생성
  • ISR → 정적 페이지를 일정 주기로 갱신

👉 “속도 vs 최신성”의 균형이 핵심입니다.
프로젝트 특성에 맞는 렌더링 전략을 세워야 합니다.

반응형