{"componentChunkName":"component---src-templates-blog-post-js","path":"/etc/도메인-만료로-블로그가-사라졌다-새-도메인-이전-SEO-애드센스-체크리스트/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"80acff6c-dd4b-59af-8d5b-9c15857b7a3d","excerpt":"블로그 분석을 하다가 이상한 점을 발견했다. 로 홈페이지를 요청하니 TLS 인증서 오류가 났고, 인증서 검사를 끄고 다시 요청하니 “만료된 도메인 · Expired Domain…","html":"<p>블로그 분석을 하다가 이상한 점을 발견했다. <code class=\"language-text\">curl</code>로 홈페이지를 요청하니 TLS 인증서 오류가 났고, 인증서 검사를 끄고 다시 요청하니 <strong>“만료된 도메인 · Expired Domain”</strong> 이라는 안내 페이지가 돌아왔다. 그 페이지에는 <code class=\"language-text\">&lt;meta name=\"robots\" content=\"noindex, nofollow\"></code>까지 붙어 있었다. 검색엔진에는 “이 사이트는 색인하지 마라”는 신호를, 방문자에게는 보안 경고를, 애드센스에는 광고를 낼 곳이 없다는 결과를 동시에 주고 있었던 셈이다.</p>\n<p>이 글은 도메인 만료를 진단하고, 복구 대신 새 도메인(<code class=\"language-text\">bottlehs.dev</code>)으로 이전하면서 <strong>검색 노출과 애드센스를 최대한 빨리 되살리기 위해 한 일</strong>을 순서대로 정리한 기록이다. 같은 일을 겪는 사람이 그대로 따라 할 수 있도록 명령어와 코드를 함께 남긴다.</p>\n<h2 id=\"증상-내-브라우저에서는-멀쩡한데\" style=\"position:relative;\"><a href=\"#%EC%A6%9D%EC%83%81-%EB%82%B4-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C%EB%8A%94-%EB%A9%80%EC%A9%A1%ED%95%9C%EB%8D%B0\" aria-label=\"증상 내 브라우저에서는 멀쩡한데 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>증상: “내 브라우저에서는 멀쩡한데?”</h2>\n<p>가장 헷갈렸던 부분은 <strong>운영자 본인의 브라우저에서는 사이트가 정상으로 보였다</strong>는 점이다. 이 블로그는 Gatsby의 <code class=\"language-text\">gatsby-plugin-offline</code>을 쓰고 있어서 서비스 워커가 페이지를 캐시한다. 한 번 방문한 브라우저는 네트워크가 실패해도 캐시된 앱 셸과 페이지를 보여 줄 수 있다. 그래서 “사이트가 죽었다”는 사실을 운영자가 가장 늦게 알게 되는 구조가 된다.</p>\n<p>도메인 상태를 확인할 때는 다음 중 하나로 봐야 한다.</p>\n<ul>\n<li>시크릿 창(서비스 워커와 캐시가 없는 상태)</li>\n<li>휴대폰 LTE 등 다른 네트워크</li>\n<li>터미널의 <code class=\"language-text\">curl</code>, <code class=\"language-text\">dig</code>, <code class=\"language-text\">whois</code></li>\n</ul>\n<h2 id=\"진단-dig와-whois로-원인-좁히기\" style=\"position:relative;\"><a href=\"#%EC%A7%84%EB%8B%A8-dig%EC%99%80-whois%EB%A1%9C-%EC%9B%90%EC%9D%B8-%EC%A2%81%ED%9E%88%EA%B8%B0\" aria-label=\"진단 dig와 whois로 원인 좁히기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>진단: dig와 whois로 원인 좁히기</h2>\n<h3 id=\"1-네임서버부터-확인한다\" style=\"position:relative;\"><a href=\"#1-%EB%84%A4%EC%9E%84%EC%84%9C%EB%B2%84%EB%B6%80%ED%84%B0-%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4\" aria-label=\"1 네임서버부터 확인한다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 네임서버부터 확인한다</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">dig</span> +short NS bottlehs.com\n<span class=\"token comment\"># expired-domain-1.ns.eliv-dns.kr.</span>\n<span class=\"token comment\"># expired-domain-2.ns.eliv-dns.kr.</span></code></pre></div>\n<p>네임서버 이름에 <code class=\"language-text\">expired-domain</code>이 들어 있다. 등록기관이 만료된 도메인의 네임서버를 자기 주차 서버로 바꿔 놓은 것이다. 로컬 DNS 캐시 문제가 아닌지 확인하려면 공용 DNS와 <strong>레지스트리 원본</strong>까지 물어본다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># 공용 DNS 여러 곳</span>\n<span class=\"token function\">dig</span> @8.8.8.8 +short NS bottlehs.com\n<span class=\"token function\">dig</span> @1.1.1.1 +short NS bottlehs.com\n\n<span class=\"token comment\"># .com 레지스트리(권한 서버)에 직접 질의 — 여기서도 같으면 캐시 문제가 아니다</span>\n<span class=\"token function\">dig</span> @a.gtld-servers.net NS bottlehs.com +norec</code></pre></div>\n<h3 id=\"2-whois로-만료일을-확인한다\" style=\"position:relative;\"><a href=\"#2-whois%EB%A1%9C-%EB%A7%8C%EB%A3%8C%EC%9D%BC%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4\" aria-label=\"2 whois로 만료일을 확인한다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. whois로 만료일을 확인한다</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">whois bottlehs.com <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token parameter variable\">-iE</span> <span class=\"token string\">'expir|name server|updated'</span></code></pre></div>\n<p>이때 <strong>레지스트리 만료일</strong>과 <strong>등록기관 만료일</strong>이 다르게 나올 수 있다. 레지스트리는 만료 직후 자동으로 1년을 연장해 두고(Auto-Renew Grace), 등록기관이 유예 기간 안에 그 연장을 취소하거나 확정하는 방식으로 운영되는 경우가 많기 때문이다. 레지스트리 만료일이 미래로 나온다고 해서 “아직 내 도메인”이라고 판단하면 안 된다. <strong>등록기관의 만료일과 네임서버 상태</strong>를 기준으로 본다.</p>\n<h3 id=\"3-호스팅-쪽에서도-확인한다\" style=\"position:relative;\"><a href=\"#3-%ED%98%B8%EC%8A%A4%ED%8C%85-%EC%AA%BD%EC%97%90%EC%84%9C%EB%8F%84-%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4\" aria-label=\"3 호스팅 쪽에서도 확인한다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 호스팅 쪽에서도 확인한다</h3>\n<p>Vercel에 연결된 도메인이라면 CLI로 상태를 볼 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">vercel domains inspect bottlehs.com</code></pre></div>\n<p>“This Domain is not configured properly”와 함께 현재 네임서버에 ✘ 표시가 나오면, 배포는 정상이고 <strong>도메인이 Vercel을 가리키지 않는 것</strong>이 문제라는 뜻이다.</p>\n<h2 id=\"복구할까-새로-살까\" style=\"position:relative;\"><a href=\"#%EB%B3%B5%EA%B5%AC%ED%95%A0%EA%B9%8C-%EC%83%88%EB%A1%9C-%EC%82%B4%EA%B9%8C\" aria-label=\"복구할까 새로 살까 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>복구할까, 새로 살까</h2>\n<p>도메인이 만료된 뒤에는 대략 다음 단계를 거친다. 기간과 비용은 TLD와 등록기관마다 다르므로 반드시 사용 중인 등록기관의 정책을 확인해야 한다.</p>\n<table>\n<thead>\n<tr>\n<th>단계</th>\n<th>대략적인 기간</th>\n<th>되살리는 방법</th>\n<th>비용</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>갱신 유예(Grace)</td>\n<td>만료 후 수십 일 이내</td>\n<td>일반 갱신</td>\n<td>보통 갱신비 수준</td>\n</tr>\n<tr>\n<td>복구 유예(Redemption)</td>\n<td>이후 약 30일</td>\n<td>복구 신청</td>\n<td>갱신비 + <strong>복구 수수료</strong>(수배 이상일 수 있음)</td>\n</tr>\n<tr>\n<td>삭제 대기(Pending Delete)</td>\n<td>약 5일</td>\n<td>불가</td>\n<td>—</td>\n</tr>\n<tr>\n<td>재등록 가능</td>\n<td>이후</td>\n<td>신규 등록(선점 경쟁)</td>\n<td>신규 등록비</td>\n</tr>\n</tbody>\n</table>\n<p>이번에는 이미 복구 유예 단계여서 복구 비용이 신규 도메인보다 훨씬 비쌌다. 판단 기준은 다음과 같이 정리했다.</p>\n<table>\n<thead>\n<tr>\n<th>기준</th>\n<th>복구가 유리</th>\n<th>새 도메인이 유리</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>외부 백링크</td>\n<td>많고 가치가 크다</td>\n<td>거의 없다</td>\n</tr>\n<tr>\n<td>브랜드 인지도</td>\n<td>도메인 자체가 브랜드다</td>\n<td>이름만 유지하면 된다</td>\n</tr>\n<tr>\n<td>복구 비용</td>\n<td>감당 가능</td>\n<td>신규 대비 과도함</td>\n</tr>\n<tr>\n<td>이미 떨어진 색인</td>\n<td>아직 대부분 남아 있음</td>\n<td>이미 상당 부분 빠짐</td>\n</tr>\n</tbody>\n</table>\n<p>결국 같은 이름에 TLD만 바꾼 <code class=\"language-text\">bottlehs.dev</code>를 새로 샀다. <code class=\"language-text\">.dev</code>는 HSTS preload 목록에 포함된 TLD라 <strong>HTTPS가 강제</strong>되어, 개발 블로그로서 보안 측면의 장점도 있다.</p>\n<h2 id=\"이전-1단계-코드에서-도메인을-한-곳으로-모은다\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EC%A0%84-1%EB%8B%A8%EA%B3%84-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9D%84-%ED%95%9C-%EA%B3%B3%EC%9C%BC%EB%A1%9C-%EB%AA%A8%EC%9D%80%EB%8B%A4\" aria-label=\"이전 1단계 코드에서 도메인을 한 곳으로 모은다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이전 1단계: 코드에서 도메인을 한 곳으로 모은다</h2>\n<p>도메인을 바꾸려고 코드를 검색해 보니 <code class=\"language-text\">bottlehs.com</code>이 여러 파일에 흩어져 있었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">grep</span> <span class=\"token parameter variable\">-rn</span> <span class=\"token string\">\"bottlehs\\.com\"</span> --exclude-dir<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>node_modules,public,.cache,.git<span class=\"token punctuation\">}</span> <span class=\"token builtin class-name\">.</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">gatsby-meta-config.js</code>의 <code class=\"language-text\">siteUrl</code></li>\n<li><code class=\"language-text\">gatsby-config.js</code>의 canonical 플러그인 설정, RSS 피드 <code class=\"language-text\">link</code></li>\n<li><code class=\"language-text\">vercel.json</code>의 리다이렉트 규칙</li>\n<li>레이아웃 푸터 링크</li>\n<li><strong>글 본문 4개에 박힌 절대 URL 내부 링크</strong></li>\n</ul>\n<p>설정은 <code class=\"language-text\">siteUrl</code> 하나만 바꾸면 되도록 모았다. 환경 변수로도 덮어쓸 수 있게 해 두면 프리뷰 환경에서도 유용하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// gatsby-meta-config.js</span>\n<span class=\"token comment\">// 사이트 도메인은 이 값 하나로 관리한다 (canonical·sitemap·RSS·OG·JSON-LD 공통)</span>\n<span class=\"token keyword\">const</span> siteUrl <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">SITE_URL</span> <span class=\"token operator\">||</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://www.bottlehs.dev</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">\\/$</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  siteUrl<span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// gatsby-config.js — 하드코딩 대신 metaConfig 참조</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">resolve</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">gatsby-plugin-canonical-urls</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">siteUrl</span><span class=\"token operator\">:</span> metaConfig<span class=\"token punctuation\">.</span>siteUrl <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></code></pre></div>\n<p>본문의 내부 링크는 <strong>상대 경로</strong>로 바꿨다. 다음에 도메인이 또 바뀌어도 링크가 깨지지 않는다.</p>\n<div class=\"gatsby-highlight\" data-language=\"markdown\"><pre class=\"language-markdown\"><code class=\"language-markdown\"><span class=\"token comment\">&lt;!-- 나쁜 예: 도메인이 바뀌면 전부 죽은 링크가 된다 --></span>\n<span class=\"token url\">[<span class=\"token content\">ES6 화살표 함수</span>](<span class=\"token url\">https://www.bottlehs.com/javascript/es6-arrow-function/</span>)</span>\n\n<span class=\"token comment\">&lt;!-- 좋은 예: 도메인과 무관하게 동작한다 --></span>\n<span class=\"token url\">[<span class=\"token content\">ES6 화살표 함수</span>](<span class=\"token url\">/javascript/es6-arrow-function/</span>)</span></code></pre></div>\n<h2 id=\"이전-2단계-호스팅에-새-도메인-연결\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EC%A0%84-2%EB%8B%A8%EA%B3%84-%ED%98%B8%EC%8A%A4%ED%8C%85%EC%97%90-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0\" aria-label=\"이전 2단계 호스팅에 새 도메인 연결 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이전 2단계: 호스팅에 새 도메인 연결</h2>\n<p>Vercel 프로젝트에 <code class=\"language-text\">bottlehs.dev</code>와 <code class=\"language-text\">www.bottlehs.dev</code>를 추가하고, 루트 도메인은 <code class=\"language-text\">www</code>로 리다이렉트되게 설정했다. DNS는 등록기관(또는 Cloudflare 등 DNS 서비스)에서 Vercel이 안내하는 레코드를 넣으면 된다. 인증서는 Vercel이 자동으로 발급한다.</p>\n<p>연결이 끝나면 반드시 <strong>실제 응답</strong>으로 확인한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">curl</span> <span class=\"token parameter variable\">-sI</span> https://bottlehs.dev <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token parameter variable\">-iE</span> <span class=\"token string\">'^(HTTP|location)'</span>\n<span class=\"token comment\"># HTTP/2 308</span>\n<span class=\"token comment\"># location: https://www.bottlehs.dev/</span>\n\n<span class=\"token function\">curl</span> <span class=\"token parameter variable\">-s</span> <span class=\"token parameter variable\">-o</span> /dev/null <span class=\"token parameter variable\">-w</span> <span class=\"token string\">\"%{http_code}<span class=\"token entity\" title=\"\\n\">\\n</span>\"</span> https://www.bottlehs.dev/\n<span class=\"token comment\"># 200</span></code></pre></div>\n<p>옛 도메인은 호스팅 프로젝트에서 제거했다. 더 이상 내 소유가 아닌 도메인을 붙들고 있을 이유가 없다.</p>\n<h2 id=\"이전-3단계-검색엔진--301-없이-다시-색인받기\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EC%A0%84-3%EB%8B%A8%EA%B3%84-%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84--301-%EC%97%86%EC%9D%B4-%EB%8B%A4%EC%8B%9C-%EC%83%89%EC%9D%B8%EB%B0%9B%EA%B8%B0\" aria-label=\"이전 3단계 검색엔진  301 없이 다시 색인받기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이전 3단계: 검색엔진 — 301 없이 다시 색인받기</h2>\n<p>가장 아쉬운 부분이 여기다. 구글 서치콘솔에는 <strong>주소 변경(Change of Address) 도구</strong>가 있지만, 이 도구는 <strong>옛 사이트에서 새 사이트로 301 리다이렉트가 걸려 있어야</strong> 쓸 수 있다. 옛 도메인을 잃었으니 리다이렉트를 걸 수 없고, 따라서 기존 색인의 신호를 넘겨받을 수도 없다. <strong>새 사이트로 처음부터 색인받는 것</strong>이 현실적인 선택이다.</p>\n<p>그래서 할 수 있는 일은 “새 사이트를 최대한 빨리, 깔끔하게 크롤링되게 만드는 것”이다.</p>\n<ol>\n<li>서치콘솔에 새 도메인 속성을 추가하고 DNS TXT 레코드로 소유권을 확인한다.</li>\n<li>네이버 서치어드바이저에도 새로 등록한다. 옛 도메인의 인증 메타 태그는 새 도메인에서 쓸 수 없으므로 새로 발급받는다.</li>\n<li><code class=\"language-text\">sitemap.xml</code>을 제출하고, <code class=\"language-text\">robots.txt</code>에 <code class=\"language-text\">Sitemap:</code> 줄을 명시한다.</li>\n<li>사이트맵에서 얇은 페이지(글이 한두 개뿐인 태그 페이지 등)를 빼고, 글마다 <code class=\"language-text\">lastmod</code>를 넣는다.</li>\n</ol>\n<p>4번은 새 도메인일수록 중요하다. 신규 사이트는 크롤러가 한 번에 가져가는 양이 많지 않은데, 이 블로그는 사이트맵 URL 927개 중 739개가 태그 페이지였다. 크롤러가 태그 페이지부터 돌다가 정작 글을 늦게 가져갈 수 있는 구조였다. 정리 과정은 <a href=\"/javascript/Gatsby-%EB%B8%94%EB%A1%9C%EA%B7%B8-GEO-AEO-%EC%A0%81%EC%9A%A9%EA%B8%B0-JSON-LD-FAQPage-llms-txt-%EC%82%AC%EC%9D%B4%ED%8A%B8%EB%A7%B5/\">Gatsby 블로그 GEO·AEO 적용기</a>에 따로 정리했다.</p>\n<h2 id=\"이전-4단계-애드센스-사이트-재등록\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EC%A0%84-4%EB%8B%A8%EA%B3%84-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9E%AC%EB%93%B1%EB%A1%9D\" aria-label=\"이전 4단계 애드센스 사이트 재등록 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이전 4단계: 애드센스 사이트 재등록</h2>\n<p>애드센스는 <strong>계정 단위</strong>와 <strong>사이트 단위</strong>를 나눠서 생각하면 정리가 쉽다.</p>\n<table>\n<thead>\n<tr>\n<th>항목</th>\n<th>단위</th>\n<th>도메인 변경 시</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>게시자 ID(<code class=\"language-text\">ca-pub-…</code>)</td>\n<td>계정</td>\n<td>그대로</td>\n</tr>\n<tr>\n<td>광고 단위(슬롯 ID)</td>\n<td>계정</td>\n<td>그대로 재사용</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">ads.txt</code> 내용</td>\n<td>계정</td>\n<td>같은 내용을 새 도메인 루트에 제공</td>\n</tr>\n<tr>\n<td>사이트 승인</td>\n<td><strong>사이트</strong></td>\n<td><strong>새로 추가하고 심사받아야 함</strong></td>\n</tr>\n</tbody>\n</table>\n<p>진행 순서는 다음과 같다.</p>\n<ol>\n<li>새 도메인에서 <code class=\"language-text\">https://새도메인/ads.txt</code>가 200으로 열리는지 확인한다.</li>\n<li>애드센스 → 사이트 → 사이트 추가에서 새 도메인을 등록한다.</li>\n<li>소유권 확인은 <code class=\"language-text\">&lt;head></code>의 애드센스 코드 스니펫이나 <code class=\"language-text\">google-adsense-account</code> 메타 태그로 한다.</li>\n<li>검토를 요청한다. 심사는 며칠에서 몇 주까지 걸릴 수 있다.</li>\n<li>목록에서 옛 도메인을 삭제하고, <strong>승인된 사이트에서만 광고가 게재되도록</strong> 설정을 켜 둔다. 옛 도메인은 이제 남의 것이 될 수 있기 때문이다.</li>\n</ol>\n<h3 id=\"심사-중-빈-광고-칸-숨기기\" style=\"position:relative;\"><a href=\"#%EC%8B%AC%EC%82%AC-%EC%A4%91-%EB%B9%88-%EA%B4%91%EA%B3%A0-%EC%B9%B8-%EC%88%A8%EA%B8%B0%EA%B8%B0\" aria-label=\"심사 중 빈 광고 칸 숨기기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>심사 중 빈 광고 칸 숨기기</h3>\n<p>승인 전에는 수동 광고 단위가 빈 영역으로만 남는다. 이 블로그는 글마다 광고 영역이 세 개라 레이아웃이 어색해졌다. 그래서 <strong>스크립트와 소유권 메타 태그는 유지하고, 광고 단위만 환경 변수로 끄는</strong> 방식을 택했다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/constants/adsense.js</span>\n<span class=\"token comment\">// 심사 기간에는 배포 환경에서 GATSBY_ADSENSE_UNITS=off, 승인 후 변수를 지우면 다시 노출</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">ADSENSE_UNITS_ENABLED</span> <span class=\"token operator\">=</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">GATSBY_ADSENSE_UNITS</span> <span class=\"token operator\">!==</span> <span class=\"token string\">\"off\"</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/components/adsense.js</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token constant\">ADSENSE_UNITS_ENABLED</span> <span class=\"token operator\">||</span> <span class=\"token operator\">!</span>adSlot<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Gatsby에서 <code class=\"language-text\">GATSBY_</code> 접두사가 붙은 환경 변수는 빌드 결과물(브라우저 코드)에 포함된다. 비밀값이 아니므로 호스팅 서비스에서도 “민감 정보”가 아닌 일반 변수로 등록해야 한다. 실제로 Vercel에서 민감 정보로 등록하려다 거부당했고, 일반 변수로 다시 등록했다.</p>\n<h2 id=\"놓치기-쉬운-나머지-연동\" style=\"position:relative;\"><a href=\"#%EB%86%93%EC%B9%98%EA%B8%B0-%EC%89%AC%EC%9A%B4-%EB%82%98%EB%A8%B8%EC%A7%80-%EC%97%B0%EB%8F%99\" aria-label=\"놓치기 쉬운 나머지 연동 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>놓치기 쉬운 나머지 연동</h2>\n<table>\n<thead>\n<tr>\n<th>서비스</th>\n<th>해야 할 일</th>\n<th>메모</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Disqus 댓글</td>\n<td>Trusted Domains에 새 도메인 추가</td>\n<td>댓글이 URL이 아니라 <code class=\"language-text\">identifier</code>(글 slug)로 연결되어 있으면 기존 댓글이 그대로 이어진다</td>\n</tr>\n<tr>\n<td>GA4</td>\n<td>웹 스트림 URL 수정</td>\n<td>측정 ID는 그대로</td>\n</tr>\n<tr>\n<td>RSS 구독자</td>\n<td>피드 주소 변경 안내</td>\n<td>옛 도메인에서 리다이렉트할 수 없으므로 공지 외에는 방법이 없다</td>\n</tr>\n<tr>\n<td>소셜·프로필 링크</td>\n<td>GitHub, 이력서, 명함 등</td>\n<td>사람이 직접 바꿔야 하는 곳이 의외로 많다</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"재발-방지-체크리스트\" style=\"position:relative;\"><a href=\"#%EC%9E%AC%EB%B0%9C-%EB%B0%A9%EC%A7%80-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8\" aria-label=\"재발 방지 체크리스트 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재발 방지 체크리스트</h2>\n<p>이번 일의 근본 원인은 기술이 아니라 <strong>운영</strong>이다. 다음을 해 두었다.</p>\n<ol>\n<li><strong>자동 갱신 + 결제 수단 점검</strong>: 카드 유효기간이 지나면 자동 갱신도 실패한다.</li>\n<li><strong>여러 해 등록</strong>: 중요한 도메인은 한 번에 여러 해를 등록해 둔다.</li>\n<li><strong>등록기관 알림 메일 확인</strong>: 스팸함으로 빠지지 않도록 발신 주소를 허용 목록에 넣는다.</li>\n<li><strong>외부 모니터링</strong>: 서비스 워커가 가려 주는 문제는 사람이 알아채기 어렵다. 외부에서 주기적으로 확인한다.</li>\n</ol>\n<p>모니터링은 거창할 필요 없다. 네임서버와 HTTP 상태만 확인하는 스크립트를 크론이나 CI 스케줄로 돌려도 충분하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token shebang important\">#!/usr/bin/env bash</span>\n<span class=\"token comment\"># domain-check.sh — 네임서버가 바뀌었거나 사이트가 200이 아니면 실패로 종료</span>\n<span class=\"token assign-left variable\">DOMAIN</span><span class=\"token operator\">=</span><span class=\"token string\">\"bottlehs.dev\"</span>\n<span class=\"token assign-left variable\">EXPECTED_NS</span><span class=\"token operator\">=</span><span class=\"token string\">\"cloudflare.com\"</span>\n\n<span class=\"token assign-left variable\">NS</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">dig</span> +short NS <span class=\"token string\">\"<span class=\"token variable\">$DOMAIN</span>\"</span><span class=\"token variable\">)</span></span>\n<span class=\"token assign-left variable\">CODE</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">curl</span> <span class=\"token parameter variable\">-s</span> <span class=\"token parameter variable\">-o</span> /dev/null <span class=\"token parameter variable\">-w</span> <span class=\"token string\">'%{http_code}'</span> <span class=\"token string\">\"https://www.<span class=\"token variable\">$DOMAIN</span>/\"</span><span class=\"token variable\">)</span></span>\n\n<span class=\"token keyword\">if</span> <span class=\"token operator\">!</span> <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"<span class=\"token variable\">$NS</span>\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token parameter variable\">-q</span> <span class=\"token string\">\"<span class=\"token variable\">$EXPECTED_NS</span>\"</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span>\n  <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"네임서버 이상: <span class=\"token variable\">$NS</span>\"</span><span class=\"token punctuation\">;</span> <span class=\"token builtin class-name\">exit</span> <span class=\"token number\">1</span>\n<span class=\"token keyword\">fi</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">\"<span class=\"token variable\">$CODE</span>\"</span> <span class=\"token operator\">!=</span> <span class=\"token string\">\"200\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span>\n  <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"HTTP 상태 이상: <span class=\"token variable\">$CODE</span>\"</span><span class=\"token punctuation\">;</span> <span class=\"token builtin class-name\">exit</span> <span class=\"token number\">1</span>\n<span class=\"token keyword\">fi</span>\n<span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"정상\"</span></code></pre></div>\n<h2 id=\"정리-도메인-이전-순서-한눈에-보기\" style=\"position:relative;\"><a href=\"#%EC%A0%95%EB%A6%AC-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-%EC%88%9C%EC%84%9C-%ED%95%9C%EB%88%88%EC%97%90-%EB%B3%B4%EA%B8%B0\" aria-label=\"정리 도메인 이전 순서 한눈에 보기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>정리: 도메인 이전 순서 한눈에 보기</h2>\n<ol>\n<li>시크릿 창과 <code class=\"language-text\">dig</code>·<code class=\"language-text\">whois</code>로 <strong>실제 상태</strong>를 확인한다.</li>\n<li>복구 비용과 백링크 가치를 비교해 <strong>복구 또는 새 도메인</strong>을 결정한다.</li>\n<li>코드의 도메인을 <strong>한 곳(<code class=\"language-text\">siteUrl</code>)으로 모으고</strong>, 본문 내부 링크는 상대 경로로 바꾼다.</li>\n<li>호스팅에 새 도메인을 연결하고 <strong>실제 응답(308/200)을 확인</strong>한다.</li>\n<li>서치콘솔·네이버에 새로 등록하고, <strong>정리된 사이트맵</strong>을 제출한다.</li>\n<li>애드센스에 <strong>사이트를 추가해 심사</strong>받고, 심사 중에는 빈 광고 칸을 숨긴다.</li>\n<li>댓글·분석·구독 등 <strong>주변 연동</strong>을 옮긴다.</li>\n<li>자동 갱신과 외부 모니터링으로 <strong>재발을 막는다</strong>.</li>\n</ol>\n<h2 id=\"faq\" style=\"position:relative;\"><a href=\"#faq\" aria-label=\"faq permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>FAQ</h2>\n<p><strong>Q: 레지스트리 whois에는 만료일이 내년으로 나오는데, 왜 도메인이 만료된 건가요?</strong><br>\nA: 레지스트리가 만료 시점에 자동으로 1년을 연장해 두고, 등록기관이 유예 기간 동안 그 연장을 확정하거나 취소하는 구조이기 때문이다. 등록기관 whois의 만료일과 네임서버가 실제 상태를 더 정확히 보여 준다.</p>\n<p><strong>Q: 옛 도메인에서 새 도메인으로 리다이렉트를 못 걸면 검색 순위는 어떻게 되나요?</strong><br>\nA: 기존 색인 신호를 넘겨받을 수 없어서 새 사이트로 다시 평가받게 된다. 사이트맵 제출, 얇은 페이지 정리, 구조화 데이터 적용처럼 크롤링과 이해를 돕는 작업으로 회복 속도를 높이는 것이 현실적인 대응이다.</p>\n<p><strong>Q: 애드센스 광고 단위는 새로 만들어야 하나요?</strong><br>\nA: 아니다. 광고 단위와 게시자 ID는 계정에 속하므로 그대로 쓸 수 있다. 새로 해야 하는 것은 사이트 추가와 심사뿐이다.</p>\n<p><strong>Q: 심사 중에 광고 코드를 아예 빼 두는 게 낫지 않나요?</strong><br>\nA: 소유권 확인에 쓰이는 <code class=\"language-text\">&lt;head></code>의 애드센스 스크립트나 메타 태그는 남겨 두어야 한다. 빈 칸으로 보이는 수동 광고 단위만 숨기면 심사와 사용자 경험을 둘 다 챙길 수 있다.</p>\n<p><strong>Q: 서비스 워커 때문에 문제를 늦게 알았다면, 오프라인 플러그인을 빼야 하나요?</strong><br>\nA: 꼭 그럴 필요는 없다. 오프라인 캐시는 방문자 경험에 도움이 된다. 다만 운영자는 캐시가 없는 환경에서 사이트를 확인해야 하고, 외부 모니터링을 두는 것이 더 근본적인 해결책이다.</p>","tableOfContents":"<ul>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%A6%9D%EC%83%81-%EB%82%B4-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C%EB%8A%94-%EB%A9%80%EC%A9%A1%ED%95%9C%EB%8D%B0\">증상: “내 브라우저에서는 멀쩡한데?”</a></li>\n<li>\n<p><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%A7%84%EB%8B%A8-dig%EC%99%80-whois%EB%A1%9C-%EC%9B%90%EC%9D%B8-%EC%A2%81%ED%9E%88%EA%B8%B0\">진단: dig와 whois로 원인 좁히기</a></p>\n<ul>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#1-%EB%84%A4%EC%9E%84%EC%84%9C%EB%B2%84%EB%B6%80%ED%84%B0-%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4\">1. 네임서버부터 확인한다</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#2-whois%EB%A1%9C-%EB%A7%8C%EB%A3%8C%EC%9D%BC%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4\">2. whois로 만료일을 확인한다</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#3-%ED%98%B8%EC%8A%A4%ED%8C%85-%EC%AA%BD%EC%97%90%EC%84%9C%EB%8F%84-%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4\">3. 호스팅 쪽에서도 확인한다</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EB%B3%B5%EA%B5%AC%ED%95%A0%EA%B9%8C-%EC%83%88%EB%A1%9C-%EC%82%B4%EA%B9%8C\">복구할까, 새로 살까</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%9D%B4%EC%A0%84-1%EB%8B%A8%EA%B3%84-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9D%84-%ED%95%9C-%EA%B3%B3%EC%9C%BC%EB%A1%9C-%EB%AA%A8%EC%9D%80%EB%8B%A4\">이전 1단계: 코드에서 도메인을 한 곳으로 모은다</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%9D%B4%EC%A0%84-2%EB%8B%A8%EA%B3%84-%ED%98%B8%EC%8A%A4%ED%8C%85%EC%97%90-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0\">이전 2단계: 호스팅에 새 도메인 연결</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%9D%B4%EC%A0%84-3%EB%8B%A8%EA%B3%84-%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84--301-%EC%97%86%EC%9D%B4-%EB%8B%A4%EC%8B%9C-%EC%83%89%EC%9D%B8%EB%B0%9B%EA%B8%B0\">이전 3단계: 검색엔진 — 301 없이 다시 색인받기</a></li>\n<li>\n<p><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%9D%B4%EC%A0%84-4%EB%8B%A8%EA%B3%84-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9E%AC%EB%93%B1%EB%A1%9D\">이전 4단계: 애드센스 사이트 재등록</a></p>\n<ul>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%8B%AC%EC%82%AC-%EC%A4%91-%EB%B9%88-%EA%B4%91%EA%B3%A0-%EC%B9%B8-%EC%88%A8%EA%B8%B0%EA%B8%B0\">심사 중 빈 광고 칸 숨기기</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EB%86%93%EC%B9%98%EA%B8%B0-%EC%89%AC%EC%9A%B4-%EB%82%98%EB%A8%B8%EC%A7%80-%EC%97%B0%EB%8F%99\">놓치기 쉬운 나머지 연동</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%9E%AC%EB%B0%9C-%EB%B0%A9%EC%A7%80-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8\">재발 방지 체크리스트</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#%EC%A0%95%EB%A6%AC-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-%EC%88%9C%EC%84%9C-%ED%95%9C%EB%88%88%EC%97%90-%EB%B3%B4%EA%B8%B0\">정리: 도메인 이전 순서 한눈에 보기</a></li>\n<li><a href=\"/etc/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%A3%8C%EB%A1%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8%EA%B0%80-%EC%82%AC%EB%9D%BC%EC%A1%8C%EB%8B%A4-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EC%A0%84-SEO-%EC%95%A0%EB%93%9C%EC%84%BC%EC%8A%A4-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8/#faq\">FAQ</a></li>\n</ul>","wordCount":{"words":1082},"fields":{"slug":"/etc/도메인-만료로-블로그가-사라졌다-새-도메인-이전-SEO-애드센스-체크리스트/","image":null,"faq":[{"question":"레지스트리 whois에는 만료일이 내년으로 나오는데, 왜 도메인이 만료된 건가요?","answer":"레지스트리가 만료 시점에 자동으로 1년을 연장해 두고, 등록기관이 유예 기간 동안 그 연장을 확정하거나 취소하는 구조이기 때문이다. 등록기관 whois의 만료일과 네임서버가 실제 상태를 더 정확히 보여 준다."},{"question":"옛 도메인에서 새 도메인으로 리다이렉트를 못 걸면 검색 순위는 어떻게 되나요?","answer":"기존 색인 신호를 넘겨받을 수 없어서 새 사이트로 다시 평가받게 된다. 사이트맵 제출, 얇은 페이지 정리, 구조화 데이터 적용처럼 크롤링과 이해를 돕는 작업으로 회복 속도를 높이는 것이 현실적인 대응이다."},{"question":"애드센스 광고 단위는 새로 만들어야 하나요?","answer":"아니다. 광고 단위와 게시자 ID는 계정에 속하므로 그대로 쓸 수 있다. 새로 해야 하는 것은 사이트 추가와 심사뿐이다."},{"question":"심사 중에 광고 코드를 아예 빼 두는 게 낫지 않나요?","answer":"소유권 확인에 쓰이는 <head>의 애드센스 스크립트나 메타 태그는 남겨 두어야 한다. 빈 칸으로 보이는 수동 광고 단위만 숨기면 심사와 사용자 경험을 둘 다 챙길 수 있다."},{"question":"서비스 워커 때문에 문제를 늦게 알았다면, 오프라인 플러그인을 빼야 하나요?","answer":"꼭 그럴 필요는 없다. 오프라인 캐시는 방문자 경험에 도움이 된다. 다만 운영자는 캐시가 없는 환경에서 사이트를 확인해야 하고, 외부 모니터링을 두는 것이 더 근본적인 해결책이다."}]},"frontmatter":{"title":"도메인 만료로 블로그가 사라졌다 — 새 도메인 이전 SEO·애드센스 체크리스트","date":"2026년 9월 25일","dateISO":"2026-09-25T01:00:00.000Z","updatedISO":null,"category":"etc","description":"기술 블로그 도메인이 만료되어 주차 페이지로 바뀐 것을 뒤늦게 발견하고, 복구 대신 새 도메인으로 이전한 과정을 정리한다. dig·whois로 원인을 진단하는 법, 코드에서 도메인을 한 곳으로 모으는 법, 301 리다이렉트 없이 검색 색인을 다시 받는 법, 애드센스 사이트 재등록과 재발 방지까지 다룬다.","tags":["도메인","SEO","애드센스","Vercel","Gatsby","배포","회고"]}}},"pageContext":{"slug":"/etc/도메인-만료로-블로그가-사라졌다-새-도메인-이전-SEO-애드센스-체크리스트/","previous":{"fields":{"slug":"/etc/Drizzle-ORM과-PostgreSQL-스키마-마이그레이션-운영-완전-가이드/"},"frontmatter":{"title":"Drizzle ORM과 PostgreSQL — 스키마·마이그레이션·운영 완전 가이드","tags":["Drizzle ORM","PostgreSQL","TypeScript","마이그레이션","drizzle-kit","백엔드","데이터베이스"]}},"next":{"fields":{"slug":"/javascript/Gatsby-블로그-GEO-AEO-적용기-JSON-LD-FAQPage-llms-txt-사이트맵/"},"frontmatter":{"title":"Gatsby 블로그 GEO·AEO 적용기 — JSON-LD, FAQPage 자동 생성, llms.txt, 사이트맵 정리","tags":["Gatsby","SEO","AI 검색","구조화 데이터","JavaScript","Vercel","웹 개발"]}}}},"staticQueryHashes":["213619243","3262363727"]}