블로그 포스트에 구조화 데이터를 심어 리치 스니펫 노출 기반 마련
목차
블로그 포스트 페이지에 Article JSON-LD 구조화 데이터를 심었다.
왜 지금 이 작업이었나
SEO 개선 항목들을 훑다 보면 늘 후순위로 밀리는 게 구조화 데이터다. 기능적으로 눈에 안 보이고, 배포해도 당장 트래픽이 튀지 않으니까. 근데 이게 쌓이면 검색 엔진 입장에서 이 사이트가 "신뢰할 수 있는 콘텐츠 소스"인지 판단하는 데 조용히 영향을 준다. Google의 Rich Results 대상이 되려면 Article 스키마가 있어야 하고, 없으면 아무리 글을 잘 써도 리치 스니펫 노출 자체가 안 된다. 그 손해가 누적되는 걸 이제 더 두고 볼 수 없었다.
Post.astro는 이 블로그에서 모든 개별 포스트 페이지를 렌더링하는 레이아웃 파일이다. 여기에 한 번만 박아두면 앞으로 작성되는 글 전부에 자동으로 JSON-LD가 따라붙는다. 영향 범위 대비 수정 지점이 단 하나라는 게 이 구조의 장점이다.
실제로 뭘 넣었나
Article JSON-LD는 <script type="application/ld+json"> 태그 안에 JSON 객체를 직렬화해서 <head> 또는 <body> 안에 삽입한다. 스키마는 schema.org 스펙을 따르며, Article 타입 기준으로 최소한 아래 필드는 있어야 Google이 유효하다고 인정한다.
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "포스트 제목",
"datePublished": "2026-05-20T00:00:00+09:00",
"dateModified": "2026-05-20T00:00:00+09:00",
"author": {
"@type": "Person",
"name": "작성자 이름"
},
"image": "https://example.com/og-image.png",
"url": "https://example.com/posts/slug"
}
Astro에서는 frontmatter에서 받아온 값들을 그대로 템플릿 리터럴로 주입할 수 있어서 따로 클라이언트 JS 없이 SSG 시점에 정적으로 박힌다. 이 부분이 Next.js 같은 환경보다 오히려 깔끔하다. 런타임 hydration 없이 HTML에 그냥 출력되니까.
<script type="application/ld+json" set:html={JSON.stringify({
"@context": "https://schema.org",
"@type": "Article",
headline: title,
datePublished: pubDate.toISOString(),
dateModified: (updatedDate ?? pubDate).toISOString(),
author: { "@type": "Person", name: AUTHOR_NAME },
image: ogImage ?? DEFAULT_OG_IMAGE,
url: Astro.url.href,
})} />
set:html을 쓰는 이유는 Astro가 기본적으로 {} 내부 표현식을 HTML 이스케이프 처리하기 때문이다. <, >, " 같은 문자가 JSON 안에서 엔티티로 변환되면 JSON 파싱 자체가 깨진다. set:html로 raw output을 명시해줘야 한다.
이런 변경이 놓치기 쉬운 이유
| 항목 | 상태 |
|---|---|
| 기능 동작에 영향 | 없음 |
| 사용자 화면에서 보임 | 없음 |
| 배포 직후 효과 확인 가능 여부 | 불가 (크롤링 주기 의존) |
| 코드 리뷰에서 체크하기 쉬운가 | 낮음 |
| 장기 SEO 효과 | 있음 |
보다시피 단기 피드백이 없는 작업이다. 그래서 항상 후순위에 눌린다. 팀에서 이런 류의 작업을 챙기려면 "검색 노출 개선" 같은 큰 목표에 묶어서 OKR 단위로 올려두거나, 아예 SEO 체크리스트를 정기 배포 전 게이트에 걸어두는 게 유일한 방법이다. 그렇지 않으면 계속 밀린다.
Google Search Console에서 Rich Results Test로 유효성은 바로 확인할 수 있다. 배포하고 URL 붙여넣으면 Article 스키마를 감지했는지, 필수 필드 빠진 게 없는지 즉시 나온다. 효과는 몇 주 기다려야 하지만 유효성 확인은 당일 가능하니, PR 머지 전에 이걸 체크 항목에 넣으면 최소한 "박긴 했는데 깨진" 상황은 방지할 수 있다.
레이아웃 파일 하나 고친 거지만, 앞으로 쌓일 모든 포스트가 처음부터 구조화 데이터를 갖고 나온다는 점에서 지금 한 게 맞다.
끝.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.