JSON-LD @graph 사용법 — 한 페이지에 스키마 여러 개 쌓는 올바른 방법
한 페이지에 Organization, Product, FAQPage 스키마를 동시에 쓰는 올바른 방법. @graph로 엔티티 간 관계를 명시하는 이유와 실전 코드 예시를 담았다.
스키마 마크업을 여러 개 추가했는데 리치 스니펫이 제대로 안 뜬다면, 태그를 분리해서 넣은 게 원인일 수 있다.
@graph를 쓰지 않으면 구글이 스키마 간 관계를 파악하지 못하고, 그 결과 리치 결과 적용이 누락된다. 이 글은 그 구조적 차이를 정확히 설명한다.
제품 상세 페이지에 Product 스키마, FAQ 스키마, Organization 스키마를 각각 <script> 태그로 넣었다. 유효성 검사도 통과했다. 그런데 리치 스니펫은 일부만 뜨거나 아예 안 뜬다.
문제: 분리된 스키마 태그가 왜 불완전한가
Photo by KOBU Agency on Unsplash
한 이커머스 클라이언트의 상품 페이지를 분석했을 때 이런 구조였다:
<script type="application/ld+json">{ "@type": "Organization", ... }</script>
<script type="application/ld+json">{ "@type": "Product", ... }</script>
<script type="application/ld+json">{ "@type": "FAQPage", ... }</script>
각각의 JSON-LD는 유효하다. 하지만 구글 크롤러 입장에서는 이 셋이 서로 어떤 관계인지 알 수 없다. "이 Product를 판매하는 Organization이 누구인가?" — 크롤러가 추론해야 한다. 명시된 게 아니니 신뢰도가 낮아진다.
구글의 스트럭처드 데이터 파서는 @graph 배열 안에 있는 엔티티들을 하나의 지식 그래프 문서로 처리한다. 관계가 명시되면 크롤러가 엔티티 간 연결을 추론 없이 파악할 수 있어 파싱 효율이 높아진다. @graph 자체가 리치 결과를 보장하지는 않지만, 스키마 간 관계가 명확할수록 구글이 올바른 리치 결과 타입을 선택하는 데 도움이 된다.
핵심: @graph로 스키마 묶는 방법
올바른 구조는 <script> 태그를 하나만 쓰고, 그 안에 @graph 배열로 엔티티를 열거하는 것이다:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Corp",
"url": "https://example.com"
},
{
"@type": "Product",
"@id": "https://example.com/product-a#product",
"name": "제품명",
"brand": { "@id": "https://example.com/#organization" },
"offers": {
"@type": "Offer",
"price": "39000",
"priceCurrency": "KRW",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "FAQPage",
"@id": "https://example.com/product-a#faq",
"mainEntity": [
{
"@type": "Question",
"name": "배송은 얼마나 걸리나요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "주문 후 평균 2~3 영업일 내 도착합니다."
}
}
]
}
]
}
핵심은 @id다. "brand": { "@id": "..." } 한 줄이 Product와 Organization을 연결한다. 크롤러가 추론할 필요 없이 관계가 명시되어 있다.
자주 하는 실수
1. @context를 각 엔티티 안에 중복 선언
@graph를 쓰면 @context는 최상단에 한 번만. 안쪽 노드에 넣으면 파서가 혼선을 빚는다.
2. @id 없이 그냥 묶기
@graph 안에 넣었지만 @id가 없으면 엔티티 간 참조가 불가능하다. 그래프의 의미가 사라진다.
3. 페이지마다 다른 @id 형식 사용
@id는 사이트 전체에서 일관된 패턴을 써야 한다. /#organization, /#webpage 등 suffix를 규칙화해 두면 유지 관리가 쉽다.
4. 유효성만 확인하고 관계 검증 생략 Google Rich Results Test는 개별 스키마 유효성만 보여준다. Schema.org 관계 정합성은 직접 확인해야 한다.
실전 체크리스트
-
<script type="application/ld+json">태그를 가급적 하나로 통합했는가 (여러 개도 기술적으로 유효하나,@graph단일 태그가 관계 명시에 유리) -
@context는 최상단에만,@graph배열 안 각 노드에는 없는가 - 모든 주요 엔티티에
@id가 부여되어 있는가 (URL +#suffix형식 권장) - 연관 엔티티는
"brand": { "@id": "..." }형식으로 참조 연결했는가 - Google Rich Results Test + Schema Markup Validator 양쪽 모두 검증했는가
Wrap-up
@graph는 단순히 스키마를 모아 넣는 컨테이너가 아니다. 엔티티 간 관계를 구글이 읽을 수 있게 선언하는 구조다. 같은 유효성 점수라도 관계가 명시된 스키마와 분리된 스키마의 리치 결과 자격은 다르다.
실제 마케팅 실무 경험을 기반으로 작성했습니다.
이 주제와 관련해 SEO 또는 마케팅 자동화 프로젝트를 진행 중이시라면, 아래 버튼을 통해 문의를 남겨주세요. 검토 후 이메일로 답변드립니다.
이 글이 도움됐다면 공유해주세요
블로그 추천
Claude Code vs Cursor 실전 비교
Claude Code와 Cursor를 직접 써보고 비교한 실전 리뷰. 1인 창업자 관점에서 어떤 AI 코딩 도구가 더 나은지 정리했다.
분석 툴 통합 전략 — 전환율 2.3배 만든 법
Amplitude-Statsig 인수 사례로 본 분석 툴 통합 전략. 마테크 스택을 줄여 전환율 2.3배를 만든 실전 과정과 재현법을 정리했다.
AI 도입 속도, 나는 완전히 틀렸다
AI 도입 속도가 빠를수록 성장한다고 믿었다가 오히려 역효과를 겪었다. 1인 창업자가 직접 데이터로 확인한 실수와 교정 방법을 공유한다.