Next.js 배포 후 SEO 설정 가이드 — 구글에 뜨게 만드는 5단계 (2026)

이 글로 얻는 것
Next.js 사이트를 Vercel에 배포한 직후 구글 검색에 뜨도록 만드는 Next.js SEO 설정 흐름을 정리했습니다. 배포부터 색인까지 5단계, app/layout.tsx에 한 번에 정리하는 metadata 7가지, sitemap.ts·robots.ts 파일 한 줄 코드, Google Search Console 등록부터 색인 추적까지. 비전공자분이 하루 안에 끝낼 수 있는 작업과 그 후 1~14일 동안 기다리는 색인 타임라인을 함께 묶었습니다.
📑 목차

 

🎯 배포만 하면 끝이 아닌 이유

Vercel에 배포 버튼을 누르고 my-site.vercel.app가 열리면 일이 끝났다고 느껴지기 쉬워요. 다만 그 시점의 사이트는 본인과 본인이 링크를 보낸 사람만 들어옵니다. 구글 검색에 뜨려면 별도의 한 단계가 더 필요해요. 이 단계가 빠진 채로 한 달이 지나면 본인 사이트는 사실상 인터넷에 없는 사이트와 다름없는 상태가 됩니다.

다행히 Next.js는 SEO에 필요한 도구를 거의 다 기본으로 내장하고 있어요. metadata 객체 하나, sitemap.ts와 robots.ts 두 파일, GSC 등록 한 번이면 검색 노출의 거의 모든 기반이 끝납니다. 이 글에서는 그 흐름을 5단계로 풀고, 단계마다 정상 신호와 함정을 짚어드릴게요. Vercel 배포 자체가 처음이면 Vercel 무료 배포 완전 가이드를 먼저 보시고 오세요.

한 가지 미리 짚어드릴게요. 작업 자체는 하루 안에 끝나지만, 색인은 1~14일이 걸립니다. 결과가 즉시 안 나와도 정상이에요. 본인이 할 일은 첫날 5단계를 정확히 마치고, 그 후 매주 GSC를 한 번씩 들여다보는 게 전부입니다.

 

🧭 배포부터 색인까지 5단계 흐름

전체 그림을 먼저 잡고 가시면 단계 사이에서 길을 잃지 않아요. 5단계 모두 합쳐 작업 시간 30분, 대기 1~14일이 표준 페이스입니다.

Next.js 배포 후 SEO 설정 5단계 흐름 — 1단계 배포 완료 전제 조건, 2단계 metadata 추가 10분, 3단계 sitemap.ts와 robots.ts 생성 5분, 4단계 Google Search Console 등록 10분, 5단계 색인 요청 후 1~14일 대기
1~4단계는 같은 날 끝낼 수 있고, 5단계만 1~14일 기다림이 필요합니다.

각 단계를 깊게 풀어드릴게요. 본인이 어느 단계인지 위 그림에서 위치 확인하시고 해당 섹션부터 읽으셔도 됩니다.

 

🏷 app/layout.tsx — metadata 7가지

Next.js App Router의 핵심은 app/layout.tsx에 metadata 객체 하나만 정의하면 사이트 전체의 검색 결과·SNS 공유 모양이 결정된다는 점이에요. 7가지 키만 알아두시면 됩니다.

Next.js metadata 7가지 체크리스트 — title, description, openGraph, twitter, canonical, robots, metadataBase — app/layout.tsx에 한 객체로 모두 정리하는 방식
이 7가지가 검색 결과·SNS 공유·중복 URL 처리 모두를 한 번에 결정합니다.

 

한꺼번에 보는 코드

// app/layout.tsx
import type { Metadata } from 'next'

export const metadata: Metadata = {
  metadataBase: new URL('https://my-site.com'),
  title: {
    default: '내 사이트 — 한 줄 슬로건',
    template: '%s | 내 사이트'
  },
  description: '본인 사이트가 무엇을 제공하는지 150~160자 설명. 행동 유도 표현 포함.',
  openGraph: {
    title: '내 사이트',
    description: '...',
    url: 'https://my-site.com',
    siteName: '내 사이트',
    images: ['/og.png'],
    locale: 'ko_KR',
    type: 'website'
  },
  twitter: {
    card: 'summary_large_image',
    title: '내 사이트',
    description: '...',
    images: ['/og.png']
  },
  alternates: {
    canonical: 'https://my-site.com'
  },
  robots: {
    index: true,
    follow: true
  }
}

 

각 키의 역할 한 줄씩

역할 안 넣으면
metadataBase 상대 경로를 절대 URL로 자동 변환 OG 이미지 깨짐
title 검색 결과 파란 글씨 “localhost:3000” 같은 기본값 노출
description 검색 결과 회색 설명 구글이 본문에서 임의 발췌
openGraph SNS 공유 시 카드 모양 썸네일 없는 휑한 링크
twitter 트위터·X 공유 카드 OG 폴백되지만 부정확
alternates.canonical 중복 URL의 정식 주소 1개 SEO 점수 분산
robots 크롤링·색인 허용 여부 기본 허용이라 안 넣어도 OK

비전공자분이 처음에 챙기실 4개는 metadataBase, title, description, openGraph.images예요. 나머지는 첫 한 달 후에 추가해도 늦지 않습니다.

 

🗺 sitemap.ts + robots.ts 한 번에 만들기

sitemap.xml은 본인 사이트의 모든 URL을 구글에 알려주는 지도, robots.txt는 어느 페이지를 크롤링해도 되는지 알려주는 안내문이에요. Next.js App Router에서는 두 파일 모두 코드로 한 줄 작성하면 빌드 시 자동 생성됩니다.

 

app/sitemap.ts

// app/sitemap.ts
import type { MetadataRoute } from 'next'

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: 'https://my-site.com',
      lastModified: new Date(),
      changeFrequency: 'weekly',
      priority: 1.0
    },
    {
      url: 'https://my-site.com/about',
      lastModified: new Date(),
      changeFrequency: 'monthly',
      priority: 0.8
    }
  ]
}

블로그처럼 페이지가 동적으로 생성된다면 본인의 글 목록을 가져와 map으로 펼치시면 돼요. app/sitemap.ts가 빌드 시 my-site.com/sitemap.xml로 자동 노출됩니다.

 

app/robots.ts

// app/robots.ts
import type { MetadataRoute } from 'next'

export default function robots(): MetadataRoute.Robots {
  return {
    rules: {
      userAgent: '*',
      allow: '/',
      disallow: ['/api/', '/admin/']
    },
    sitemap: 'https://my-site.com/sitemap.xml'
  }
}

이 두 파일만 추가하고 git push하면 Vercel이 자동 재배포 후 my-site.com/sitemap.xmlmy-site.com/robots.txt가 즉시 살아나요. 정상 신호는 두 URL을 브라우저에서 직접 열었을 때 XML과 텍스트가 보이는 모습입니다.

💡 동적 페이지 sitemap 자동 채우기
블로그·상품 목록처럼 새 글이 자주 추가되는 사이트는 sitemap.ts에서 DB나 콘텐츠 폴더를 직접 읽어 URL 목록을 자동 생성하시면 됩니다. 예를 들어 MDX 글 폴더를 fs.readdirSync로 읽어 map으로 펼치는 식이에요. 이 방식을 쓰면 새 글을 발행할 때마다 sitemap이 자동 갱신돼서 별도 관리가 필요 없습니다.

 

🔎 Google Search Console 등록 5단계

sitemap이 살아 있어도 구글에 “여기 있어요”라고 알려주는 단계가 추가로 필요해요. 그 역할이 Google Search Console(GSC) 등록입니다.

 

1단계 — 속성 추가

search.google.com/search-console로 들어가서 “속성 추가” 버튼 클릭. 두 가지 옵션이 나오는데 비전공자분 첫 사이트면 “URL 접두어”가 단순합니다. 본인 도메인(예: https://my-site.com)을 그대로 입력하세요.

 

2단계 — 소유권 확인

구글이 “이 사이트가 정말 본인 것인지” 확인하는 과정입니다. 가장 쉬운 방법은 HTML 태그 방식이에요. 구글이 보여주는 메타 태그를 복사해 본인 app/layout.tsx의 metadata 객체에 추가합니다.

// app/layout.tsx — verification 추가
export const metadata: Metadata = {
  // ... 기존 키들 ...
  verification: {
    google: 'abc123...'  // 구글이 준 코드
  }
}

git push 후 Vercel 자동 재배포가 끝나면 GSC에서 “확인” 버튼을 누르세요. 정상 신호는 “소유권 확인됨” 초록색 알림입니다.

 

3단계 — sitemap 제출

좌측 메뉴 → Sitemaps → 새 사이트맵 추가. 입력란에 sitemap.xml만 입력하면 끝(앞에 도메인은 자동 추가됨). 정상 신호는 며칠 안에 “성공” 상태와 함께 발견된 URL 개수가 표시되는 모습이에요.

 

4단계 — URL 검사로 색인 가속

좌측 상단 검색창에 본인 메인 페이지 URL을 입력 → “색인 생성 요청” 버튼 클릭. 자동 색인을 기다리지 않고 우선 처리 큐에 넣는 방식이에요. 한 페이지당 하루 1~2회 정도가 권장 한도입니다.

 

5단계 — 매주 1회 색인 보고서 확인

좌측 메뉴 → 색인 → 페이지에서 색인된 페이지 수와 색인 안 된 페이지 수를 확인합니다. 색인 안 된 이유가 표시되니 매주 1회씩 들여다보면서 문제를 발견하면 즉시 수정하세요. 흔한 원인은 noindex 메타 태그나 robots.txt의 disallow 설정입니다.

 

⏰ 색인까지 평균 타임라인

“내 사이트가 언제 검색에 뜨나”가 가장 자주 받는 질문이에요. 평균 타임라인을 단계별로 정리했습니다.

Next.js 사이트 색인 평균 타임라인 — D-Day 0 GSC 등록과 sitemap 제출, 1일 후 첫 페이지 색인, 1주 후 대부분 색인, 2주 후 검색 결과 노출, 1개월 후 검색 순위 안정화
색인까지 1~14일이 표준이고, 검색 순위 안정화는 1개월 이상 걸립니다.

 

색인 확인 한 줄 명령

본인 사이트가 구글에 색인됐는지 한 번에 보는 방법은 구글 검색창에 다음을 입력하는 거예요.

site:my-site.com

이 명령은 구글이 색인한 본인 사이트의 페이지를 모두 보여줍니다. 첫 등록 1일 후엔 1~3개, 1주 후엔 대부분 페이지가 보이는 게 정상이에요. 1주가 지나도 0개라면 GSC의 “색인 안 됨” 보고서를 다시 확인하세요.

 

🖼 OG 이미지 — SNS 공유 카드

본인 사이트 링크를 카카오톡·트위터·페이스북에 공유했을 때 보이는 미리보기 카드가 OG(Open Graph) 이미지예요. 이게 없으면 휑한 링크만 뜨고, 있으면 깔끔한 카드가 뜹니다. 클릭률 차이가 두세 배까지 나는 영역이라 꼭 챙기세요.

 

방법 1 — 정적 PNG 이미지

가장 단순한 방법이에요. 1200×630 픽셀 PNG·JPG·WebP 이미지를 public/og.png에 두고 metadata에 경로만 적으면 끝입니다.

// app/layout.tsx
openGraph: {
  images: ['/og.png']  // public/og.png 자동 인식
}

 

방법 2 — 동적 OG 이미지 (Next.js 내장)

블로그처럼 글마다 다른 OG 이미지가 필요하면 Next.js의 ImageResponse API가 빠릅니다. app/api/og/route.tsx에 짧은 React 컴포넌트를 만들면 글 제목·요약을 받아 자동으로 OG 이미지를 생성해요.

// app/api/og/route.tsx (간단 예시)
import { ImageResponse } from 'next/og'

export async function GET(req: Request) {
  const { searchParams } = new URL(req.url)
  const title = searchParams.get('title') ?? '내 사이트'
  return new ImageResponse(
    <div style={{ fontSize: 64, padding: 80 }}>{title}</div>,
    { width: 1200, height: 630 }
  )
}

각 글 페이지의 metadata에서 openGraph.images: ['/api/og?title=...']로 경로를 적으면 글마다 다른 OG 이미지가 자동 생성됩니다. 정상 신호는 페이스북 디버거(developers.facebook.com/tools/debug)에 본인 URL을 넣었을 때 카드 미리보기가 정확히 뜨는 모습이에요.

검색에 띄울 사이트가 아직 없다면 바이브코딩 프로젝트 아이디어 10가지로 먼저 만들 거리를 정해 보세요.

 

🚫 절대 하지 말아야 할 3가지

SEO 작업에서 빠지기 쉬운 3가지 함정이 있어요. 한 번이라도 들어가면 검색 노출이 통째로 막힐 수 있습니다.

 

1. robots.ts에 disallow: ‘/’ 남겨두기

개발 중에 사이트 노출을 막으려고 disallow: '/'를 적었다가 production에 그대로 push하는 케이스예요. 이 한 줄로 사이트 전체가 구글에서 사라집니다. 배포 전에 반드시 allow: '/'로 바뀌었는지 확인하세요. Vercel 배포 실패 글의 진단 흐름을 같이 활용하시면 좋아요.

 

2. metadata 없이 도메인만 바꾸기

본인 도메인(my-site.com)을 사고 Vercel에 연결만 한 채로 metadataBase를 my-site.vercel.app로 두면 OG 이미지가 깨집니다. 도메인 변경 후 반드시 metadataBase도 함께 업데이트하시고 git push 하세요.

 

3. 색인 결과를 1주 안에 판단

새 사이트는 첫 1주는 검색 트래픽이 거의 0인 게 정상입니다. “왜 뜨지 않지?” 하고 매일 확인해도 변화가 안 보여요. 첫 한 달은 작업만 정확히 해두시고 결과는 한 달 후에 보세요. 1개월 시점부터 색인된 페이지 수와 평균 순위를 비교해보면 진짜 흐름이 보입니다.

 

🚀 한 단계 더 — 구조화 데이터·다국어

위 5단계가 끝났다면 본인 사이트는 검색 노출의 기본이 끝난 상태예요. 한 단계 더 나아가고 싶다면 두 가지 영역이 효과 큽니다.

 

구조화 데이터 (JSON-LD)

구글에게 “이 페이지는 블로그 글이고 작성자는 누구이며 발행일은 언제다”를 명시적으로 알려주는 방식이에요. 제대로 적용하면 검색 결과에 별점·작성자 사진·발행일 같은 추가 요소가 붙어서 클릭률이 올라갑니다. JSON-LD를 script 태그 안에 넣어 layout이나 page에 추가하시면 돼요.

// app/blog/[slug]/page.tsx — Article 스키마 예시
<script type="application/ld+json">
  {JSON.stringify({
    '@context': 'https://schema.org',
    '@type': 'Article',
    headline: post.title,
    author: { '@type': 'Person', name: '작성자' },
    datePublished: post.date
  })}
</script>

 

다국어 SEO (hreflang)

한국어·영어 두 버전을 가진 사이트라면 alternates.languages로 각 언어 버전을 명시하시는 게 안전합니다. 안 적으면 구글이 두 언어 페이지를 중복으로 처리해 두 언어 모두 순위가 안 올라가요.

alternates: {
  languages: {
    'ko-KR': '/ko',
    'en-US': '/en'
  }
}

다국어가 필요하시면 바이브코딩 블로그 만들기 Next.js+MDX 글의 next-intl 부분을 같이 보시면 도움됩니다.

 

🪧 면책 조항

이 글은 2026년 4월 기준 Next.js 15·16 App Router의 SEO 관련 API와 Google Search Console의 동작을 토대로 작성되었습니다. Next.js의 metadata API와 sitemap·robots 파일 규칙은 버전마다 일부 차이가 있으니 결정 전에는 Next.js 공식 문서를 확인해주세요. Pages Router를 쓰시는 경우엔 next/head와 별도 sitemap 라이브러리를 써야 합니다. 색인 속도와 검색 순위는 사이트 콘텐츠 품질·도메인 연식·외부 링크 수 등 여러 요소에 영향을 받으므로, 본 글의 타임라인은 평균 추정치로 참고해주세요.

오늘 안에 본인 Next.js 프로젝트의 app/layout.tsx를 한 번만 열어보세요. metadata 7가지 중 빠진 게 있다면 그 한 번이 한 달 후 검색 트래픽의 출발점이 됩니다.

 

❓ FAQ

질문을 누르면 답변이 펼쳐집니다.

 

🔰 처음 시작하기 전 궁금한 것들

Q. 도메인을 안 사고 vercel.app 주소로도 SEO가 되나요?
기술적으로는 됩니다. 다만 vercel.app 도메인은 같은 도메인을 다른 사용자가 공유하는 형태라 검색 순위에서 약점이 있어요. 본인 도메인(예: 1daymillion.com)을 사고 연결하시는 게 장기적으로 훨씬 강합니다. 도메인은 보통 연 1~2만 원이고 Namecheap·Cloudflare·가비아에서 구매할 수 있어요.
Q. metadata는 글마다 다르게 적어야 하나요?
네, 글이나 페이지마다 다르게 적는 게 가장 효과적입니다. app/layout.tsx에는 사이트 전체 기본값을, 각 page.tsx에는 그 페이지 고유의 metadata를 추가하시면 자동으로 덮어써져요. 글 제목·설명·OG 이미지를 페이지마다 맞추시면 검색 결과 클릭률이 두세 배 올라가는 케이스가 많습니다.
Q. App Router가 아니라 Pages Router인데 어떻게 하나요?
Pages Router는 next/head 컴포넌트로 메타 태그를 직접 적고, sitemap은 next-sitemap 같은 라이브러리를 쓰셔야 합니다. App Router로 마이그레이션할 계획이 있으시면 SEO 작업을 그 시점에 한 번에 정리하시는 게 효율적이에요. 마이그레이션 안 할 거면 pages/_document.tsx에서 metadata를 정리하시면 됩니다.

 

🛠 작업 중 자주 마주치는 상황

Q. sitemap.xml에 들어가도 빈 화면만 나옵니다
세 가지를 차례로 보세요. 첫째, app/sitemap.ts 파일이 정확한 위치에 있는지(src/app/sitemap.ts가 아님). 둘째, 빌드가 정상 통과했는지(빌드 실패 시 sitemap이 생성 안 됨). 셋째, 캐시일 수 있으니 시크릿 창에서 다시 열어보세요. 셋 다 OK인데도 안 나오면 npm run buildnpm run start로 로컬에서 한 번 검증하세요.
Q. GSC 소유권 확인이 자꾸 실패합니다
메타 태그를 추가한 후 git push → Vercel 재배포가 완료된 후 확인 버튼을 누르셔야 합니다. push 직후 즉시 누르면 배포 전이라 실패해요. Vercel 대시보드에서 “Ready” 상태를 확인하시고 다시 시도하세요. 그래도 실패하면 시크릿 창에서 본인 사이트 페이지 소스 보기로 메타 태그가 실제로 출력되는지 확인하세요.
Q. OG 이미지가 카카오톡에선 안 보여요
카카오톡은 자체 캐시가 있어서 OG 이미지를 캐시에 잡으면 한동안 못 풉니다. 카카오톡 디버거(developers.kakao.com/tools/debugger/sharing)에서 본인 URL을 입력하고 “캐시 초기화” 버튼을 누르세요. 그 후 카카오톡에서 다시 공유해보면 새 이미지가 보입니다. 이 과정은 페이스북·트위터도 비슷하게 자체 디버거가 있어요.
Q. 색인 생성 요청 버튼이 회색으로 비활성화돼요
하루 한도가 차면 회색으로 변합니다. 한 페이지당 하루 1~2회가 권장 한도예요. 다음 날 다시 시도하시면 됩니다. 또는 색인 요청 없이도 sitemap 제출만으로 며칠 안에 자동 색인되니, 급한 경우 아니면 자연 색인을 기다리시는 게 정상 흐름입니다.

 

🚀 그 다음 단계

Q. SEO 점수를 어떻게 측정하나요?
두 도구를 추천합니다. 첫째, PageSpeed Insights(pagespeed.web.dev) — Core Web Vitals와 SEO 점수를 한 번에 확인. 둘째, GSC의 “검색 결과” 보고서 — 실제 노출·클릭·평균 순위를 시간별로 추적. 둘을 매주 1회씩 보면서 점수가 떨어진 페이지를 우선 손보시면 됩니다.
Q. 검색 순위를 빠르게 올릴 방법이 있나요?
정직한 답은 “없다”예요. 빠른 SEO를 약속하는 외부 서비스는 거의 다 black hat 기법이라 결국 구글에서 제재 받습니다. 합리적 가속은 세 가지뿐이에요. 첫째, 다른 사이트에서 본인 사이트로 자연 링크가 들어오게 만들기(좋은 콘텐츠 발행). 둘째, 같은 주제의 글을 꾸준히 발행해 토픽 권위 쌓기. 셋째, Core Web Vitals 점수 개선. 셋 다 1~3개월 단위 작업입니다.
Q. 구조화 데이터를 비전공자가 직접 짤 수 있나요?
충분히 가능합니다. AI에게 “내 블로그 글 페이지에 적용할 Article schema JSON-LD를 짜주세요. 제목은 X, 작성자는 Y, 발행일은 Z입니다”를 시키면 거의 정확한 답이 돌아와요. 작성 후엔 schema.org/validator나 search.google.com/test/rich-results에서 검증하세요. 한 번 만들면 모든 글에 자동 적용되니 시간 투자 가성비가 좋습니다.

🚀 SEO 설정 전 환경 세팅부터
Git·Node.js·VS Code 설치부터 첫 Vercel 배포까지 — 복사 붙여넣기만으로 끝.
VibeStart에서 무료로 환경 세팅하기 →

 

🔗 관련 글

 

📑 참고 자료

위로 스크롤