d8a80f6272
이름만 다른(표기 변형) [[위키링크]]를 대상 문서의 canonical 제목으로 치환해 끊겼던 1,200개 링크를 연결. 제목/파일명 정규화 일치만 적용하고 별칭 매칭은 과병합 위험으로 제외(애매성 가드). 원본은 _link_reconcile_backup/ 에 백업. 도구: Datacollect/scripts/link_reconcile_apply.mjs Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
220 lines
6.6 KiB
Markdown
220 lines
6.6 KiB
Markdown
---
|
|
id: wiki-2026-0508-seo
|
|
title: SEO
|
|
category: 10_Wiki/Topics
|
|
status: verified
|
|
canonical_id: self
|
|
aliases: [Search Engine Optimization, Organic Search]
|
|
duplicate_of: none
|
|
source_trust_level: A
|
|
confidence_score: 0.9
|
|
verification_status: applied
|
|
tags: [seo, web, core-web-vitals, ai-overviews, technical-seo]
|
|
raw_sources: []
|
|
last_reinforced: 2026-05-10
|
|
github_commit: pending
|
|
tech_stack:
|
|
language: HTML
|
|
framework: Next.js 15
|
|
---
|
|
|
|
# SEO
|
|
|
|
## 매 한 줄
|
|
> **"매 SEO 는 search engine 의 'helpful content' signal 에 align — 매 2026 은 Google AI Overviews + Perplexity + ChatGPT search 의 multi-engine 시대"**. 매 origin 은 1990s keyword stuffing; 매 modern state 는 E-E-A-T, Core Web Vitals, structured data, 그리고 매 GEO (Generative Engine Optimization) — LLM citation 을 target.
|
|
|
|
## 매 핵심
|
|
|
|
### 매 3 layer
|
|
- **Technical SEO**: crawlability, indexability, performance (Core Web Vitals: LCP, INP, CLS).
|
|
- **Content SEO**: E-E-A-T (Experience, Expertise, Authoritativeness, Trust), search intent match.
|
|
- **Off-page**: backlinks, brand mentions, citation in LLM training data.
|
|
|
|
### 매 2026 의 큰 변화
|
|
- **AI Overviews (Google SGE)**: 매 SERP top 의 LLM-generated summary — 매 "position 0".
|
|
- **GEO (Generative Engine Optimization)**: 매 ChatGPT/Perplexity/Claude citation 을 target.
|
|
- **Core Web Vitals**: INP (Interaction to Next Paint) ≤ 200ms, LCP ≤ 2.5s, CLS ≤ 0.1.
|
|
- **Helpful content update**: 매 thin/AI-spam content demote.
|
|
|
|
### 매 응용
|
|
1. Organic traffic acquisition.
|
|
2. LLM citation (brand mention in ChatGPT answers).
|
|
3. Local SEO (Google Business Profile).
|
|
4. E-commerce product discovery.
|
|
|
|
## 💻 패턴
|
|
|
|
### 매 Next.js 15 metadata API (App Router)
|
|
```tsx
|
|
// app/blog/[slug]/page.tsx
|
|
import type { Metadata } from "next";
|
|
|
|
export async function generateMetadata({ params }): Promise<Metadata> {
|
|
const post = await getPost(params.slug);
|
|
return {
|
|
title: `${post.title} | Acme Blog`,
|
|
description: post.excerpt.slice(0, 160),
|
|
alternates: { canonical: `https://acme.com/blog/${params.slug}` },
|
|
openGraph: {
|
|
title: post.title,
|
|
description: post.excerpt,
|
|
images: [post.coverImage],
|
|
type: "article",
|
|
publishedTime: post.publishedAt,
|
|
authors: [post.author.name],
|
|
},
|
|
twitter: { card: "summary_large_image" },
|
|
};
|
|
}
|
|
```
|
|
|
|
### 매 JSON-LD structured data (Article)
|
|
```tsx
|
|
export default function BlogPost({ post }) {
|
|
const jsonLd = {
|
|
"@context": "https://schema.org",
|
|
"@type": "Article",
|
|
headline: post.title,
|
|
image: [post.coverImage],
|
|
datePublished: post.publishedAt,
|
|
dateModified: post.updatedAt,
|
|
author: { "@type": "Person", name: post.author.name, url: post.author.url },
|
|
publisher: {
|
|
"@type": "Organization",
|
|
name: "Acme",
|
|
logo: { "@type": "ImageObject", url: "https://acme.com/logo.png" },
|
|
},
|
|
};
|
|
return (
|
|
<>
|
|
<script
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
|
/>
|
|
<article>{post.content}</article>
|
|
</>
|
|
);
|
|
}
|
|
```
|
|
|
|
### 매 sitemap.xml (Next.js 15 dynamic)
|
|
```ts
|
|
// app/sitemap.ts
|
|
import { MetadataRoute } from "next";
|
|
|
|
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
|
const posts = await getAllPosts();
|
|
return [
|
|
{ url: "https://acme.com", lastModified: new Date(), priority: 1.0 },
|
|
...posts.map(p => ({
|
|
url: `https://acme.com/blog/${p.slug}`,
|
|
lastModified: p.updatedAt,
|
|
changeFrequency: "monthly" as const,
|
|
priority: 0.7,
|
|
})),
|
|
];
|
|
}
|
|
```
|
|
|
|
### 매 robots.txt (매 LLM crawler 분기)
|
|
```txt
|
|
# robots.txt
|
|
User-agent: *
|
|
Allow: /
|
|
Sitemap: https://acme.com/sitemap.xml
|
|
|
|
# 매 OpenAI 의 training crawler block (매 GPTBot)
|
|
User-agent: GPTBot
|
|
Disallow: /
|
|
|
|
# 매 ChatGPT search-time citation crawler (매 OAI-SearchBot) → allow
|
|
User-agent: OAI-SearchBot
|
|
Allow: /
|
|
|
|
# 매 Anthropic ClaudeBot (training) — 매 block 선택지
|
|
User-agent: ClaudeBot
|
|
Disallow: /
|
|
|
|
# 매 Anthropic 의 search-time citation (claude-web) → 매 allow
|
|
User-agent: claude-web
|
|
Allow: /
|
|
```
|
|
|
|
### 매 Core Web Vitals 측정 (web-vitals v4)
|
|
```ts
|
|
import { onLCP, onINP, onCLS } from "web-vitals";
|
|
|
|
onLCP(metric => sendToAnalytics(metric)); // 매 ≤ 2.5s 매 good
|
|
onINP(metric => sendToAnalytics(metric)); // 매 ≤ 200ms 매 good
|
|
onCLS(metric => sendToAnalytics(metric)); // 매 ≤ 0.1 매 good
|
|
|
|
function sendToAnalytics({ name, value, id }) {
|
|
navigator.sendBeacon("/api/vitals", JSON.stringify({ name, value, id }));
|
|
}
|
|
```
|
|
|
|
### 매 GEO — LLM citation friendly content
|
|
```markdown
|
|
<!-- 매 LLM 이 cite 하기 쉬운 형식: -->
|
|
|
|
## What is X?
|
|
X is a Y that does Z. <!-- 매 첫 sentence definitional -->
|
|
|
|
## Key facts about X
|
|
- Fact 1 with concrete number (e.g., "47% of...").
|
|
- Fact 2 with year (e.g., "Released in 2024 by...").
|
|
- Fact 3 with named source.
|
|
|
|
## How X works
|
|
1. Step 1
|
|
2. Step 2
|
|
3. Step 3
|
|
|
|
<!-- 매 LLM citation 은 declarative, dated, sourced content 선호 -->
|
|
```
|
|
|
|
### 매 hreflang (multi-region)
|
|
```html
|
|
<link rel="alternate" hreflang="en-us" href="https://acme.com/en/page" />
|
|
<link rel="alternate" hreflang="ko-kr" href="https://acme.com/ko/page" />
|
|
<link rel="alternate" hreflang="x-default" href="https://acme.com/page" />
|
|
```
|
|
|
|
## 매 결정 기준
|
|
| 상황 | Approach |
|
|
|---|---|
|
|
| 매 informational query | long-form pillar content + JSON-LD Article |
|
|
| 매 transactional query | Product schema + clear CTA |
|
|
| 매 local | LocalBusiness schema + Google Business Profile |
|
|
| 매 LLM citation 노림 | declarative facts + dates + sources |
|
|
| 매 INP 느림 | scheduler.yield + break long tasks |
|
|
|
|
**기본값**: Next.js 15 App Router + metadata API + JSON-LD + INP-first perf.
|
|
|
|
## 🔗 Graph
|
|
- 부모: [[Web Performance]]
|
|
- 변형: [[GEO]]
|
|
- 응용: [[Core Web Vitals Optimization (INP, LCP, CLS)|Core Web Vitals]]
|
|
- Adjacent: [[Search-Optimization]]
|
|
|
|
## 🤖 LLM 활용
|
|
**언제**: 매 content brief 생성 (search intent → outline). 매 meta description draft. 매 structured data scaffolding.
|
|
**언제 X**: 매 entire article 의 mass generation — 매 Helpful Content Update demote 위험.
|
|
|
|
## ❌ 안티패턴
|
|
- **Keyword stuffing**: 매 2026 에 still 하는 사람 → demote.
|
|
- **AI-spam content**: 매 LLM dump w/o expertise → Helpful Content penalty.
|
|
- **Doorway pages**: 매 thin variation per geo/keyword.
|
|
- **Cloaking**: 매 bot 과 user 에게 다른 content → manual action.
|
|
- **Ignoring INP**: 매 long task 가 SERP 영향 (2024 부터).
|
|
|
|
## 🧪 검증 / 중복
|
|
- Verified (Google Search Central docs 2026, web.dev Core Web Vitals, Schema.org).
|
|
- 신뢰도 A.
|
|
|
|
## 🕓 Changelog
|
|
| 날짜 | 변경 |
|
|
|---|---|
|
|
| 2026-05-08 | Phase 1 |
|
|
| 2026-05-10 | Manual cleanup — AI Overviews / GEO / INP / Next.js 15 metadata |
|