SSR vs SPA
→ 브라우저가 요청하면, 서버가 HTML을 “완성된 상태”로 만들어 보내준다.
JS 없이도 바로 읽히기 때문에 사용자는 바로 완성된 페이지를 볼 수 있다.
초기 로딩이 빠르고 검색엔진이 바로 인식, 인덱싱되므로 SEO에 유리하다.
→ 최초 요청 시 “빈 HTML”에 루트 div만 있어서 자바스크립트가 실행되어야 브라우저에서 렌더링된다.
검색엔진이 내용 인식에 어려워 SEO에 불리하다.
초기 로딩은 느릴 수 있으나, 페이지 이동 시 새로고침 없이 화면 일부만 바꿔서 동적이고 빠르다.
사용자가 페이지에 접속하거나,
구글, 네이버 같은 검색엔진 크롤러가 내 사이트에 들어오면
SSR은 완성된 HTML을 서버에서 미리 만들어서 브라우저에 내려보내준다.
= 검색엔진 + SNS + 각 플랫폼 요구사항을 한 번에 충족하는 메타태그 구성하는 것
// app/ssr/page.tsx (Next.js 13+ App Router)
export const metadata = {
title: "SSR SEO 예제 | 내 블로그",
openGraph: {
description: "이 페이지는 SSR로 만들어져 검색엔진 및 SNS 공유에 최적화됩니다.",
url: "https://your-domain.com/ssr", // 본인 실제 배포 주소로 교체!
siteName: "내 블로그",
images: [
{
url: "https://images.unsplash.com/photo-1519125323398-675f0ddb6308",
width: 800,
height: 600,
alt: "SSR SEO 예제 미리보기 썸네일"
}
],
type: "website"
},
twitter: {}
};
export default async function SSRPage() {
const now = new Date().toLocaleString(); // 서버에서 현재 시간 생성
return (
<div>
<h1>SSR SEO 예제</h1>
<p>이 페이지는 서버에서 미리 렌더링되어 HTML에 데이터가 들어있어요.</p>
<p>서버 시간: <b>{now}</b></p>
</div>
);
}
검색엔진(구글, 네이버 등)이 사이트 정보/키워드/요약을 읽는 표준
<title>나의 멋진 블로그</title>
<meta name="description" content="웹개발, Next.js, 프론트엔드 경험 공유 블로그">
<meta name="keywords" content="프론트엔드, Next.js, SEO, 개발자">
페이스북, 카카오톡, 네이버블로그, 슬랙, 디스코드 등 “SNS/메신저” 미리보기 이미지·제목·설명 담당
<meta property="og:type" content="website">
<meta property="og:title" content="SSR SEO 예제 | 내 블로그">
<meta property="og:description" content="SSR로 완성된 정보를 SNS에 멋지게 노출!">
<meta property="og:image" content="https://your-domain.com/og-image.jpg">
<meta property="og:url" content="https://your-domain.com/ssr">
<meta property="og:site_name" content="내 블로그">
JSON-LD 형식
으로 <head>
안에 삽입<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Next.js에서 구조화 데이터란 무엇인가요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "구조화 데이터는 검색엔진이 페이지 내용을 쉽게 해석할 수 있게 만드는 JSON-LD 형식의 데이터"
}
},
{
"@type": "Question",
"name": "구조화 데이터의 효과는?",
"acceptedAnswer": {
"@type": "Answer",
"text": "구글에서 내 사이트가 리치 스니펫(FAQ, 별점 등)으로 강조 노출될 수 있습니다."
}
}
]
}
</script>
my-next-app/
├─ app/
│ ├─ page.tsx // 루트(/) 메인 페이지
│ ├─ about/
│ │ ├─ page.tsx // /about
│ │ └─ head.tsx // /about의 head (메타태그 설정)
│ ├─ contact/
│ │ ├─ page.tsx // /contact
│ │ └─ head.tsx // /contact의 head (메타태그 설정)
│ ├─ products/
│ │ ├─ [id]/
│ │ │ └─ page.tsx // /products/123 (동적 라우트)
│ │ └─ layout.tsx // products 하위 공통 레이아웃
│ └─ api/
│ └─ hello/route.ts // /api/hello (API 라우트)
├─ public/
├─ next.config.js
└─ ...
Next.js에서는 기본적으로 SSR로 SEO와 퍼포먼스를 챙기되, 동적 UI나 복잡한 상태 처리가 필요한 부분에만 ‘use client’를 선언해 SSR과 CSR을 효과적으로 하이브리드로 조합해 사용
초기 화면과 SEO는 SSR로 최적화, 동적인 대시보드·마이페이지·애니메이션 등은 CSR로 자유롭게 구현
→ 실무에서 가장 많이 쓰는 패턴!
빠른 페이지 전환
최초 한 번만 리소스 다운, 이후에는 새로고침 없이 즉시 화면 전환
서버에 다시 요청하지 않고 브라우저 내부에서만 화면 전환 → “앱처럼 빠른 느낌”, 즉시 반응
대규모 동적 UI, 대시보드, 복잡한 사용자 상호작용에 적합
풍부한 사용자 경험(UX)
상태 관리, 애니메이션, 복잡한 동작을 브라우저에서 바로 처리
비동기 데이터 갱신, 무한 스크롤, 모달 등 앱스러운 인터랙션 구현에 유리
“단일 페이지 앱” 특성상 URL은 안 바뀌지만 실제 앱처럼 부드럽게 작동