「『広告なんて邪魔だ』と理想を叫ぶのは簡単だが、サーバー代を払えなければサービスそのものが死ぬ」
레이와 시대에 직접 만든 2채널 스타일 게시판 「つゔぁいちゃんねる(2ch.biz)」 개발 비화의 제25탄입니다. 이번에는 트래픽 증가에 따른 인프라 비용을 충당하고, 서비스를 영속적으로 생존시키기 위한 '디스플레이 광고 영역(728x90 리더보드)' 삽입과, Google의 Core Web Vitals (CLS: 레이아웃 변화)를 완벽하게 방지하는 프론트엔드 골격 설계를 설명합니다.
개인적으로 웹 서비스를 개발하고 공개해 본 경험이 있는 분이라면 누구나 이 딜레마에 직면해 봤을 것입니다.
- 「광고가 덕지덕지 붙은 더러운 사이트는 하고 싶지 않다」
- 「사용자에게는 쾌적하고 클린한 경험을 제공하고 싶다」
저 역시 처음에는 그렇게 생각했습니다. 하지만 이용자가 늘어나고, 초당 요청 수가 불어날수록 현실이 무자비하게 덮쳐옵니다.
VPS / 서버의 월별 증강 비용연간 도메인 갱신료대역 전송량(데이터 트래픽) 종량제 과금
'적자를 흘리면서 개인 용돈으로 버티는 것'에는 한계가 있습니다. 서비스를 지속 가능한 사업/프로젝트로 성립시키기 위해서는, 건전한 수익화(Monetization) 구조가 절대적으로 필수적이었습니다.
개발 초기(2026년 8월 22일 저녁), 게시판의 미관과 가독성을 해치지 않는 절묘한 균형을 추구하며 **'헤더 직하 728x90 디스플레이 광고 영역'**을 설계 및 구현했습니다.
디스플레이 광고에는 다양한 크기(300x250 직사각형, 160x600 스카이스크레이퍼 등)가 존재하지만, 첫 화면에서 가장 효과적인 것이 **'728×90 (리더보드 / Leaderboard)'**입니다.
- IAB (Interactive Advertising Bureau)의 국제 표준 규격
Google AdSense나 주요 광고 네트워크 회사들이 가장 풍부한 광고 재고(고단가 건)를 보유하고 있는 크기입니다. -
2채널의 전통적 레이아웃과의 조화
오래된 2ch의 탑 페이지에서도, 헤더 직하에 가로로 긴 배너가 절제되게 자리 잡고 있었습니다. 텍스트 중심의 게시판에서, 가로로 긴 배너는 독서의 세로 스크롤 리듬을 가장 방해하지 않는 황금 비율입니다.
광고를 도입할 때 초보자가 가장 흔하게 저지르는 치명적인 실수가 바로 이것입니다.
<!-- ❌ 최악의 코드: 영역 높이가 확보되지 않음 -->
<div class="ad-area">
<script src="https://example.com/ad.js"></script>
...
이것을 하면 어떤 일이 발생할까요?
- 페이지 로딩 시작 시, 광고 태그의 내용은 비어있으므로
height: 0px입니다.
사용자는 스레드의 글을 읽기 시작합니다. - 1초 후, 지연되어 광고 스크립트가 로드되면서 갑자기 높이 90px의 이미지 배너가 나타납니다.
읽고 있던 기사가 툭 아래로 90픽셀 강제 하강되며, 사용자가 버튼을 오클릭하게 됩니다!
이 '저절로 화면이 밀리는 현상'은 Google이 검색 순위 지표로 중요시하는 Core Web Vitals의 'CLS (Cumulative Layout Shift)'를 최악 수준으로 악화시키고, SEO 순위가 폭락하는 치명적인 원인이 됩니다.
이 문제를 근본적으로 해결하기 위해, **'광고가 로드되기 전부터, 미리 728×90의 전용 공간을 CSS로 물리적으로 확보해 두는 설계'**를 철저히 했습니다.
<!-- 광고 영역 마크업 -->
<aside class="header-ad-area" aria-label="스폰서 광고">
<div class="header-ad-container">
...
.header-ad-area {
width: 100%;
...
이 CSS 덕분에, 광고 전송 서버가 아무리 지연되어도, 영역의 크기는 처음부터 단 1픽셀도 움직이지 않기 때문에, CLS 점수는 완벽한 '0.000 (만점)'을 유지할 수 있습니다.
PC에서는 아름다운 728px 배너도, 가로 폭이 375px~400px밖에 없는 스마트폰 화면에서는 그대로 표시하면 화면 오른쪽을 심하게 벗어나 불쾌한 가로 스크롤바가 나타나게 됩니다.
이를 방지하기 위해 미디어 쿼리를 이용한 축소 및 폴백 제어를 적용했습니다.
/* 모바일 대응 */
@media (max-width: 768px) {
.ad-slot.ad-728x90 {
...
}
화면 너비가 768px 이하인 모바일 기기에서 접속할 경우, 자동으로 가로 폭 100%(최대 320px)로 축소되어 스마트폰 화면 너비에 딱 맞게 조정됩니다.
트와이 채널(つゔぁいちゃんねる)의 자랑인 '다크 모드'를 열었을 때, 광고 영역만 새하얗게 빛나면 이용자의 눈이 피로해집니다.
광고 영역의 배경이나 테두리, 라벨 문자에는 모두 CSS 커스텀 프로퍼티(var(--bg-surface), var(--border-color))를 적용하여, 야간 모드로 전환되는 순간 광고 영역도 세련된 다크 네이비로 자동 조화되도록 완성했습니다.
제25회에 걸쳐는 서비스의 지속 가능성을 지탱하는 **'728x90 표준 광고 배너 헤더 내장 및 CLS 대책'**에 대해 설명했습니다.
개인 개발에서의 수익화 중요성: 자원봉사가 아닌, 서버 비용을 스스로 벌어들이는 시스템이 장기 운영의 절대 조건입니다. -
CLS(레이아웃 깨짐) 완벽 제거: 광고 영역의 높이를 사전에 CSS로 확보함으로써, Core Web Vitals 만점과 쾌적한 UX를 동시에 달성했습니다. -
반응형 및 다크 모드 적응: 화면 너비에 따른 넘침 방지와 테마 전환에 대한 자연스러운 추종.
광고 영역의 골격은 완성되었습니다.
하지만, HTML 코드에 AdSense나 제휴(affiliate) 코드를 직접 작성해 놓으면, 광고를 교체할 때마다 소스 코드를 수정하고 배포해야 합니다.
**'관리 화면에서 언제든지 원클릭으로 광고 태그를 교체/중지할 수 있는 관리 기능'**이 필요합니다.
다음 편에서는 【제26회】코드 수정 없이 자유자재로 광고를 교체하는! 관리 화면을 통한 광고 코드 일괄 관리 기능에 이어집니다!
실제 서비스: https://2ch.biz/