AdSense

AdSense 등록 전 Astro 블로그에서 준비할 것

AdSense 승인 전에 광고 스위치, CLS 방지 공간, 공통 스크립트와 동의 절차를 어떻게 준비했는지 실제 Astro 구성으로 설명한다.

이 글의 목차AdSense는 광고 상자 하나를 붙이는 기능이 아니다8
  1. AdSense는 광고 상자 하나를 붙이는 기능이 아니다
  2. 광고 전체를 한 파일에서 끌 수 있게 했다
  3. CLS를 줄이려고 광고 공간을 미리 잡았다
  4. AdSense 스크립트는 공통 레이아웃에서 한 번만 읽었다
  5. 동의 준비가 끝나기 전에는 광고 요청을 막았다
  6. 자동 광고와 직접 배치 중 무엇부터 쓸 것인가
  7. 승인 뒤 실제로 켜는 순서
  8. 참고 자료

이 블로그에는 아직 실제 광고가 나오지 않는다.
AdSense 승인을 받기도 전에 스크립트부터 붙이면 광고가 늦게 나타나며 본문을 밀거나, 동의 절차가 준비되지 않은 상태에서 외부 요청이 나갈 수 있다.
그 순서로 시작하고 싶지는 않았다.

그래서 광고를 켜기 전에 네 가지를 먼저 만들었다.
사이트 설정 한 곳에서 광고 전체를 끄는 스위치, 광고가 들어올 예약 공간, 외부 스크립트를 한 번만 불러오는 구조, 동의 준비가 끝나지 않으면 광고 요청을 막는 게이트다.

현재 src/config.ts에는 사이트 확인에 사용할 게시자 ID가 들어 있지만 AdSense 스위치는 false이고 실제 광고 위치를 가리키는 슬롯 ID는 비어 있다.
동의 공급자와 동의 메시지도 아직 활성화하지 않았다.
이 글은 광고를 운영해 수익을 낸 기록이 아니라, 승인을 받은 뒤에도 준비된 조건 안에서만 광고가 켜지도록 만든 과정이다.

AdSense는 광고 상자 하나를 붙이는 기능이 아니다

AdSense는 Google이 사이트의 광고 공간과 광고주를 연결하고, 실제 노출과 클릭을 집계하는 광고 플랫폼이다.
블로그 코드가 광고 이미지를 직접 골라 내려주는 구조가 아니다.
방문자의 브라우저가 Google 스크립트를 읽고, 페이지 안의 광고 위치를 찾은 뒤, 게재 가능한 광고가 있을 때 그 결과를 받아 표시한다.

처음 접하면 아래 네 단계를 하나의 작업으로 보기 쉽다.

단계하는 일이 블로그에서 확인할 것
사이트 검토Google에 사이트를 추가하고 정책·콘텐츠 검토를 받는다공개 글, 탐색 구조, 개인정보처리방침
광고 코드브라우저가 AdSense 스크립트를 읽게 한다중복 로드 여부와 동의 조건
광고 위치광고가 들어갈 영역을 정한다본문을 가리지 않는 위치와 예약 높이
운영 측정실제 노출 뒤 수익과 화면 품질을 관찰한다채움 상태, CLS, 모바일 가독성

승인이 났다는 사실은 네 단계를 모두 검증했다는 뜻이 아니다.
광고 코드가 잘못 들어가도 사이트 검토는 통과할 수 있고, 광고가 표시돼도 늦게 생긴 영역 때문에 본문이 움직일 수 있다.
그래서 계정 등록과 화면 구현, 개인정보 동의, 성능 측정을 각각 다른 배포 단계로 나눴다.

뉴스처럼 광고 위치가 많은 사이트와 개인 기술 블로그의 기준도 다르다.
이곳에서는 한 페이지의 광고 수를 먼저 늘리기보다 글을 다 읽은 뒤의 슬롯과 홈 피드 뒤 슬롯만 준비했다.
코드 예제를 읽는 중간에 광고가 끼어 문맥이 끊기는 것보다, 적은 위치를 안정적으로 운영한 뒤 데이터를 보고 늘리는 편이 목적에 맞았다.

광고 전체를 한 파일에서 끌 수 있게 했다

광고 설정은 src/config.ts에 있다.
현재 값을 줄여 보면 다음과 같다.

src/config.tsTypeScript단순화 예시
adsense: {
  enabled: false,
  publisherId: 'ca-pub-…',
  slots: {
    articleAfterBody: '',
    homeAfterFeed: '',
  },
},

게시자 ID는 설정돼 있어 계정 확인용 <meta name="google-adsense-account">는 배포 HTML에 들어간다.
그러나 동의 게이트가 준비되지 않았거나 enabled가 꺼져 있으면 AdSense 외부 스크립트는 읽지 않는다.
광고 요소는 이 조건들에 더해 해당 위치의 슬롯 ID까지 있어야 만들어진다.
현재는 슬롯 ID도 비어 있어 광고 요청이 나가지 않는다.

개발 환경에서 주소 뒤에 ?previewAds=1을 붙였을 때만 위치 확인용 미리보기를 보여 주고, 실제 광고 요청은 보내지 않는다.
승인 전 상태와 운영 상태를 코드 곳곳의 조건문으로 나누지 않아도 되는 이유다.

게시자 ID는 AdSense 계정을 가리키고, 슬롯 ID는 글 하단이나 홈 피드처럼 광고 위치를 구분한다.
승인 뒤에도 모든 위치를 한꺼번에 열지 않고, 슬롯 하나부터 모바일과 데스크톱에서 확인하도록 했다.

CLS를 줄이려고 광고 공간을 미리 잡았다

광고는 내 서버의 본문보다 늦게 도착할 수 있다.
그때 갑자기 높이가 생기면 읽던 문장이 아래로 밀린다.
이런 예상치 못한 화면 이동을 수치로 나타낸 것이 CLS(Cumulative Layout Shift)다.

광고 공간을 예약하지 않은 화면과 250픽셀 영역을 미리 확보한 화면의 본문 이동 비교
광고가 늦게 도착해도 미리 확보한 영역 안에 표시되면 읽던 본문이 움직일 가능성을 줄일 수 있다.

현재 AdSlot.astro는 광고를 받기 전에도 최소 높이를 둘 수 있게 만들었다.
글 본문이 끝난 뒤에는 250px, 홈의 글 목록 아래에는 180px을 예약한다.
JavaScript로 광고를 본문 중간에 옮기지 않아 스크립트 실행 여부와 제목 개수에 따라 위치가 달라지지 않는다.

현재 배치 값의 일부Astro단순화 예시
<AdSlot
  slot={SITE.adsense.slots.articleAfterBody}
  minHeight={250}
/>
<AdSlot
  slot={SITE.adsense.slots.homeAfterFeed}
  minHeight={180}
/>

250px이 모든 광고에 맞는 표준 높이라는 뜻은 아니다.
공간이 작으면 광고가 온 뒤 다시 밀리고, 지나치게 크면 광고가 채워지지 않았을 때 빈 영역만 남는다.
지금 값은 배치를 검토하기 위한 예약값이며, 실제 광고 형식을 정한 뒤 화면 크기별로 다시 확인한다.

CLS는 한 번의 이동 거리를 재는 값이 아니라, 방문 중 예상하지 못한 레이아웃 이동을 묶어 계산하는 웹 성능 지표다.
버튼을 누른 뒤 사용자가 예상한 이동은 같은 방식으로 취급되지 않지만, 읽는 도중 광고가 도착해 문장이 밀리는 이동은 사용자 경험을 해칠 수 있다.
이 때문에 광고가 채워질지 알 수 없는 상태에서도 슬롯 크기는 먼저 정한다.

개발자 도구의 Lighthouse 결과는 배포 전 문제를 찾는 실험실 측정이다.
실제 방문자의 기기와 통신 속도에서 어떤 이동이 생겼는지는 운영 뒤 Chrome 사용자 경험 보고서나 Search Console의 Core Web Vitals 같은 현장 데이터를 함께 봐야 한다.
아직 트래픽 데이터가 없는 지금은 “CLS를 해결했다”고 단정하지 않고, 이동이 생길 원인을 코드에서 줄였다고만 말할 수 있다.

AdSense 스크립트는 공통 레이아웃에서 한 번만 읽었다

AdSense 스크립트는 동의 게이트가 준비되고 enabledpublisherId가 모두 채워졌을 때만 BaseLayout.astro에서 한 번 불러오도록 했다.
글 안에 광고 슬롯이 두 개 있어도 같은 외부 파일을 슬롯마다 다시 추가하지 않는다.
AdSlot은 자신의 위치 정보만 전달하고, 공통 레이아웃이 이미 읽어 둔 스크립트를 사용한다.

외부 JavaScript와 광고 이미지는 여전히 페이지 자원을 사용한다.
이 구조로 광고의 성능 비용이 사라지는 것은 아니지만, 같은 스크립트를 슬롯마다 중복해서 읽는 일은 막을 수 있다.

동의 준비가 끝나기 전에는 광고 요청을 막았다

광고를 켜는 값과 방문자의 동의를 받는 절차는 별개다.
현재 consent.providernone이고 googleMessagePublishedfalse다.
그래서 enabled만 실수로 켜도 AdSense 스크립트는 로드되지 않는다.

CMP 공급자와 동의 메시지 게시, AdSense enabled, 게시자 ID 네 조건이 모두 충족되어야 공통 스크립트를 한 번 불러오고 슬롯 ID가 있는 위치에만 광고 요소를 만드는 게이트 흐름
광고 스위치 하나가 아니라 동의 준비와 ID가 모두 갖춰져야 외부 스크립트와 광고 요소가 생긴다.

CMP(Consent Management Platform)는 방문자에게 광고·쿠키 사용 여부를 묻고 그 선택을 광고 시스템에 전달하는 동의 관리 도구다.
TCF(Transparency and Consent Framework)는 광고 생태계의 여러 참여자가 그 동의 신호를 같은 형식으로 주고받기 위해 IAB가 만든 규격이다.

2026년 7월 기준 Google은 EEA(유럽경제지역)·영국·스위스 사용자에게 개인 맞춤 광고를 게재할 때 Google 인증 CMP와 TCF 통합을 요구한다.
정확한 지역·광고 유형별 조건은 Google의 게시자용 CMP 요구사항광고 개인 최적화 설정 안내를 기준으로 확인한다.
Google 인증은 CMP의 TCF 연동 기준을 확인하는 절차이지, 개별 사이트의 법률 준수 전체를 대신 판단해 주는 것은 아니다.
동의 화면만 게시하는 것으로 끝내지 않고, 거절과 나중의 철회까지 실제 브라우저에서 동작하는지 시험해야 한다.

광고 레이블도 임의로 정하지 않았다.
Google의 광고 게재위치 정책에 맞춰 컴포넌트의 기본 문구를 Advertisements로 두고, 메뉴나 다운로드 링크가 광고처럼 보이지 않는지도 활성화 전에 확인한다.

자동 광고와 직접 배치 중 무엇부터 쓸 것인가

AdSense의 자동 광고는 Google이 페이지 구조를 분석해 광고 위치와 형식을 제안·배치하는 방식이다.
직접 배치는 사이트 운영자가 만든 광고 단위를 원하는 위치에 넣는 방식이다.
둘 중 하나가 항상 더 높은 수익이나 더 좋은 화면을 보장하지는 않는다.

자동 광고는 여러 화면을 빠르게 시험하고 위치별 운영을 Google에 맡기고 싶을 때 편하다.
반면 긴 코드 블록, 표와 설명 이미지가 많은 기술 글에서는 광고가 문맥을 어디서 끊는지 세밀하게 확인하기 어렵다.
직접 배치는 위치가 예측 가능하지만 모바일·데스크톱의 빈 공간과 채움률을 운영자가 직접 살펴야 한다.

이 블로그는 처음부터 두 방식을 섞지 않는다.
우선 글 하단의 직접 배치 한 곳만 활성화하고 다음 항목을 확인한 뒤 홈이나 다른 위치를 검토한다.

  • 광고가 없어도 지나친 빈 공간이 남지 않는가
  • 광고가 늦게 도착해도 본문과 버튼이 움직이지 않는가
  • 모바일에서 광고가 화면 폭을 넘거나 글 읽기를 막지 않는가
  • 동의를 거부한 방문자에게 의도하지 않은 광고 요청이 나가지 않는가
  • 광고를 콘텐츠나 탐색 버튼으로 오해할 표현이 없는가

수익을 비교할 때도 페이지 조회 수 하나만 보면 부족하다.
광고 요청, 실제로 채워진 노출, 광고 위치별 수익과 해당 페이지의 이탈·성능 변화를 같은 기간에 봐야 한다.
아직 광고를 켜지 않은 이 글에는 그런 운영 결과가 없으므로, 자동 광고와 직접 배치의 수익 차이를 추정해 쓰지 않았다.

승인 뒤 실제로 켜는 순서

광고 위치와 중단 스위치, 동의 게이트를 만든 뒤 활성화 순서도 체크리스트로 고정했다.

  1. AdSense 승인과 게시자 ID를 확인한다.
  2. 실제 사용할 위치의 슬롯 ID만 한 개부터 입력한다.
  3. Google Privacy & messaging의 동의 메시지를 게시한다.
  4. 동의와 철회 경로를 실제 브라우저에서 시험한다.
  5. 개인정보처리방침을 실제 수집 내용에 맞게 갱신한다.
  6. 모바일과 데스크톱에서 빈 광고·채워진 광고·요청 실패 상태의 화면 이동을 확인한다.
  7. 모든 항목을 통과한 뒤에만 provider, googleMessagePublished, enabled를 활성화한다.

한 단계라도 빠지면 다시 끈 상태로 둔다.
현재 코드에서 확인한 결과는 게시자 ID 메타 태그만 출력되고, 동의 게이트·enabled·슬롯 ID가 준비되지 않아 외부 광고 스크립트와 광고 요소는 만들어지지 않는다는 것이다.

실제 노출량과 수익, 광고를 채운 뒤의 CLS는 운영 데이터가 생긴 뒤 측정한다.
그 수치를 미리 예상하는 대신, 지금은 문제가 생기면 enabled 하나로 광고 요청 전체를 멈출 수 있게 했다.

AdSense를 붙일 때 가장 먼저 만든 것은 광고 슬롯이 아니었다.
위치와 동의, 그리고 준비가 덜 됐을 때 즉시 멈출 수 있는 스위치였다.
실제 광고는 그 조건을 모두 통과한 뒤 마지막에 연다.

참고 자료

소신을 상징하는 고래 일러스트
작성자소신 · Soshin

직접 부딪힌 문제와 해결 과정을 다음에 다시 꺼내 볼 수 있도록 기록합니다.