정적 블로그를 구글·네이버 검색에 노출시키기 — 색인 준비 전 과정
Astro 정적 블로그를 구글·네이버 검색 결과에 띄우기 위해 한 작업 전부. 정적 HTML 렌더, 글별 메타·OG·JSON-LD, sitemap·robots.txt, Google Search Console·네이버 서치어드바이저 등록과 소유확인, 다국어 hreflang까지.
TL;DR
블로그 글이 구글·네이버에 뜨려면 세 가지가 필요하다.
- 크롤러가 읽을 수 있는 페이지 — 정적 HTML로 미리 렌더
- 발견 경로 —
sitemap.xml+robots.txt에 등록, 그리고 각 검색엔진 웹마스터 도구에 제출 - 페이지가 뭔지 알려주는 메타 — 글마다
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에 등록하면 발견·색인이 빨라지고 “색인됐는지 / 어떤 검색어로 들어오는지”를 볼 수 있다.
- 사이트(도메인 또는 URL 접두어) 등록 + 소유확인
- Sitemaps 메뉴에
https://jiny.shop/blog/sitemap-index.xml제출 - (선택) URL 검사로 특정 글의 색인 생성 요청 → 색인 가속
5. 네이버 서치어드바이저
한국 유입을 노린다면 네이버는 따로 챙겨야 한다. 구글에 등록했다고 네이버에 뜨지 않는다.
- 서치어드바이저 → 웹마스터 도구에 사이트 등록
- 사이트 소유 확인 — 메타태그 방식 또는 HTML 파일 방식 중 선택
- 이 블로그는 HTML 파일 방식을 썼다. 네이버가 준
naver{...}.html을 사이트 루트(https://jiny.shop/naver....html)에 올리고 확인을 누르면 통과. - 정적 사이트라 파일을 루트에 두면 nginx가 그대로 서빙해서 간단했다.
- 이 블로그는 HTML 파일 방식을 썼다. 네이버가 준
- 사이트맵 제출 —
sitemap.xml,blog/sitemap-index.xml둘 다 - 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 사용)과, 구글·네이버 노출은 다른 얘기다. 둘 다 챙기면 좋다.
체크리스트
- 본문이 정적 HTML로 렌더되는가
- 글마다
title·description·canonical·OG·JSON-LD가 있는가 sitemap이 자동 생성되고robots.txt에 등록됐는가- Google Search Console 등록 + 사이트맵 제출
- 네이버 서치어드바이저 소유확인 + 사이트맵·RSS 제출
- 다국어면 hreflang 연결
- 색인은 기다리고, 글은 계속 쌓는다
결국 검색 노출의 토대는 “기계가 읽고 이해할 수 있는 정적 페이지 + 발견 경로 등록”이다. 나머지는 좋은 글을 꾸준히 쌓는 일이 한다.