FAQPage와 BreadcrumbList는 Google이 공식 지원하는 Schema.org 타입으로, 크롤러가 페이지 계층 구조와 질문-답변 쌍을 기계적으로 파싱해 Rich Results와 SERP 경로 블록을 생성하는 데 사용된다. 2023년 8월 Google이 FAQPage Rich Results 적용 범위를 정부·의료 권위 도메인으로 축소했음에도, ChatGPT Search·Perplexity 등 AI 검색 엔진은 FAQPage의 구조화된 QA 블록을 고품질 인용 후보로 우선 선별한다. 두 스키마를 올바르게 구현하지 않으면 AI 엔진이 페이지 계층과 답변 경계를 임의 분할해 인용 품질이 저하된다.
작동 원리: 크롤러와 AI 파이프라인이 스키마를 처리하는 방식
Googlebot은 HTML을 파싱한 뒤 <script type="application/ld+json"> 블록을 별도 추출해 Schema.org 그래프로 파싱한다. FAQPage와 BreadcrumbList는 처리 레이어가 다르다.
- FAQPage:
Question·Answer엔티티를 추출해 Rich Results 자격을 판정하고, AI 엔진의 RAG 파이프라인에서 QA 청크 단위로 임베딩된다. 왜: 명시적 QA 구조가 없으면 AI가 문단을 임의 분할해 답변 맥락이 잘린다. 어떻게:mainEntity배열에@type: "Question"을 나열하고acceptedAnswer.text에 300자 이내 단문으로 답변을 작성한다. - BreadcrumbList: URL 계층을
ListItem·position·item(URL)로 표현해 Google이 SERP에 경로 블록을 렌더링한다. 왜: 내비게이션 HTML만으로는 크롤러가 계층을 항상 정확히 유추하지 못한다. 어떻게:position은 1부터 시작하는 연속 정수여야 하며, 말단 노드에는item을 생략하거나 현재 URL과 동일하게 설정한다.
FAQPage 스키마 구현
JSON-LD 예시
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "robots.txt와 llms.txt의 차이는 무엇인가요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "robots.txt는 HTTP 크롤러(Googlebot 등)의 경로별 접근을 제어하는 표준 규격이고, llms.txt는 LLM 학습·추론 파이프라인에 콘텐츠 접근 권한을 선언하는 비공식 제안 규격입니다. 현재 llms.txt는 Anthropic·Perplexity 등 일부 파이프라인만 인식합니다."
}
},
{
"@type": "Question",
"name": "FAQPage 스키마가 Google Rich Results에 반드시 표시되나요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "2023년 8월 이후 Google은 FAQPage Rich Results를 정부·의료 권위 사이트로 제한했습니다. 일반 도메인은 스키마를 올바르게 구현해도 Rich Results가 표시되지 않을 수 있으나, AI 검색 엔진의 인용 품질에는 여전히 유효합니다."
}
}
]
}
- name 필드: 실제 사용자 질의 형태(의문문)로 작성한다. 왜: AI 엔진이 쿼리 벡터와
name값을 직접 매칭해 인용 후보를 선정하기 때문이다. 어떻게: "~란?", "~방법은?" 형식의 자연어 질의로 작성하고 키워드를 인위적으로 삽입하지 않는다. - acceptedAnswer.text: HTML 태그 없이 순수 텍스트로 작성한다. 왜: HTML 태그 포함 시 Google 파서가 텍스트를 잘못 추출할 수 있고, AI 엔진이 마크업을 그대로 인용할 위험이 있다. 어떻게: 마크다운·링크 없이 완결형 서술문만으로 구성한다.
- 질문 수: 페이지당 2~5개를 권장한다. 왜: 과도한 QA 나열은 본문과 중복 신호를 형성해 페이지 품질 점수에 부정적으로 작용할 수 있다. 어떻게: 본문에서 이미 다루는 핵심 질의만 선별해 요약 형태로 작성한다.
BreadcrumbList 스키마 구현
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "홈",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "SEO 가이드",
"item": "https://example.com/seo/"
},
{
"@type": "ListItem",
"position": 3,
"name": "FAQPage 스키마 실전 적용",
"item": "https://example.com/seo/faqpage-schema/"
}
]
}
- position 연속성: 1부터 시작하는 연속 정수여야 한다. 왜: 순서가 비연속이면 Google이 BreadcrumbList 전체를 무효 처리한다. 어떻게: 동적 생성 시 배열 인덱스+1로 자동 부여하고 중간 노드를 생략하지 않는다.
- item URL과 실제 URL의 일치:
item에 설정한 URL은 정규화된 페이지 URL과 동일해야 한다. 왜: 불일치 시 Google이 SERP 경로 표시에서 해당 노드를 다른 URL로 링크해 의도하지 않은 탐색 경로를 생성한다. 어떻게: 트레일링 슬래시, www 유무, https/http를 canonical 태그와 동일하게 통일한다. - HTML nav 마크업과 병행:
<nav aria-label="breadcrumb">+<ol>구조를 JSON-LD와 함께 유지한다. 왜: JSON-LD는 크롤러용이고, HTML 마크업은 스크린 리더·접근성 레이어다. 두 경로의 텍스트·URL이 불일치하면 신뢰도 신호가 분산된다. 어떻게: JSON-LD의name과 HTML 링크 텍스트,item과href를 동기화한다.
검증·측정 도구 비교
| 도구 | 검증 대상 | 적합 시점 | 한계 |
|---|---|---|---|
| Google Rich Results Test | JSON-LD 파싱 오류, 필수 필드 누락, SERP 미리보기 | 개발·배포 직후 | 실제 SERP 표시 여부와 100% 일치하지 않음 |
| Search Console 리치 결과 보고서 | FAQPage·BreadcrumbList 유효 항목 수, 오류 URL 목록 | 색인 반영 후 주간 모니터링 | 반영까지 수일~수주 지연, 경고만 표시 |
| Schema Markup Validator (schema.org) | Schema.org 스펙 준수 여부, 타입 오류 | 스펙 변경 후 회귀 검증 | Google 전용 필드 검증 불가 |
| json-ld-lint (CLI) | JSON 문법 오류, 빈 필드, 타입 불일치 | CI/CD PR 게이트 | Google 렌더링 결과 미확인 |
- 코드 스니펫 방식 우선 검증: Rich Results Test에서 URL 방식 대신 HTML 소스를 직접 붙여넣어 테스트한다. 왜: Googlebot이 아직 색인하지 않은 새 페이지는 URL 방식에서 파싱 오류가 발생한다. 어떻게: 개발 환경의 HTML 소스를 복사해 "코드 테스트" 탭에서 검증한다.
- CI/CD 자동화: PR 단계에서 json-ld-lint 또는
@google/structured-data-testing-toolCLI를 실행한다. 왜: 템플릿 기반 CMS에서 필드 누락이 silent하게 수백 페이지에 확산된다. 어떻게: GitHub Actions에서 사이트맵 샘플 URL 10개를 추출해 구조화 데이터 유효성을 자동 검증한다.
흔한 오해: "FAQPage 스키마가 없으면 AI 인용도 안 된다"의 역방향 오류
2023년 8월 이후 일부 실무자는 Google Rich Results에 FAQPage가 표시되지 않자 스키마 자체를 제거하는 선택을 한다. 이는 반대 방향의 오류다. Google SERP 표시 여부와 AI 인용 유효성은 독립된 레이어다. ChatGPT Search·Perplexity의 RAG 파이프라인은 Schema.org FAQPage의 Question.name과 acceptedAnswer.text를 명시적 QA 청크로 인식해 인용 후보 점수를 높인다. 스키마를 제거하면 AI 엔진이 본문을 임의 분할해 청크 경계가 어긋날 수 있다. 올바른 처리법: 스키마는 유지하되, KPI를 Rich Results 노출 수에서 AI 검색에서의 도메인 인용 빈도(Perplexity 직접 검색 모니터링, ChatGPT Browsing 수동 확인)로 전환한다.
FAQPage와 HowTo 스키마, 같은 페이지에 병행 선언할 수 있나요?
기술적으로는 가능하나 반드시 독립된 <script type="application/ld+json"> 블록으로 분리해야 합니다. 하나의 블록에 두 타입을 혼합하면 Google 파서가 타입 충돌로 무효 처리할 수 있습니다. 콘텐츠가 "질문-단답형 정의"이면 FAQPage, "단계별 절차 설명"이면 HowTo를 선택하는 것이 원칙이며, 두 구조가 명확히 분리된 섹션에 대응할 때만 병행을 고려합니다.
BreadcrumbList의 item URL에 쿼리스트링이나 해시(#)가 포함돼도 되나요?
쿼리스트링(?)이 포함된 URL은 Google이 별개의 페이지로 처리할 수 있어 권장하지 않습니다. 해시(# 프래그먼트)는 크롤러가 무시하므로 포함해도 기능에는 지장이 없지만, canonical 태그 URL과 일치시키는 것이 안전합니다. 가장 견고한 방식은 item 값을 해당 페이지의 canonical URL과 정확히 동일하게 설정하는 것입니다.
참고 자료
이 글의 권고는 아래 공식 문서·연구를 근거로 합니다.