Community写作与编辑github.com

shaul1991/구조화-데이터

JSON-LD 구조화 데이터를 작성하고 검증합니다. Event, Organization + sameAs (네이버 사이트 연관채널), WebSite (Google 사이트 이름), BreadcrumbList, ItemList를 지원하며, Google과 네이버의 지원 차이를 포함합니다.

구조화-데이터 是什么?

이 스킬은 Google Search Central과 네이버 서치어드바이저의 공식 문서를 기반으로 JSON-LD 형식의 구조화 데이터를 작성하고 검증하는 도구입니다. 주로 Event, Organization (sameAs), WebSite, BreadcrumbList, ItemList 스키마 유형을 지원하며, Google과 네이버 간 지원 차이 (예: Event의 한국 미지원)를 명확히 안내합니다. 모든 구조화 데이터는 '보이는 본문과 일치하는 값만' 포함한다는 원칙을 따르며, 검증을 위해 Google 리치 결과 테스트, Schema Markup Validator, seo-check.mjs 스크립트를 사용합니다. Event 마크업 시 고유 URL, 필수 속성 (name, startDate, location), 상태 변경 (취소/연기/일정 변경) 규칙을 상세히 제공하고, Organization + sameAs는 네이버 연관채널 요구사항에 맞춰 실제 운영 중인 채널 URL만 포함하도록 안내합니다. 이 스킬은 Claude, Cursor, GitHub Copilot 등 다양한 AI 코딩 도구에서 사용할 수 있으며, 특히 한국어 콘텐츠를 대상으로 하는 SEO 작업에 적합합니다.

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shaul1991/seo-skills/tree/HEAD/skills/structured-data

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

구조화 데이터(JSON-LD)

근거: Google Search Central 구조화 데이터 문서와 네이버 서치어드바이저 구조화된 데이터 가이드(2026-11-04 확인). 판단이 중요하면 원문을 다시 엽니다.

공통 원칙

  • 보이는 본문과 일치하는 값만 넣습니다. 모르는 가격·시각·재고·평점은 비워 두고 만들지 않습니다(Google AI 기능 문서도 "구조화된 데이터가 보이는 텍스트와 일치"를 권장).
  • 마크업해도 리치 결과·노출은 보장되지 않습니다(Google·네이버 모두 명시).
  • 형식은 JSON-LD를 기본으로 합니다(Google 지원, 네이버는 Microdata 또는 JSON-LD 권장). <head> 또는 <body>의 <script type="application/ld+json">.
  • 검증: Google 리치 결과 테스트, Schema Markup Validator(네이버 가이드가 schema.org 도구 사용을 안내), seo-orchestrator Skill의 scripts/seo-check.mjs(JSON 파싱·필수 속성만 확인).

지원 차이(2026-11-04)

유형Google네이버
Event이벤트 검색 환경 문서 있음. ⚠️ 제공 지역 목록에 한국 없음(오스트레일리아·브라질·캐나다·독일·인도·중남미·스페인·영국·미국)가이드 없음
Organization/Person + sameAs조직 정보사이트 연관채널(루트 페이지, name·url·sameAs 필수)
WebSite사이트 이름(홈페이지)—
BreadcrumbList지원지원(name 필수, position 선택)
ItemList(캐러셀)일부 유형만캐러셀(ListItem) 가이드 있음

한국 대상 행사 사이트라면: Event 마크업은 정확한 데이터 정리와 다른 지역·향후 확장을 위해 둘 수 있지만, 현재 한국 Google 검색에서 이벤트 리치 결과가 나온다고 가정하지 않습니다. 성과는 일반 검색 결과(제목·스니펫)와 Search Console로 판단합니다.

Event (Google 기준)

규칙(Google 구조화된 이벤트 데이터):

  • 이벤트마다 **고유 URL(리프 페이지)**에 마크업. 여러 이벤트를 나열한 목록·일정 페이지가 아니라 상세 페이지에.
  • 필수: name(행사 제목. 장소명·가격·"지금 예매" 같은 홍보 문구 금지), startDate(ISO-8601), location(Place + name + address).
  • 권장: endDate, eventStatus, description(날짜·장소 반복 말고 행사 내용), image(가로 1,920px 권장·최소 720px, 16:9·4:3·1:1 여러 장), offers, organizer, performer, previousStartDate.
  • 날짜: 시간을 모르면 날짜만("2026-12-04"). T00:00:00으로 채우지 않습니다. 시간이 있으면 UTC 오프셋 포함(2026-12-04T10:00:00+09:00).
  • 여러 날 열리면 startDate·endDate 둘 다. 날마다 별도 티켓이 필요하면 날짜별 Event.
  • 여러 장소에서 동시에 열리면 장소별 Event.
  • 무료 입장이 공식 확인된 경우만 offers.price: 0. 판매 전이면 availability 생략 가능, validFrom은 판매 시작 시각.
  • 상태 변경 시 다른 값은 그대로 두고 eventStatus만 변경:
    • 취소 EventCancelled(startDate·location 삭제 금지)
    • 연기·날짜 미정 EventPostponed(원래 startDate 유지)
    • 새 날짜 확정 EventRescheduled + 새 startDate/endDate + 선택 previousStartDate
  • 이벤트가 아닌 것(쿠폰, 영업시간, 할인 판매)을 Event로 표시하지 않습니다. 멤버십·초대 전용 행사는 이벤트 환경 대상이 아닙니다.
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "<공식 행사명과 회차>",
  "startDate": "<YYYY-MM-DD 또는 YYYY-MM-DDThh:mm:ss+09:00>",
  "endDate": "<YYYY-MM-DD>",
  "eventStatus": "https://schema.org/EventScheduled",
  "location": {
    "@type": "Place",
    "name": "<행사장 이름>",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "<도로명 주소>",
      "addressLocality": "<시·구>",
      "addressRegion": "<시·도>",
      "postalCode": "<우편번호>",
      "addressCountry": "KR"
    }
  },
  "image": ["<https://.../16x9.jpg>", "<https://.../4x3.jpg>", "<https://.../1x1.jpg>"],
  "description": "<행사 내용 요약. 날짜·장소 반복 금지>",
  "organizer": { "@type": "Organization", "name": "<주최>", "url": "<주최 공식 URL>" }
}
</script>

offers는 가격·판매 정보가 공식 확인된 경우에만 추가합니다.

목록 페이지

  • 지역·월 목록 페이지에는 Event를 여러 개 넣지 않습니다(Google은 단일 이벤트 페이지만 지원). 대신 BreadcrumbList와, 필요하면 상세 URL을 담은 ItemList.
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "ItemList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "url": "https://example.com/events/<id-1>" },
    { "@type": "ListItem", "position": 2, "url": "https://example.com/events/<id-2>" }
  ]
}
</script>

WebSite (Google 사이트 이름, 홈페이지만)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "<사이트 이름>",
  "alternateName": ["<약칭>"],
  "url": "https://example.com/"
}
</script>

og:site_name, 홈페이지 <title>과 같은 이름을 씁니다. 출처: 사이트 이름

Organization + sameAs (네이버 사이트 연관채널, 루트 페이지)

네이버가 분석에 쓰는 연관채널 도메인(2026-11-04): 네이버 블로그·스마트스토어·지식iN·치지직·클립, 당근·스레드·인스타그램·유튜브·카카오스토리·카카오톡 채널·티스토리·틱톡·페이스북·X(트위터). 노출은 보장되지 않습니다.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "<사이트 이름>",
  "url": "https://example.com/",
  "sameAs": [
    "https://cafe.naver.com/<카페>",
    "https://pf.kakao.com/<채널>",
    "https://x.com/<계정>"
  ]
}
</script>
  • 실제로 운영 중인 채널만 넣습니다. 개설 전 채널 URL을 미리 넣지 않습니다.
  • Daum도 같은 형식(Person/Organization + sameAs)을 쓰며 지원 도메인이 다릅니다: 유튜브, 페이스북, 엑스, 인스타그램, 구글플레이, 애플스토어, 카카오스토리, 다음카페, 카카오TV, 티스토리, 브런치(daum-search). 한 블록에 두 검색엔진의 실제 채널을 함께 넣으면 됩니다.
  • 네이버 카페는 위 연관채널 목록에 명시되어 있지 않습니다(2026-11-04). 넣어도 되지만 네이버가 연관채널로 쓴다고 가정하지 않습니다.
  • 출처: 사이트 연관채널

BreadcrumbList (Google·네이버 공통)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "<상위 분류 이름>", "item": "https://example.com/<상위>" },
    { "@type": "ListItem", "position": 2, "name": "<하위 분류 이름>", "item": "https://example.com/<상위>/<하위>" }
  ]
}
</script>
  • 네이버: "홈", "top" 같은 일반어 대신 페이지를 설명하는 이름, 넓은 범위→구체 순서, 너무 긴 텍스트·숫자·특수문자만으로 된 이름 금지.
  • 출처: 네이버 BreadcrumbList, Google 탐색경로

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能