정적 블로그를 구글·네이버 검색에 노출시키기 — 색인 준비 전 과정

Astro 정적 블로그를 구글·네이버 검색 결과에 띄우기 위해 한 작업 전부. 정적 HTML 렌더, 글별 메타·OG·JSON-LD, sitemap·robots.txt, Google Search Console·네이버 서치어드바이저 등록과 소유확인, 다국어 hreflang까지.

TL;DR

블로그 글이 구글·네이버에 뜨려면 세 가지가 필요하다.

  1. 크롤러가 읽을 수 있는 페이지 — 정적 HTML로 미리 렌더
  2. 발견 경로sitemap.xml + robots.txt에 등록, 그리고 각 검색엔진 웹마스터 도구에 제출
  3. 페이지가 뭔지 알려주는 메타 — 글마다 title·description·canonical·OG·구조화 데이터

이 글은 이 블로그(jiny.shop/blog, Astro 정적 빌드)를 검색에 노출시키려고 실제로 한 작업을 순서대로 정리한 기록이다.

0. 검색에 “뜬다”는 건 3단계다

헷갈리기 쉬운데, 이건 한 번에 되는 게 아니라 단계가 있다.

  • 크롤링(crawl): 검색봇이 내 페이지를 읽어간다
  • 색인(index): 읽은 페이지를 검색 DB에 등록한다
  • 랭킹(rank): 검색어에 대해 몇 번째로 보여줄지 정한다

내가 할 수 있는 건 앞 두 단계를 빠르고 확실하게 만들어주는 것까지다. 랭킹은 콘텐츠·검색량·경쟁이 좌우하고 시간도 걸린다. 그래서 “설정 끝 = 바로 1페이지”가 아니라, “이제 검색엔진이 내 글을 발견하고 이해할 준비가 됐다”가 목표다.

1. 정적 HTML로 렌더 (가장 중요)

검색봇은 JavaScript를 실행하지 않거나, 하더라도 뒤늦게/불완전하게 한다. 본문이 JS로 그려지는 SPA는 크롤러가 빈 페이지를 볼 수 있다.

그래서 이 블로그는 Astro로 빌드 시점에 정적 HTML을 생성한다. 글 하나가 /blog/<카테고리>/<slug>/index.html로 미리 렌더되어 nginx가 그대로 내려준다. 크롤러가 받는 순간 본문·제목·링크가 다 들어 있다. 검색 노출의 8할은 사실 여기서 결정된다.

2. 글마다 메타 정보

페이지마다 “이게 뭔 글인지”를 기계가 읽을 수 있게 넣었다.

  • <title>, <meta name="description"> — 검색 결과의 제목/스니펫
  • <link rel="canonical"> — 정식 URL 지정(중복 URL 방지)
  • Open Graph / Twitter 카드 — 공유 시 미리보기(+ 글마다 제목 박힌 OG 이미지 자동 생성)
  • 구조화 데이터(JSON-LD BlogPosting) — 작성일·작성자·제목을 명시적으로

JSON-LD는 이런 형태로 글마다 자동 출력된다.

{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "글 제목",
  "datePublished": "2026-06-17T...",
  "author": { "@type": "Person", "name": "Jiny K" },
  "inLanguage": "ko-KR"
}

이런 메타가 있으면 검색 결과에 날짜·작성자 등이 더 풍부하게 붙을 수 있다.

3. sitemap & robots.txt

검색봇이 “이 사이트에 어떤 글들이 있는지” 한 번에 알 수 있게 지도를 준다.

  • 블로그 글 목록은 Astro가 /blog/sitemap-index.xml을 자동 생성한다. 글을 추가하면 다음 빌드에 자동 반영된다.
  • 메인 사이트의 손수 관리하는 sitemap.xml에도 /blog/ 진입점을 한 줄 추가했다.
  • robots.txt에는 사이트맵 위치를 둘 다 등록했다.
User-agent: *
Allow: /

Sitemap: https://jiny.shop/sitemap.xml
Sitemap: https://jiny.shop/blog/sitemap-index.xml

사이트맵은 위치만 한 번 등록하면, 내용이 늘어나도 검색엔진이 알아서 다시 읽는다. 글 쓸 때마다 재등록할 필요 없다.

4. Google Search Console

구글은 알아서도 찾지만, Search Console에 등록하면 발견·색인이 빨라지고 “색인됐는지 / 어떤 검색어로 들어오는지”를 볼 수 있다.

  1. 사이트(도메인 또는 URL 접두어) 등록 + 소유확인
  2. Sitemaps 메뉴에 https://jiny.shop/blog/sitemap-index.xml 제출
  3. (선택) URL 검사로 특정 글의 색인 생성 요청 → 색인 가속

5. 네이버 서치어드바이저

한국 유입을 노린다면 네이버는 따로 챙겨야 한다. 구글에 등록했다고 네이버에 뜨지 않는다.

  1. 서치어드바이저 → 웹마스터 도구에 사이트 등록
  2. 사이트 소유 확인 — 메타태그 방식 또는 HTML 파일 방식 중 선택
    • 이 블로그는 HTML 파일 방식을 썼다. 네이버가 준 naver{...}.html을 사이트 루트(https://jiny.shop/naver....html)에 올리고 확인을 누르면 통과.
    • 정적 사이트라 파일을 루트에 두면 nginx가 그대로 서빙해서 간단했다.
  3. 사이트맵 제출sitemap.xml, blog/sitemap-index.xml 둘 다
  4. RSS 제출https://jiny.shop/blog/rss.xml (네이버는 RSS도 수집에 활용)

핵심: 소유확인 파일/메타태그는 사이트가 라이브 상태여야 검증된다. 배포 → 확인 클릭 순서.

6. 다국어라면: hreflang

이 블로그는 한국어(/blog/)와 영어(/blog/en/) 버전을 가진 글이 있다. 같은 글의 언어별 버전은 hreflang으로 서로 묶어 검색엔진에 알려준다.

<link rel="alternate" hreflang="ko" href="https://jiny.shop/blog/.../" />
<link rel="alternate" hreflang="en" href="https://jiny.shop/blog/en/.../" />
<link rel="alternate" hreflang="x-default" href="https://jiny.shop/blog/.../" />

이러면 구글이 한국 검색자에겐 한글판, 영어권엔 영어판을 보여준다. 별도 설정 없이 페이지에 박힌 hreflang만으로 동작한다.

7. 현실적인 기대치

  • 색인엔 시간이 걸린다. 제출해도 며칠~몇 주. 조급해하지 말 것.
  • 롱테일이 유리하다. “FCM 토큰 null Flutter” 같은 구체적인 삽질 키워드는 경쟁이 적어 의외로 잘 걸린다. 반대로 “Docker 튜토리얼” 같은 일반 키워드는 거대 사이트와 경쟁이라 어렵다.
  • 사이트 내 검색은 별개다. 방문자가 블로그 안에서 찾는 검색(이 블로그는 Pagefind 사용)과, 구글·네이버 노출은 다른 얘기다. 둘 다 챙기면 좋다.

체크리스트

  1. 본문이 정적 HTML로 렌더되는가
  2. 글마다 title·description·canonical·OG·JSON-LD가 있는가
  3. sitemap이 자동 생성되고 robots.txt에 등록됐는가
  4. Google Search Console 등록 + 사이트맵 제출
  5. 네이버 서치어드바이저 소유확인 + 사이트맵·RSS 제출
  6. 다국어면 hreflang 연결
  7. 색인은 기다리고, 글은 계속 쌓는다

결국 검색 노출의 토대는 “기계가 읽고 이해할 수 있는 정적 페이지 + 발견 경로 등록”이다. 나머지는 좋은 글을 꾸준히 쌓는 일이 한다.