Blogger 테마 업로드 전 QC는 디자인 확인보다 먼저 구조 보존과 링크 안전성을 확인하는 작업이다. 이번 기록은 AdSense 코드, GA4, Yandex 확인 태그, 라벨 네비게이션, 한국어 전용 구조를 한 번에 점검하면서 테마 업로드 사고를 줄이기 위해 만든 검증 절차다.
테마 XML은 글 하나보다 위험 범위가 넓다. 게시글 하나가 깨지면 해당 URL만 영향을 받지만, 테마가 깨지면 홈, 라벨, 검색, 본문, 광고 연결, 색인 UX가 동시에 흔들릴 수 있다. 그래서 Blogger 테마는 수정 자체보다 업로드 전 검증 체계가 더 중요하다.
목차
문제 상황
ToolSignal Pro는 현재 한국어 기반의 AI 코딩, 자동화, Blogger 트러블슈팅 아카이브로 운영 중이다. 운영 방향이 정리된 뒤 테마에서도 그 방향이 흔들리지 않아야 했다. 문제는 테마 XML 안에 광고 코드, 분석 코드, 검증 메타, 메뉴 링크, 라벨 매핑, 모바일 레이아웃 보정 코드가 모두 섞여 있다는 점이었다.
이런 테마에서 특정 항목만 수정하려고 하면 의도하지 않은 부작용이 쉽게 생긴다. 예를 들어 라벨 링크 하나를 고치려다 Blogger 위젯 구조를 건드릴 수 있고, 오래된 다국어 라벨 잔재를 지우려다 JSON-LD나 메뉴 데이터가 깨질 수 있다. AdSense 코드를 정리하려다 기존 GA4나 Yandex verification을 삭제하는 사고도 가능하다.
따라서 이번 작업의 목표는 테마를 새롭게 디자인하는 것이 아니었다. 이미 작동하는 디자인과 위젯 구조는 유지하고, 업로드 전 반드시 확인해야 하는 위험 지점만 좁게 점검하는 것이었다.
에러 증상
가장 눈에 띄는 증상은 AI 파헤치기 색인 항목이었다. 화면에는 현재 사이트의 핵심 분류인 AI 파헤치기가 보였지만, 클릭했을 때 글 목록이 비어 보이는 경우가 있었다. 어떤 경로는 라벨 아카이브로 이동했고, 어떤 경로는 존재하지 않는 fallback 페이지로 이어졌다.
문제가 되었던 경로는 다음과 같은 유형이었다.
/search/label/인공지능
/search/label/AI 파헤치기
/search/label/AI%20%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0
/p/archive.html
이 경로들이 모두 같은 의미처럼 보일 수 있지만, Blogger에서는 동일하지 않다. 화면에 보이는 메뉴명과 실제 href, URL 인코딩된 라벨명, Blogger 글 관리자에 붙어 있는 실제 라벨은 서로 다른 계층이다. 이 중 하나라도 맞지 않으면 글은 존재하는데 라벨 페이지는 비어 보일 수 있다.
또 하나의 증상은 테마 수준의 언어 정합성이었다. 사이트는 한국어만 사용 중인데, 테마 안에는 이전 운영 흔적이나 다국어 라벨 매핑이 남을 수 있었다. 이것이 본문에 직접 노출되지 않더라도, 메뉴나 구조화 데이터, 라벨 히어로, 페이지네이션 로직에서 prominent하게 나타나면 현재 사이트 방향과 충돌한다.
환경
대상 환경은 Blogger XML 테마다. Blogger 테마는 일반 HTML 파일이 아니라, <b:section>, <b:widget>, <b:include>, <b:skin> 같은 Blogger 전용 태그와 네임스페이스를 포함한다. 그래서 일반 HTML 파서 기준으로만 판단하면 충분하지 않다.
현재 보존해야 할 핵심 요소는 다음과 같았다.
- AdSense publisher ID와 광고 로더
- Google Analytics 또는 GA4 코드
- Yandex verification meta tag
- Blogger 필수 head include
- 기존 Blogger 위젯과 섹션 구조
- 모바일 레이아웃 보정 CSS
- 한국어 중심 사이트 포지셔닝
여기서 중요한 점은 “문제가 없어 보이는 코드는 지우지 않는다”는 원칙이다. 테마 QC의 목적은 새 기능을 추가하는 것이 아니라, 업로드 후 사이트 전체가 망가지지 않도록 현재 작동하는 구조를 보존하는 것이다.
시도했지만 실패한 방법
처음에는 문제가 되는 문자열만 바꾸면 된다고 생각하기 쉽다. 예를 들어 /search/label/인공지능을 /search/label/AI%20... 형태로 교체하면 표시명과 라벨명이 맞을 것처럼 보인다. 그러나 Blogger에서는 이것만으로 충분하지 않을 수 있다.
Blogger의 LinkList나 메뉴 위젯은 테마 XML 업로드 이후에도 관리자 화면에 저장된 기존 설정값을 유지할 수 있다. 파일 안의 href를 바꿨는데 실제 라이브 메뉴는 예전 링크를 계속 사용하는 상황이 생길 수 있다. 이 경우 문제는 XML 문자열이 아니라 Blogger 위젯 저장값과 라이브 렌더링의 차이다.
또 다른 실패는 fallback을 무리하게 넣는 방식이었다. 라벨 페이지가 비면 임시로 다른 페이지로 보내겠다는 생각은 자연스럽지만, fallback 대상이 실제 존재하지 않으면 문제는 더 커진다. 빈 라벨 페이지는 “글이 안 보인다”는 문제지만, 없는 페이지로 보내는 fallback은 “사이트가 깨졌다”는 문제로 보인다.
오류가 난 원인
원인은 단일 코드 오류가 아니라 검증 순서의 부재에 가까웠다. 테마를 수정할 때는 보통 눈에 보이는 문제부터 고치게 된다. 하지만 Blogger 테마는 보이지 않는 연결이 많다. 광고 코드, 분석 코드, 구조화 데이터, 메뉴 링크, 라벨 매핑, 모바일 CSS가 한 파일 안에서 서로 다른 목적을 가진 채 공존한다.
특히 AdSense 관련 코드는 중복 여부와 위치가 중요하다. publisher ID가 일관되지 않거나, 광고 스크립트가 차단될 수 있는 방식으로 삽입되거나, 메타 태그가 빠지면 심사와 연결 상태 확인에 혼선을 줄 수 있다. 반대로 광고 코드를 정리한다는 이유로 기존 분석 코드나 검증 태그를 지우면 운영 데이터와 소유권 확인에 문제가 생긴다.
라벨 네비게이션은 또 다른 계층이다. /search/label/...는 Blogger에서 정상적인 형식이지만, 실제 글 라벨과 정확히 맞아야 한다. 한글, 공백, URL 인코딩이 섞이면 운영자가 보기에는 같은 라벨처럼 보여도 Blogger는 다르게 처리할 수 있다. 그러므로 테마 업로드 전에는 라벨 URL이 실제로 글 목록을 반환하는지까지 확인해야 한다.
최종 해결
최종 해결은 테마 업로드 전 QC 기준을 세우고, 그 기준을 통과한 파일만 업로드하는 방식이었다. 핵심은 수정 범위를 좁게 유지하는 것이다. 이번 기준에서는 디자인 변경, 광고 슬롯 추가, 레이아웃 재구성, 위젯 삭제를 하지 않았다. 대신 기존 기능을 보존하면서 오류 가능성이 큰 지점만 확인했다.
AI 파헤치기 네비게이션은 깨진 라벨 아카이브 대신 작동이 확인된 /search로 보냈다. 이 방식은 완벽한 라벨 taxonomy 복구는 아니다. 하지만 방문자가 빈 화면이나 404를 보는 문제를 먼저 막는 실무적 복구다. 이후 진짜 라벨 전용 페이지를 만들려면 Blogger 글 관리자에서 실제 라벨이 어떻게 붙어 있는지 다시 확인해야 한다.
AdSense 쪽은 publisher ID를 한 값으로 통일하고, 메타 태그와 광고 로더를 보존하는 방식으로 점검했다. GA4와 Yandex verification은 삭제 대상이 아니라 보존 대상이다. 한국어 전용 운영 상태에 맞춰 다국어 노출 흔적은 테마 prominent 영역에서 정리하되, 게시글 자체를 무단 삭제하는 방식은 피했다.
사용한 코드
아래 코드는 Blogger 테마 XML 업로드 전에 위험 문자열과 필수 요소를 점검하는 최소 검사 예시다. 실제 테마 수정은 반드시 백업본을 만들어 둔 뒤 진행해야 한다.
from pathlib import Path
THEME_FILE = Path("theme.xml")
xml = THEME_FILE.read_text(encoding="utf-8")
checks = {
"adsense_meta": 'name="google-adsense-account"' in xml and "ca-pub-4230158372696778" in xml,
"adsense_loader": "pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" in xml,
"ga4_preserved": "googletagmanager.com/gtag/js" in xml or "gtag(" in xml,
"yandex_preserved": "yandex-verification" in xml,
"blogger_skin": "<b:skin" in xml,
"blogger_widgets": "<b:widget" in xml,
}
bad_targets = [
"/search/label/인공지능",
"/search/label/AI 파헤치기",
"/search/label/AI%20%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0",
"/p/archive.html",
]
old_positioning = [
"SaaS",
"saas",
"Software as a Service",
"Webflow",
"Framer",
"Squarespace",
"no-code",
"pricing comparison",
]
print("필수 구조 점검")
for name, ok in checks.items():
print(name, "OK" if ok else "CHECK_REQUIRED")
print("\n잘못된 네비게이션 후보")
for target in bad_targets:
if target in xml:
print("FOUND:", target)
print("\n오래된 포지셔닝 후보")
for word in old_positioning:
if word in xml:
print("FOUND:", word)
이 코드는 완전한 XML 검증기가 아니다. 그러나 업로드 전 사람이 놓치기 쉬운 핵심 항목을 빠르게 보여준다. 특히 “있어야 할 것이 있는지”와 “없어야 할 것이 남아 있는지”를 분리해서 확인하는 데 도움이 된다.
선택적 리다이렉트 방어
이미 잘못된 경로로 들어오는 방문자가 있을 때만 좁은 범위의 방어 코드를 사용할 수 있다. 단, 모든 검색 페이지를 리다이렉트하면 안 된다. 정상 검색 기능까지 망가질 수 있기 때문이다.
<script>
(function () {
var path = decodeURIComponent(window.location.pathname);
var badPaths = [
"/search/label/인공지능",
"/search/label/AI 파헤치기",
"/p/archive.html"
];
if (badPaths.indexOf(path) !== -1) {
window.location.replace("/search");
}
})();
</script>
이 코드는 최종 해결책이 아니라 안전망이다. 가장 좋은 해결은 메뉴 링크, 실제 글 라벨, Blogger 위젯 설정을 일치시키는 것이다.
검증 결과
검증은 파일 내부 검사와 라이브 동작 확인으로 나눴다. 파일 내부에서는 AdSense publisher ID, 광고 로더, GA4, Yandex verification, Blogger 위젯 구조, 한국어 전용 메타 구조를 확인한다. 라이브에서는 홈, 검색, 본문, AI 파헤치기 메뉴, 모바일 화면을 확인한다.
특히 라벨 문제는 XML만 보고 끝내면 안 된다. 실제로 클릭했을 때 글 목록이 뜨는지 확인해야 한다. Blogger 위젯이 기존 값을 유지하는 경우, 파일에는 수정된 링크가 있어도 라이브 페이지에는 예전 링크가 남을 수 있기 때문이다.
검증 순서는 다음이 안전했다.
- 기존 테마 XML을 백업한다.
- 수정본 XML에서 필수 광고·분석·검증 태그를 확인한다.
- 잘못된 라벨 경로와 존재하지 않는 fallback 경로를 검색한다.
- Blogger에 업로드한다.
- 홈, 검색, 본문, 라벨 또는 색인 메뉴를 직접 클릭한다.
- 모바일 화면에서 본문 폭과 메뉴 동작을 확인한다.
- 페이지 소스에서 AdSense publisher ID가 유지되는지 확인한다.
같은 문제 겪는 분들에게
Blogger 테마를 수정할 때는 “업로드가 된다”와 “사이트가 정상이다”를 같은 의미로 보면 안 된다. XML 파싱이 통과해도 메뉴가 예전 값을 유지할 수 있고, 페이지가 열려도 광고 코드나 메타 구조가 빠질 수 있다.
특히 AdSense 심사 전이라면 테마 수정은 더 보수적으로 해야 한다. 광고 슬롯을 새로 늘리거나 디자인을 크게 바꾸는 것보다, 소유권 확인 코드와 publisher ID, ads.txt, 검색 설명, 내부링크, 빈 페이지 제거가 더 중요하다. 심사 직전의 테마 수정은 화려함보다 안정성이 우선이다.
라벨 문제도 마찬가지다. /search/label/... 자체는 정상적인 Blogger 형식이지만, 실제 글 라벨과 맞지 않으면 빈 페이지가 된다. 한글 라벨과 공백이 들어간 라벨은 인코딩 문자열까지 함께 확인해야 한다. 그래도 불안정하면 먼저 작동이 확인된 /search로 복구하고, 이후 라벨 체계를 따로 정리하는 순서가 안전하다.
관련 ToolSignal 기록
같은 아카이브의 다른 운영 기록입니다. 테마 QC, 자동 발행, 색인 복구는 서로 연결된 문제라 함께 보면 전체 흐름을 이해하기 쉽습니다.
- 구글 색인 누락 200% 극복! 5종 자동화 소스코드 파일 및 파이썬 확장 활용 팁
- Blogger API 호출 시 자동 발행 GUARD로 인한 DRAFT 잔재 사고 해결
- Blogger XML Playwright 9222 CDP 자동 업로드 문제 해결 기록
최종 상태는 테마를 새로 꾸민 것이 아니라, 업로드 전 실패 가능성을 줄이는 검증 절차를 정리한 것이다. Blogger 운영에서 중요한 것은 한 번의 멋진 수정이 아니라, 다음 업로드에서도 같은 사고를 반복하지 않는 기준을 남기는 일이다.