BinaryHub 개발기 ⑥ SEO와 AdSense — 사이트가 늘어나면 신경 쓰는 것
BinaryHub 개발기. 운영을 굴리며 신경 쓴 SEO와 광고 이야기.
운영비를 어떻게 댈 것인가
사이트가 늘어나면 호스팅 비용도 늘어난다. BinaryHub는 운영 PC 한 대로 굴리니까 전기료 + 인터넷 정도가 끝이지만, 그래도 도메인 갱신·Cloudflare 추가 결제·외부 서비스 비용이 조금씩 든다. 학생이 사비로 댈 수 있는 한도는 분명하다.
가장 단순한 답은 광고였다. Google AdSense는 학생 사이드 프로젝트에 가장 진입 장벽이 낮은 수익 모델이다. 다만 광고를 도배하면 사이트가 흉해지고 사용자 경험이 망가지니까, 사이트당 광고는 최소화한다는 원칙을 잡았다. 북곽툴즈 홈에 "광고 1개로 운영비 충당"이라고 적어 둔 게 그 약속이다.
AdSense 승인은 한 번이면 된다
처음엔 사이트마다 AdSense 승인을 따로 받아야 하는 줄 알고 잠깐 걱정했다. 사이트가 다섯 개나 되는데 다섯 번 승인 신청하면 거절도 다섯 배.
그런데 검색해 보니 2024년 6월부터 AdSense 정책이 바뀌었다. 루트 도메인이 승인되면 서브도메인은 자동으로 포함된다. binaryhub.club 하나만 승인되면 tools.binaryhub.club, useless.binaryhub.club, study.binaryhub.club 다 같이 적용된다.
그래서 ads.txt도 모든 서브도메인에 동일한 한 줄을 깔아 뒀다.
google.com, pub-1946972247009424, DIRECT, f08c47fec0942fa0
binaryhub.club/ads.txt— Next.js의public/ads.txttools.binaryhub.club/ads.txt— 같은 파일을 nsgh-tools의public/에도 둠study.binaryhub.club/ads.txt— Cloudflare Workers의dist/client/에 포함
세 군데 다 같은 publisher ID가 보여야 AdSense가 권한을 확인할 수 있다. 한 군데라도 404거나 다른 ID면 정책 위반으로 잡힌다.
농담 사이트인 무쓸모.앱에는 의도적으로 ads.txt를 안 깔았다. AdSense 스크립트 자체를 로드하지 않기 때문이다. 광고 안 보이는 사이트에 ads.txt가 있을 이유는 없다.
콘텐츠 품질 — AI 양산 글의 함정
AdSense 정책에서 가장 신경 쓴 건 "스케일된 콘텐츠 남용(scaled content abuse)" 항목이다. AI로 글을 양산해서 광고 노출용으로 띄우는 사이트를 거절·정지하는 정책. 요즘 가장 흔한 거절 사유 중 하나다.
그래서 BBlog는 처음부터 사람이 직접 쓴 글만 올리는 원칙을 잡았다. 시리즈 글을 쓸 때도 — 톤·관점·뒤늦게 깨달은 디테일을 직접 손으로 다듬는다. 글이 늘어나는 속도는 느리지만, AdSense 정책상 그게 정답이다.
검색 콘솔은 DNS로 한 번에
Google Search Console에 사이트를 등록할 때 두 방식이 있다. 한쪽은 verification.google 메타 태그를 사이트 <head>에 박는 방식, 다른 쪽은 DNS TXT 레코드로 도메인 전체를 인증하는 방식.
처음에 메타 태그 방식으로 등록했다가 — 사이트가 늘어나면서 다 다시 깔기 귀찮아서 — DNS TXT로 갈아탔다. 도메인 binaryhub.club을 한 번 인증해 두면 모든 서브도메인이 자동으로 포함된다. 메타 토큰도 더는 필요 없고, 코드에서도 지웠다.
// app/layout.tsx
const GOOGLE_SITE_VERIFICATION = ""; // DNS TXT로 인증, 비워 둬도 됨서브도메인을 추가할 때마다 GSC에 등록할 필요도 없다. 한 번 잡아 두면 자동으로 따라온다.
sitemap·robots도 사이트마다
각 사이트마다 sitemap.xml·robots.txt를 둔다. Next.js 앱은 app/sitemap.ts·app/robots.ts로 코드로 생성하고, StudyAce는 정적 파일로 직접 깔았다.
서브브랜드별로 sitemap에 뭘 넣을지가 살짝 다르다.
- BBlog: 글 목록·카테고리·태그 페이지를 다 sitemap에 넣고, RSS도 함께 제공한다. 검색 유입을 정면으로 받는 사이트라서.
- 북곽툴즈: 도구 페이지·소개·법적 페이지를 sitemap에 넣는다. 도구별로 lc·priority를 줘서 자주 쓰는 도구가 더 잘 노출되게.
- StudyAce: sitemap을 두긴 하지만 학습 페이지(SPA 화면)는 검색 노출 의미가 없어서 인덱스·login·privacy·terms 정도만 넣었다.
- 무쓸모.앱: 의도적으로 sitemap에 별 신경 안 썼다. 검색으로 들어와도 가치가 없고 농담이 깨진다.
robots.txt에는 Cloudflare가 자동으로 끼워 주는 AI 크롤러(ClaudeBot·GPTBot·Google-Extended·Bytespider 등) 차단 블록이 있다. AI 학습용 크롤링은 다 막고, 검색 크롤러만 들이는 방식. 이건 Cloudflare 측에서 zone 설정으로 한 번에 처리된다.
메타데이터는 페이지마다 다르게
검색 결과에서 "어 그냥 도메인 이름이 그대로 보이네"가 가장 흔한 SEO 실수다. Next.js의 metadata API는 layout과 page에 계층적으로 적용되니까, 사이트별·페이지별로 title·description을 다르게 주면 된다.
// app/layout.tsx (root)
title: { default: "BinaryHub", template: "%s · BinaryHub" }
// app/blog/layout.tsx
title: { default: "BBlog · 개발·대회·연구 기록", template: "%s · BBlog" }
// app/blog/page.tsx
title: { absolute: "블로그 · BBlog" } // template은 자기 자신에 적용 안 됨같은 segment의 layout template이 그 segment의 page에는 적용되지 않는다는 게 함정이라, page에 absolute로 박아 줘야 한다. 한 번은 모든 도구 페이지가 다 같은 title을 받아서 — app/{도구}/page.tsx가 "use client"라 metadata export가 안 됐던 게 원인 — 도구마다 server layout.tsx를 끼워 넣어 해결했다.
페이지별로 다른 metadata를 깔아 두면, 검색 결과에 "PDF 합치기 — 북곽툴즈", "Three.js DragControls — BBlog" 같이 의미 있는 미리보기가 떠서, 클릭률이 눈에 띄게 다르다.
구조화 데이터 — JSON-LD
검색 결과를 풍부하게 만들고 싶으면 JSON-LD를 더한다. BinaryHub portal 첫 페이지엔 WebSite + Organization 스키마를, BBlog 글 페이지엔 BlogPosting 스키마를 넣었다.
const siteJsonLd = {
"@context": "https://schema.org",
"@type": "WebSite",
name: "BinaryHub",
url: "https://binaryhub.club",
potentialAction: {
"@type": "SearchAction",
target: "https://binaryhub.club/blog?q={search_term_string}",
...
},
};이러면 검색 결과에 사이트 이름 + 검색창이 같이 뜨는 경우가 생긴다. Google이 보장은 안 해 주지만, 안 깔면 0%고 깔아 두면 가끔 떠 준다.
정리
사이트가 늘어나면 광고와 검색 노출도 늘어나는 게 아니라 — 같은 정책을 사이트 수만큼 곱해서 신경 써야 한다는 뜻이다. 다행히도 AdSense는 루트 한 번 승인되면 서브가 따라오고, Search Console은 DNS TXT 한 번이면 도메인 전체가 잡힌다. 정책을 정확히 알면 일이 절반으로 준다.
남는 일은 콘텐츠 품질이다. AI로 양산한 글은 정책상 문제고, 사용자 입장에서도 가치 없다. 결국 사이트 다섯 개의 가장 중요한 건 사람이 직접 쓴 글이 천천히 쌓이는 것이라는, 진부하지만 사실인 결론에 이른다.
처음엔 도구 사이트 하나였는데, 지금은 운영 PC 위 두 사이트 + Cloudflare 위 두 사이트 + 우산 포털 하나가 됐다. 사이트마다 결이 다르고 호스팅이 다르지만, 한 우산 아래 모여 있다는 게 의외로 큰 의미가 된다. 앞으로 사이트가 더 늘어나거나 줄어들 수 있고, BinaryHub라는 이름은 그 변화를 다 담아 줄 여유가 있다.