Next.js 블로그 만들기 — 검색엔진 등록 4종 완전 정복

9 min read
SEO검색엔진Next.js
Next.js 블로그 만들기 — 검색엔진 등록 4종 완전 정복

블로그를 만들었는데 검색이 안 된다

블로그를 배포하고 며칠 뒤 구글에서 사이트 이름을 검색해봤다. 결과가 없다. 당연하다. 검색엔진은 새로 생긴 사이트를 자동으로 찾아주지 않는다.

검색에 노출되려면 직접 등록해야 한다. 주요 검색엔진 4곳에 등록하는 과정을 정리했다.

검색엔진서비스명URL
GoogleSearch Consolesearch.google.com/search-console
BingWebmaster Toolsbing.com/webmasters
Naver서치어드바이저searchadvisor.naver.com
Daum검색등록register.search.daum.net

사전 준비: sitemap.xml과 RSS 피드

검색엔진에 등록할 때 공통적으로 필요한 게 두 가지 있다.

sitemap.xml

사이트의 모든 페이지 목록을 알려주는 파일이다. 이전 글(Cloudflare Pages로 이전하기)에서 빌드 시 자동 생성하도록 구성했다.

https://tera-log.pages.dev/sitemap.xml

RSS 피드 (feed.xml)

블로그 포스트를 구독할 수 있는 피드다. Next.js의 Route Handler로 생성했다.

src/app/feed.xml/route.ts
import { getAllPostMetas } from '@/lib/posts'
import { SITE_CONFIG } from '@/lib/constants'
 
export const dynamic = 'force-static'
 
function escapeXml(str: string): string {
  return str
    .replace(/&/g, '&')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&apos;')
}
 
export function GET() {
  const posts = getAllPostMetas()
 
  const items = posts
    .map(
      (post) => `    <item>
      <title>${escapeXml(post.title)}</title>
      <link>${SITE_CONFIG.url}/posts/${post.slug}</link>
      <guid>${SITE_CONFIG.url}/posts/${post.slug}</guid>
      <description>${escapeXml(post.description)}</description>
      <pubDate>${new Date(post.date).toUTCString()}</pubDate>
      <category>${escapeXml(post.category)}</category>
    </item>`
    )
    .join('\n')
 
  const xml = `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>${escapeXml(SITE_CONFIG.title)}</title>
    <link>${SITE_CONFIG.url}</link>
    <description>${escapeXml(SITE_CONFIG.description)}</description>
    <language>ko</language>
    <lastBuildDate>${new Date().toUTCString()}</lastBuildDate>
    <atom:link href="${SITE_CONFIG.url}/feed.xml" rel="self" type="application/rss+xml"/>
    ${items}
  </channel>
</rss>`
 
  return new Response(xml, {
    headers: { 'Content-Type': 'application/xml; charset=utf-8' },
  })
}

output: 'export' 환경에서는 export const dynamic = 'force-static'이 필수다. 없으면 빌드 시 에러가 난다.

빌드하면 out/feed.xml/index.html로 생성되고, Cloudflare Pages에서 https://tera-log.pages.dev/feed.xml로 접근할 수 있다.

robots.txt

검색엔진 크롤러에게 sitemap 위치를 알려주는 역할도 한다. public/ 디렉토리에 넣으면 된다.

public/robots.txt
User-agent: *
Allow: /
 
Sitemap: https://tera-log.pages.dev/sitemap.xml

1. Google Search Console

가장 중요한 검색엔진. 전 세계 검색 점유율 90% 이상이다.

사이트 등록

  1. Search Console 접속
  2. URL 접두어 방식 선택 → https://tera-log.pages.dev 입력
  3. 소유권 확인 — *.pages.dev 도메인은 DNS 인증이 불가하므로 HTML 파일 업로드 방식을 사용한다

구글이 제공하는 googleXXXXXXX.html 파일을 public/ 디렉토리에 넣고 배포하면 인증이 완료된다.

사이트 이름 문제

등록 후 검색 결과에서 사이트 이름이 Cloudflare로 표시될 수 있다. pages.dev 도메인 때문에 구글이 Cloudflare 사이트로 오인하는 것이다.

이를 해결하기 위해 두 가지를 추가했다.

메타데이터 보강:

src/app/layout.tsx
export const metadata: Metadata = {
  // ...
  applicationName: SITE_CONFIG.title, // 'teralog'
  openGraph: {
    // ...
    siteName: SITE_CONFIG.title,
  },
}

JSON-LD 구조화 데이터:

src/app/layout.tsx
<head>
  <script
    type="application/ld+json"
    dangerouslySetInnerHTML={{
      __html: JSON.stringify({
        '@context': 'https://schema.org',
        '@type': 'WebSite',
        name: SITE_CONFIG.title,
        url: SITE_CONFIG.url,
      }),
    }}
  />
</head>

applicationName은 HTML <meta> 태그로 렌더링되고, JSON-LD는 구글이 사이트 이름을 판별할 때 직접적으로 참고하는 구조화 데이터다. 두 가지를 함께 설정하면 구글이 사이트 이름을 올바르게 인식할 확률이 높아진다.

sitemap 제출

Search Console > Sitemaps 메뉴에서 sitemap.xml을 제출한다. 구글이 크롤링하고 인덱싱하는 데 며칠에서 몇 주 걸릴 수 있다.

2. Bing Webmaster Tools

Bing은 점유율이 낮지만, Microsoft Edge 기본 검색엔진이고 ChatGPT의 웹 검색에도 Bing 인덱스가 사용된다. 등록해두면 손해 볼 것 없다.

사이트 등록 및 인증

  1. Bing Webmaster Tools 접속
  2. URL을 수동으로 추가 선택 → https://tera-log.pages.dev 입력
  3. 인증 방식: HTML 메타 태그 선택

Bing이 제공하는 메타 태그를 Next.js Metadata API로 추가한다:

src/app/layout.tsx
export const metadata: Metadata = {
  // ...
  verification: {
    other: {
      'msvalidate.01': '인증코드',
    },
  },
}

빌드하면 <meta name="msvalidate.01" content="인증코드" /><head>에 렌더링된다.

sitemap과 RSS 제출

Bing Webmaster Tools에서 두 가지를 제출할 수 있다:

  • Sitemaps 메뉴: https://tera-log.pages.dev/sitemap.xml
  • RSS 제출: https://tera-log.pages.dev/feed.xml

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

국내 검색 점유율 1위. 한국어 블로그라면 반드시 등록해야 한다.

사이트 등록 및 인증

  1. 서치어드바이저 접속
  2. 웹마스터 도구 > 사이트 관리 > 사이트 등록
  3. https://tera-log.pages.dev 입력
  4. 인증 방식: HTML 태그 선택

네이버가 제공하는 인증 메타 태그를 추가한다:

src/app/layout.tsx
export const metadata: Metadata = {
  // ...
  verification: {
    other: {
      'naver-site-verification': '인증코드',
      'msvalidate.01': '인증코드',
    },
  },
}

sitemap과 RSS 제출

인증 완료 후 요청 메뉴에서:

  • 사이트맵 제출: https://tera-log.pages.dev/sitemap.xml
  • RSS 제출: https://tera-log.pages.dev/feed.xml

네이버는 RSS 피드를 통해 새 글을 더 빠르게 수집하므로, sitemap과 RSS 모두 제출하는 것이 좋다.

4. 다음 검색등록

카카오(다음) 검색에도 노출되려면 별도 등록이 필요하다. 다른 검색엔진과 달리 인증 과정이 없어서 가장 간단하다.

등록 방법

  1. 다음 검색등록 접속
  2. 블로그 등록 선택
  3. URL 입력: https://tera-log.pages.dev
  4. 제출

별도의 소유권 인증이나 메타 태그 추가가 필요 없다. 신청 후 검수를 거쳐 등록된다.

최종 layout.tsx 메타데이터

4개 검색엔진 등록을 위해 추가한 메타데이터를 정리하면 이렇다:

src/app/layout.tsx
export const metadata: Metadata = {
  title: {
    default: SITE_CONFIG.title,
    template: `%s | ${SITE_CONFIG.title}`,
  },
  description: SITE_CONFIG.description,
  applicationName: SITE_CONFIG.title,
  icons: {
    icon: `${BASE_PATH}/images/favicon.png`,
  },
  openGraph: {
    title: SITE_CONFIG.title,
    description: SITE_CONFIG.description,
    type: 'website',
    locale: 'ko_KR',
    siteName: SITE_CONFIG.title,
    url: SITE_CONFIG.url,
  },
  verification: {
    other: {
      'naver-site-verification': '인증코드',
      'msvalidate.01': '인증코드',
    },
  },
}
속성용도
applicationName구글 사이트 이름 인식
openGraph.siteNameOG 메타에서 사이트명 명시
verification.other네이버, Bing 소유권 인증

여기에 <head>의 JSON-LD 구조화 데이터까지 더하면, 검색엔진이 사이트를 정확하게 식별할 수 있다.

등록 후 체크리스트

등록만 하면 끝이 아니다. 며칠 후 다시 돌아와서 확인해야 할 것들이 있다.

  • Google: Search Console > 실적 탭에서 노출 수 확인. URL 검사로 개별 페이지 인덱싱 상태 확인
  • Bing: Webmaster Tools > 사이트 활동에서 크롤링 상태 확인
  • 네이버: 서치어드바이저 > 콘텐츠 확산 > 수집 현황에서 페이지 수집 여부 확인
  • 다음: site:tera-log.pages.dev로 검색하여 인덱싱 여부 확인

구글은 보통 며칠이면 인덱싱되지만, 네이버와 다음은 수 주 이상 걸릴 수 있다. 새 글을 올릴 때마다 Search Console의 URL 검사에서 색인 생성 요청을 하면 반영이 빨라진다.

관심 있을 만한 포스트

Next.js 블로그 만들기 — 정적 블로그에 맞춤 추천 포스트 기능 추가

localStorage에 조회 이력을 저장하고, 태그 가중치 스코어링으로 정적 블로그에서도 개인화 추천을 구현하는 방법.

Next.jslocalStorage

Next.js 블로그 만들기 — GitHub Pages에서 Cloudflare Pages로 이전하기

GitHub Pages의 한계를 넘어 Cloudflare Pages로 블로그를 이전한 과정. 비교, 설정, SEO까지 한 번에 정리.

Cloudflare배포

Next.js 블로그 만들기 — 정적 블로그에 검색 기능 추가

빌드 타임 검색 인덱스 생성과 클라이언트 사이드 필터링으로 정적 블로그에 검색 기능을 구현하기. Cmd+K 단축키, 오버레이 UI까지.

검색UX

Next.js 블로그 만들기 — 카드 그리드와 포스트 상세 페이지

Velog 스타일 카드 UI와 MDX 렌더링 상세 페이지 구현. 반응형 그리드, SEO 메타데이터, 정적 사이트 생성까지.

Next.jsReact

Next.js 15로 개인 블로그 만들기 — 프로젝트 셋업

왜 직접 블로그를 만들었는지, 기술 스택 선정 이유와 프로젝트 초기 구성까지. Next.js 15 + Tailwind CSS v4 + MDX 기반 블로그의 시작.

Next.js블로그

Bun vs Node.js vs Deno — 뭐가 다른지, 그래서 뭘 쓰면 좋은지 (2026 기준)

런타임 3대장 비교: 호환성(Node), 속도/번들(Bun), 올인원/보안(Deno). 팀/프로덕트 상황별 선택 기준과 체크리스트까지 정리.

BunNode.js

번들러(Bundle)란 뭐고, 왜 필요할까? — 요즘 번들러/빌드 툴 비교 가이드

번들러의 역할(모듈/의존성/트랜스파일/최적화)을 쉽게 설명하고, Vite·Rollup·esbuild·Webpack·Rspack·Turbopack 같은 도구를 상황별로 비교합니다.

BundlerVite

Claude Code 에이전트 팀 — 여러 AI가 협업하는 새로운 방식

Claude Code의 실험적 기능인 에이전트 팀을 정리했다. 여러 Claude 인스턴스가 리더-팀원 구조로 작업을 분담하고, 서로 메시지를 주고받으며 병렬로 협업하는 구조다.

Claude CodeAI