Next.js 교재 · 21편 · Analytics·SEO

Analytics와 SEO — Vercel·sitemap·Search

배포만 하면 끝이 아니다. 누가 오는지 측정, 검색엔진에 노출까지.

Analytics 대시보드와 검색엔진 인덱싱 컨셉 일러스트

20편에서 사이트가 라이브가 됐다. 그런데 — 누가 오는지·어디서 오는지·검색엔진엔 잡혔는지 모르면 그냥 빈 사이트. 데이터 없이 개선 불가.

이번 편은 그 두 축을 한 번에 — Analytics(방문자 측정)와 SEO(검색엔진 인덱싱). Next.js + Vercel 조합에서 둘 다 코드 몇 줄로 끝나는 도구가 표준화돼 있다.

1. Vercel Analytics — 한 줄로 트래픽 측정

Google Analytics 의 가벼운 대안. 쿠키 안 쓰고 GDPR 친화적.

$ npm install @vercel/analytics
// app/layout.tsx import { Analytics } from '@vercel/analytics/react'; export default function RootLayout({ children }) { return ( <html lang="ko"> <body> {children} <Analytics /> {/* ← 이 한 줄 */} </body> </html> ); }

Vercel Dashboard · Analytics 탭에서 방문자·페이지뷰·인기 페이지·국가·디바이스 확인. Vercel 호스팅 시 무료 (Hobby 플랜도). 다른 호스팅이면 동작 안 함.

2. Speed Insights — Core Web Vitals

속도 측정. LCP·CLS·INP 같은 라이트하우스 지표를 실제 사용자 환경에서 수집.

$ npm install @vercel/speed-insights
// app/layout.tsx (위와 같이) import { SpeedInsights } from '@vercel/speed-insights/next'; // body 끝에 <Analytics /> <SpeedInsights />

실제 사용자(RUM·real user monitoring) 환경의 점수 — Lighthouse 같은 lab 측정보다 진짜. 모바일 95th percentile LCP 가 가장 봐야 할 지표.

다른 옵션 — Plausible(쿠키리스, $9/월)·Umami(자체 호스팅 OSS)·Google Analytics 4(무료지만 무거움). 한국에선 Naver Search Advisor 도 별도 등록 필요. Vercel Analytics 는 가장 가볍지만 한 호스팅에 종속.

3. sitemap.ts — 검색엔진용 페이지 목록

7편 메타데이터 챕터에서 봤던 그것. 다시 한 번.

// app/sitemap.ts import type { MetadataRoute } from 'next'; export default async function sitemap(): Promise<MetadataRoute.Sitemap> { const baseUrl = 'https://my-site.com'; const staticPaths = [ { url: baseUrl, priority: 1.0 }, { url: `${baseUrl}/about`, priority: 0.8 }, { url: `${baseUrl}/pricing`, priority: 0.8 }, ]; const posts = await fetchAllPosts(); const postPaths = posts.map(p => ({ url: `${baseUrl}/blog/${p.slug}`, lastModified: p.updatedAt, priority: 0.6, })); return [...staticPaths, ...postPaths]; }

이 한 파일이 /sitemap.xml 로 자동 생성. Google Search Console 에 등록할 URL.

4. robots.ts — 크롤러 가이드

// app/robots.ts import type { MetadataRoute } from 'next'; export default function robots(): MetadataRoute.Robots { return { rules: [ { userAgent: '*', allow: '/', disallow: ['/admin/', '/api/'] }, { userAgent: 'GPTBot', disallow: '/' }, // ChatGPT 크롤러 차단 ], sitemap: 'https://my-site.com/sitemap.xml', }; }

2026 기준 — AI 크롤러(GPTBot·ClaudeBot·Google-Extended) 차단을 명시하는 게 트렌드. 본인 콘텐츠 학습 데이터 사용 막을지 결정. llms.txt 표준도 같이 등장 중.

5. Search Console·구조화 데이터

Google Search Console 등록 (필수)

1. search.google.com/search-console 에서 도메인 추가. 2. DNS 또는 HTML 메타로 소유 확인. 3. sitemap.xml URL 제출. 4. 1~2주 후 인덱싱 상태·검색 키워드·CTR 확인.

네이버는 별도 — searchadvisor.naver.com. 같은 sitemap 으로 등록 가능. 한국 트래픽 잡으려면 둘 다 필수.

구조화 데이터 (JSON-LD)

검색 결과에서 별점·이미지·FAQ 카드 같은 풍부한 표시 가능. JSON-LD 한 블록을 페이지에 박는다.

// app/blog/[slug]/page.tsx export default async function PostPage({ params }) { const { slug } = await params; const post = await fetchPost(slug); const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', headline: post.title, image: post.coverImage, datePublished: post.publishedAt, author: { '@type': 'Person', name: post.author }, }; return ( <> <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} /> <article>…</article> </> ); }

schema.org 의 타입(Article·Product·FAQPage·Recipe) 별로 다른 필드. Google Rich Results Test 로 미리보기 가능.

SEO 흔한 함정 — ① title·description 비움(검색 무시), ② 모든 페이지 같은 title("My Site"), ③ canonical 빠뜨림(중복 콘텐츠 페널티), ④ noindex 실수(개발 중 막아둔 거 production 까지 가는 사고), ⑤ 이미지 alt 비움(접근성·SEO 둘 다 손해). 7편 metadata 챕터 다시 점검.

요약 — 21편 좌표

여기까지 정리. Vercel Analytics·Speed Insights 두 컴포넌트로 트래픽·속도 측정 시작. app/sitemap.ts·app/robots.ts 두 파일로 검색엔진용 메타 자동 생성. Google·Naver Search Console 양쪽 등록 필수. 구조화 데이터(JSON-LD) 로 검색 결과 풍부하게. 7편 metadata 위에 더 얹는 데이터 레이어. 다음 편에서 테스트 — Jest·RTL·Playwright.

다음 편 예고 — Next.js 테스트

Jest·React Testing Library·Playwright 기초. 22편.

© 2026 주나이테크(주) @JUNAITECH