웹사이트를 운영하며 검색엔진 결과 페이지(SERP)에 내 사이트의 자주 묻는 질문(FAQ) 목록이 화려하게 펼쳐지는 모습을 꿈꿔봤을 것이다. 경쟁사 사이트는 검색 결과창 아래에 질문과 답변 접기 메뉴가 바로 노출되어 시선을 사로잡는데, 내 사이트는 단조로운 메타 설명만 나와 답답했던 경험이 있을 것이다. 다만 대부분의 개발자들은 단순 HTML 태그나 텍스트 작성만으로는 검색엔진이 이를 질문과 답변 구조로 인식하지 못한다는 사실을 모르는 경우가 많다. 이번에는 FAQPage 구조화 데이터가 정확히 뭔지, 왜 필요한지, 그리고 JSON-LD를 활용해 내 사이트에 어떻게 적용하고 검증하는지 완벽하게 정리해서 소개하겠다.
리치 리설트(Rich Results)는 구글 검색 결과에서 단순한 제목과 URL, 메타 설명 외에 추가적인 시각적 정보나 기능을 제공하는 포맷을 말한다. 평점 별점, 제품 가격, 레시피 연동, 그리고 FAQ 목록이 대표적이다.
검색엔진 크롤러는 웹페이지의 일반 HTML 텍스트를 읽을 때 이것이 질문인지 일반 본문 문장인지 명확히 구별하기 어렵다. 이때 Schema.org 표준에 맞춘 구조화 데이터(Structured Data)를 제공하면, 검색엔진이 페이지 내의 데이터 의미를 완벽하게 파악한다.
구조화 데이터를 표기하는 방식에는 Microdata, RDFa, JSON-LD 등 여러 가지가 있지만, 구글은 권장 표준으로 JSON-LD(JavaScript Object Notation for Linked Data)를 공식 지정하고 있다. HTML 본문 레이아웃을 훼손하지 않고 script 태그 형태(application/ld+json)로 독립적으로 삽입할 수 있어서 유지보수가 매우 용이하다.
| 구분 | 일반 검색 노출 | FAQPage 구조화 데이터 적용 |
|---|---|---|
| 표시 형태 | 제목 + URL + 단일 메타 설명 텍스트 | 제목 + URL + 기본 설명 + 하단 질문/답변 아코디언 메뉴 |
| 화면 점유율(SERP Real Estate) | 기본 2~3줄 영역만 차지 | 질문 목록이 펼쳐지며 화면 점유율 2배 이상 증가 |
| 사용자 클릭률(CTR) | 보통 수준의 클릭률 | 압도적인 시각적 주목도로 클릭률 대폭 상승 |
| 검색 로봇 데이터 인식 | 텍스트 문맥을 추론하여 파악 | 질문(Question)과 답변(Answer)을 명확한 객체로 인지 |
FAQPage 타입의 JSON-LD 스펙은 구조가 매우 직관적이다. 최상위 객체의 @type을 FAQPage로 선언하고, mainEntity 배열에 각각의 질문과 답변 쌍을 넣는 방식이다.
핵심 필드 구성:
- @context: "https://schema.org" (Schema.org 어휘집 사용 선언)
- @type: "FAQPage"
- mainEntity: 질문 및 답변 객체 배열
- Question: 질문 객체 (name 속성에 질문 텍스트 지정)
- Answer: 답변 객체 (text 속성에 답변 텍스트 지정)
실무에서는 데이터베이스나 API에서 FAQ 목록을 조회하여 동적으로 JSON-LD 스크립트를 생성한다. 잘못된 예제와 올바른 구현 방식을 비교해보자.
✗ 잘못된 코드(질문/답변 객체 구조 파괴 및 표준 스키마 미준수):
<!-- ✗ 잘못된 구현: Schema.org 표준 키값이 아닌 임의의 키를 사용한 경우 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"questions": [
{
"title": "배송 기간은 얼마나 걸리나요?",
"reply": "주문 후 영업일 기준 2~3일 소요됩니다."
}
]
}
</script>이 코드는 구글 검색 로봇이 해석하지 못한다. Schema.org 표준 규격인 mainEntity, Question, Answer, acceptedAnswer 객체명을 사용하지 않고 임의의 키(questions, title, reply)를 썼기 때문에 검증 도구에서 에러가 발생한다.
✓ 올바른 코드(Schema.org 표준 규격을 완벽히 준수하고 안전하게 JSON 인코딩):
<?php
// DB에서 가져온 FAQ 데이터 예시
$faq_list = [
[
'question' => '배송 기간은 얼마나 걸리나요?',
'answer' => '주문 완료 후 영업일 기준 <strong>2~3일</strong> 내에 배송됩니다.'
],
[
'question' => '교환 및 반품 절차가 궁금합니다.',
'answer' => '마이페이지 > 주문 내역에서 반품 신청을 진행할 수 있습니다.'
]
];
// Schema.org 표준 배열 구조 생성
$schema_data = [
'@context' => 'https://schema.org',
'@type' => 'FAQPage',
'mainEntity' => []
];
foreach ($faq_list as $item) {
$schema_data['mainEntity'][] = [
'@type' => 'Question',
'name' => $item['question'],
'acceptedAnswer' => [
'@type' => 'Answer',
'text' => $item['answer']
]
];
}
?>
<!-- HTML head 또는 body 내부 출력 -->
<script type="application/ld+json">
<?php echo json_encode($schema_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); ?>
</script>결과 출력값(웹페이지에 생성된 스크립트):
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "배송 기간은 얼마나 걸리나요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "주문 완료 후 영업일 기준 <strong>2~3일</strong> 내에 배송됩니다."
}
},
{
"@type": "Question",
"name": "교환 및 반품 절차가 궁금합니다.",
"acceptedAnswer": {
"@type": "Answer",
"text": "마이페이지 > 주문 내역에서 반품 신청을 진행할 수 있습니다."
}
}
]
}
</script>백엔드에서 json_encode() 함수를 활용하면 따옴표 이스케이프 문제나 유니코드 깨짐 현상을 원천적으로 방지하면서 깨끗한 JSON-LD 스크립트를 출력할 수 있다.
구조화 데이터 코드를 정상 작성했더라도 구글 품질 가이드라인을 위반하면 검색 결과에 나타나지 않거나 감점 요인이 된다.
- ✗ 화면에 보이지 않는 숨김 텍스트(Hidden Text) 사용: 실제 웹페이지 화면(DOM)에는 FAQ 내용이 없는데 JSON-LD 스크립트에만 FAQ 데이터를 집어넣는 행위는 스팸 조작으로 간주된다. 반드시 방문자가 눈으로 확인 가능한 콘텐츠와 1:1로 일치해야 한다.
- ✗ 사용자 제출형 Q&A 게시판에 적용: 사용자들이 자유롭게 답글을 남기는 포럼 형태에는 FAQPage가 아닌 QAPage 스펙을 써야 한다. FAQPage는 웹사이트 관리자가 공식 작성한 질문과 답변에만 사용할 수 있다.
- ✗ 허용되지 않는 HTML 태그 포함: 답변 text 필드에는 b, i, a, ul, ol, li 같은 기본적인 태그는 허용되지만, div, script, iframe 같은 레이아웃 태그나 복잡한 스타일은 배제해야 한다.
- ✓ 적용 후 구글 리치 리설트 테스트(Rich Results Test) 도구를 통해 문법 오류와 노출 자격 여부를 반드시 검증하자.
FAQPage 구조화 데이터는 단순히 검색엔진에 메타 정보를 전달하는 수준을 넘어, 검색 결과 화면(SERP)에서 내 사이트의 점유율을 획기적으로 넓혀주는 강력한 SEO 무기다. 표준 스키마에 맞춘 작고 명확한 데이터 최적화가 모여서 검색 클릭률 상승이라는 큰 효과를 만든다는 점을 잊지 말자. 이 글의 3단계 동적 JSON-LD 예제를 참고해 본인의 웹사이트에 적용하고 구글 검증 도구로 체크를 진행하면, 검색 결과에서 압도적인 시각적 우위를 점하는 사이트를 완성할 수 있을 것이다.