웹 서비스를 오픈하고 열심히 콘텐츠를 발행해도 검색 결과 페이지(SERP)에서 내 글이 다른 사이트처럼 화려한 썸네일, 평점, FAQ 형태로 눈에 띄게 표시되지 않거나 색인 누락을 경험해봤을 것이다.
다만 대부분의 백엔드 및 웹 개발자들은 HTML 태그 구성에만 신경 쓸 뿐, 검색 엔진 수집 로봇이 내 데이터를 정확하게 이해하도록 돕는 '구조화 데이터(Structured Data)' 표준에 대해서는 모른 채 지나치는 경우가 많다.
이번에는 구글 및 주요 검색엔진이 권장하는 Schema.org 기반의 JSON-LD 포맷이 정확히 무엇인지, 왜 필요한지, 그리고 백엔드 실무에서 어떻게 동적으로 생성하고 적용하는지 완벽하게 정리해서 소개하겠다.

 

1. 구조화 데이터와 JSON-LD의 핵심 이해

구조화 데이터란 웹 페이지의 정보를 검색엔진(구글, 네이버, 빙 등)이 오인 없이 분류할 수 있도록 약속된 규격으로 작성한 메타데이터다.
과거에는 HTML 태그 요소에 직접 속성을 주입하는 Microdata 방식이 주로 사용되었으나, 코드 가독성을 떨어뜨리고 유지보수가 어렵다는 단점이 있었다.
현재 Google을 포함한 W3C에서는 HTML의 화면 표현부와 데이터 영역을 완전하게 분리할 수 있는 JSON-LD(JavaScript Object Notation for Linked Data) 방식을 표준으로 적극 권장하고 있다.

Microdata 방식과 JSON-LD 방식을 비교해보면 다음과 같은 차이가 존재한다.

비교 항목Microdata / RDFaJSON-LD (권장)
작성 위치HTML 태그 내부 (속성 형태)<head> 또는 <body> 내 <script> 태그
유지보수성디자인 변경 시 코드 파손 위험 높음백엔드 API 및 데이터 레이어에서 독립적 관리 가능
검색엔진 가독성태그 파싱 과정에서 오탐 가능성 존재자바스크립트 객체 형태로 명확하고 정밀한 파싱 가능
Google 권장 여부권장하지 않음 (하위 호환 유지)공식 권장 포맷

 

2. 대표적인 Schema.org 유형과 필수 규격

Schema.org에는 웹사이트 종류에 따른 수많은 유형(Type)이 존재한다. 대표적으로 많이 사용되는 유형은 아래와 같다.

  • Article / BlogPosting: 블로그 글, 뉴스 기사 등에 적용되며 작성자, 발행일, 대표 이미지 정보 제공
  • Product / Review: 쇼핑몰 상품 페이지에 적용되며 가격, 재고 상태, 별점 평점 표시
  • FAQPage: 자주 묻는 질문과 답변을 검색 결과 바로 아래 펼침 형태로 노출
  • BreadcrumbList: 카테고리 이동 경로(탐색 단리)를 검색 결과 URL 상단에 깔끔하게 표시

 

3. 실전 예제: PHP에서 동적으로 JSON-LD 생성 및 적용하기

백엔드에서 블로그 게시글 데이터나 상품 데이터를 다룰 때, HTML 템플릿에 하드코딩하지 않고 PHP 배열 구조를 활용하여 안전하게 JSON-LD를 출력하는 코드를 살펴보자.

 

✗ 잘못된 코드 (Microdata 방식으로 HTML과 결합하여 가독성 및 유지보수 저해)

✗ HTML 요소마다 itemprop 속성을 남발하여 디자인 수정 시 SEO 데이터가 쉽게 훼손된다.

<div itemscope itemtype="https://schema.org/Article">
  <h1 itemprop="headline">SEO 최적화 가이드</h1>
  <p>작성자: <span itemprop="author">REDINFO</span></p>
  <!-- 디자인 레이아웃 수정 시 itemprop 속성이 누락되거나 태그가 깨지는 문제가 빈번히 발생 -->
</div>

 

✓ 올바른 코드 (PHP 배열을 통한 동적 JSON-LD 생성을 통한 완전 분리)

✓ 백엔드에서 필요한 데이터를 안전하게 json_encode 처리하여 스크립트 블록으로 주입한다.

<?php
// 서버 DB에서 조회한 게시글 데이터
$post = [
    'title' => '구글 검색 노출 누락 해결 - Schema.org JSON-LD 적용 가이드',
    'description' => '검색엔진이 내 사이트의 콘텐츠를 완벽히 이해하도록 JSON-LD 구조화 데이터를 적용하는 방법입니다.',
    'author' => 'REDINFO 개발팀',
    'datePublished' => '2024-03-20T09:00:00+09:00',
    'dateModified' => '2024-03-20T10:30:00+09:00',
    'image' => 'https://example.com/images/seo-guide.jpg',
    'url' => 'https://example.com/blog/seo-json-ld-guide'
];

// Schema.org Article 규격에 맞춘 JSON-LD 배열 생성
$schemaData = [
    '@context' => 'https://schema.org',
    '@type' => 'BlogPosting',
    'mainEntityOfPage' => [
        '@type' => 'WebPage',
        '@id' => $post['url']
    ],
    'headline' => $post['title'],
    'description' => $post['description'],
    'image' => [$post['image']],
    'datePublished' => $post['datePublished'],
    'dateModified' => $post['dateModified'],
    'author' => [
        '@type' => 'Person',
        'name' => $post['author']
    ],
    'publisher' => [
        '@type' => 'Organization',
        'name' => 'REDINFO',
        'logo' => [
            '@type' => 'ImageObject',
            'url' => 'https://example.com/logo.png'
        ]
    ]
];
?>

<!-- HTML <head> 내부 출력 -->
<script type="application/ld+json">
<?php echo json_encode($schemaData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); ?>
</script>

 

실제 브라우저 Rendering / 출력 결과 (HTML Source)
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": "https://example.com/blog/seo-json-ld-guide"
    },
    "headline": "구글 검색 노출 누락 해결 - Schema.org JSON-LD 적용 가이드",
    "description": "검색엔진이 내 사이트의 콘텐츠를 완벽히 이해하도록 JSON-LD 구조화 데이터를 적용하는 방법입니다.",
    "image": [
        "https://example.com/images/seo-guide.jpg"
    ],
    "datePublished": "2024-03-20T09:00:00+09:00",
    "dateModified": "2024-03-20T10:30:00+09:00",
    "author": {
        "@type": "Person",
        "name": "REDINFO 개발팀"
    },
    "publisher": {
        "@type": "Organization",
        "name": "REDINFO",
        "logo": {
            "@type": "ImageObject",
            "url": "https://example.com/logo.png"
        }
    }
}
</script>

 

4. 주의사항 및 흔한 실수

구조화 데이터를 적용할 때 개발자들이 가장 흔하게 저지르는 실수는 다음과 같다.

  • 숨겨진 콘텐츠 표기 금지: 사용자의 눈에는 보이지 않는데 검색엔진을 속이기 위해 JSON-LD에만 허위 데이터(예: 평점 스팸, 존재하지 않는 FAQ)를 넣으면 Google 패널티를 받아 검색 결과에서 아예 제외될 수 있다.
  • 날짜 포맷 오류: ISO 8601 형식(YYYY-MM-DDThh:mm:ssTZD)을 준수해야 한다. 단순히 '2024-03-20' 형태로만 넣으면 타임존 미지정으로 경고가 발생할 수 있다.
  • 문법 검증 필수: JSON 특성상 마지막 요소 뒤 쉼표(Trailing Comma)가 남으면 파싱 에러가 발생한다. 구글의 '리치 리절트 테스트(Rich Results Test)' 도구를 사용하여 적용 후 반드시 검증해야 한다.

 

5. 정리 및 실무 적용 방안

Schema.org JSON-LD 적용은 단순한 SEO 테크닉을 넘어 검색엔진과의 정확한 커뮤니케이션 도구다.
작은 최적화와 표준 준수 습관이 모여서 검색 결과 상위 노출과 높은 클릭률(CTR)이라는 큰 효과를 만든다는 점을 잊지 말자.
이 글의 실전 PHP 예제와 JSON-LD 구조화 검증 절차를 참고해 여러분의 웹 사이트에 즉시 적용해 보면, 구글 검색 결과에서 눈에 띄는 리치 리절트 결과를 얻을 수 있을 것이다.