performance · high priority
SEO for Frontend Developers
Next.js Metadata API, Core Web Vitals, sitemap, JSON-LD
intermediate 난이도5시간토스네이버카카오배민
시작 전
이해도
매우 낮음
학습 개요
탄생 배경
쉬운 설명
복잡한 개념을 실생활 비유로 설명합니다.
“도서관 사서가 책을 올바른 서가에 꽂아주는 작업”
검색 엔진은 도서관 사서다. HTML 시맨틱과 메타 태그는 책 표지와 목차, sitemap은 도서 목록표다. 사서가 책을 빨리 분류할수록 (Core Web Vitals) 더 좋은 자리에 전시된다.
핵심 개념
h1~h6 계층 구조, article/section/nav/main 시맨틱 태그, title/description meta 태그, OG(Open Graph) 태그가 SEO의 기초다.
Next.js App Router — Metadata APItsx
1// app/blog/[slug]/page.tsx2import type { Metadata } from 'next';34export async function generateMetadata({ params }: Props): Promise<Metadata> {5 const post = await getPost(params.slug);6 return {7 title: post.title,8 description: post.excerpt,9 openGraph: {10 title: post.title,11 description: post.excerpt,12 images: [{ url: post.coverImage, width: 1200, height: 630 }],13 type: 'article',14 publishedTime: post.publishedAt,15 authors: [post.author],16 },17 alternates: {18 canonical: `https://example.com/blog/${params.slug}`,19 },20 };21}
중복 title 주의
Next.js 13+에서는 layout.tsx와 page.tsx 모두 title을 설정하면 page가 우선한다. template을 사용해 브랜드 이름을 일관되게 유지하자: title: { template: "%s | MyBrand", default: "MyBrand" }
실무 적용
어떤 상황에서 사용하는가
Next.js 쇼핑몰에서 상품 페이지 SEO를 개선해야 할 때
어떻게 적용하는가
1) generateMetadata로 상품별 동적 메타 생성, 2) Product JSON-LD 스키마 추가, 3) 이미지에 next/image로 LCP 최적화, 4) layout shift 방지를 위해 이미지 width/height 명시
흔한 실수와 안티패턴
- 모든 페이지에 동일한 title/description 사용 (중복 콘텐츠 페널티)
- SPA에서 CSR만 사용해 크롤러가 빈 HTML을 보는 상황
- 이미지에 alt 속성 누락
- canonical URL 미설정으로 중복 URL 문제 발생
- 모바일 뷰포트 메타 태그 누락
면접 질문
중급토스네이버
답변 방향 힌트
Googlebot의 JS 실행 방식과 렌더링 타이밍 문제
반드시 언급할 키워드
- Googlebot은 JS 실행하지만 지연 발생
- CSR은 초기 HTML이 비어있음
- SSR/SSG로 해결
- Next.js App Router 활용
예상 꼬리 질문
- Core Web Vitals가 SEO에 어떤 영향을 주나요?
- Dynamic Rendering이 무엇인가요?