본문 바로가기

개발 공부/React

Next.js에서 구조화된 데이터(Structured Data) 적용하기

구조화된 데이터

구조화된 데이터(Structured Data)는 웹 페이지의 콘텐츠를 검색 엔진이 이해할 수 있도록 도와주는 정형화된 데이터 형식입니다.

주로 JSON-LD (JavaScript Object Notation for Linked Data) 포맷을 사용하며, Schema.org 에서 정의한 스키마에 따라 작성합니다.

이 데이터는 <script type="application/ld+json"> 형태로 HTML 문서 내에 삽입되며, 검색 엔진이 이를 분석하여 리치 결과(Rich Result)를 생성하게 됩니다.

 

구조화된 데이터를 사용하는 이유 (SEO 관점)

 

항목 설명
검색 엔진 이해도 향상 콘텐츠의 정확한 의미를 파악하여 색인 처리 정확도 증가
리치 스니펫 지원 이미지, 별점, 리뷰, 가격, FAQ 등 다양한 형태로 검색 결과에 노출
클릭률 증가 시각적으로 돋보이는 리치 결과로 사용자 관심 유도
콘텐츠 유형 명확화 "이 페이지는 제품이다", "이건 리뷰다" 같은 메타 정보를 명시함으로써 검색 품질 향상

 

 

Next.js에서 구조화된 데이터 적용 방법

Next.js에서는 next/head를 사용하여 <head> 영역에 직접 JSON-LD 스크립트를 삽입할 수 있습니다.

예제: 블로그

import Head from 'next/head';

export default function BlogPost() {
  const structuredData = {
    "@context": "https://schema.org",
    "@type": "Article",
    "headline": "Next.js에서 구조화된 데이터 적용하기",
    "author": {
      "@type": "Person",
      "name": "홍길동"
    },
    "datePublished": "2024-04-22",
    "publisher": {
      "@type": "Organization",
      "name": "개발로그",
      "logo": {
        "@type": "ImageObject",
        "url": "/logo.png"
      }
    }
  };

  return (
    <>
      <Head>
        <script
          type="application/ld+json"
          dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
        />
      </Head>
      <main>
        <h1>구조화된 데이터 적용 방법</h1>
        <p>블로그 콘텐츠입니다...</p>
      </main>
    </>
  );
}

 


// components/StructuredData.tsx
import Head from 'next/head';

interface Props {
  data: Record<string, any>;
}

export default function StructuredData({ data }: Props) {
  return (
    <Head>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
      />
    </Head>
  );
}
  • <StructuredData>는 React/Next.js 프로젝트에서 직접 구현한 커스텀 컴포넌트입니다. 
  • 이 컴포넌트를 만들면 다양한 구조화 데이터를 props로 넘겨줄 수 있어 여러 페이지에서 재사용이 쉽고 유지보수가 편리해집니다.
  • 아래와 같이 작성하여 재사용 가능합니다:

예제 2: 제품 페이지

<StructuredData data={{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Dyson Airwrap",
  "image": ["https://example.com/images/airwrap.jpg"],
  "description": "모발 손상 없이 스타일링 가능한 에어랩.",
  "brand": {
    "@type": "Brand",
    "name": "Dyson"
  },
  "offers": {
    "@type": "Offer",
    "price": "599000",
    "priceCurrency": "KRW",
    "availability": "https://schema.org/InStock"
  }
}} />
  • 사용 용도: 쇼핑몰, 브랜드 소개 페이지, 상품 상세 페이지 등에서 사용합니다. 제품의 이름, 가격, 이미지, 브랜드, 재고 여부 등을 구조화하여 검색 엔진이 해당 정보를 정확히 인식하고, 검색 결과에 제품 정보(썸네일, 가격 등)를 노출할 수 있게 합니다.
  • 구매 가능한 제품 정보와 함께 가격, 재고 여부까지 명확히 명시할 수 있어 검색 결과에 가격 태그와 상품 이미지가 나타날 수 있습니다.
  • Google 검색 결과에서 제품 카드 형태로 가격, 재고 상태, 썸네일이 함께 노출될 수 있음
  • 사용자가 가격 비교 없이 바로 클릭할 가능성 증가

예제 3: FAQ 

<StructuredData data={{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Next.js에서 구조화된 데이터는 어떻게 설정하나요?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "next/head를 이용하여 JSON-LD 스크립트를 <head>에 삽입하면 됩니다."
      }
    },
    {
      "@type": "Question",
      "name": "구조화된 데이터를 사용하면 어떤 이점이 있나요?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "검색 결과에 리치 스니펫이 추가되어 클릭률이 높아질 수 있습니다."
      }
    }
  ]
}} />
  • 사용 용도: 고객센터, SaaS 소개 페이지, 제품 소개 페이지 하단 FAQ 섹션에 적합합니다. 
  • 질문-답변 형식을 구조화하면, Google 검색 결과에서 클릭 없이도 요약된 Q&A 리스트가 직접 노출될 수 있습니다.
  • 검색 결과 하단에 접을 수 있는 질문 리스트가 자동 생성됨
  • 특히 정보성 콘텐츠나 SaaS 제품 문의에 유리

 


자주 사용하는 Schema.org 유형

유형 설명
Article 블로그, 뉴스 등 기사 콘텐츠
Product 쇼핑몰 제품 정보
Event 콘서트, 강연, 모임 등 일정
FAQPage 자주 묻는 질문과 답변 모음
Review 사용자 후기, 별점 포함
Recipe 요리법, 재료, 조리시간
LocalBusiness 사업장 정보 (위치, 전화번호 등)

 

 

 

정리

항목 요약
목적 검색 엔진 이해도 향상 및 SEO 최적화
구현 방식 JSON-LD를 <head> 영역에 스크립트로 삽입
Next.js 방식 next/head 사용, 또는 공통 컴포넌트로 구성
기대 효과 리치 스니펫 노출 → 검색 결과 강화 → 클릭률 증가