
본문 중간 광고가 CTR 기준으로 23% 높게 나왔을 때, 저는 솔직히 기뻤습니다. 그런데 체류 시간이 11% 떨어진 걸 보고 나서야 뭔가 잘못 재고 있다는 걸 깨달았습니다. 광고 A/B 테스트, 숫자 하나만 좇으면 반드시 틀립니다.
CTR만 보던 시절의 실수
처음에는 그냥 감으로 광고 위치를 바꿨습니다. 사이드바에 달았다가, 본문 상단으로 옮겼다가, 며칠 뒤 AdSense 대시보드 숫자를 비교하는 방식이었습니다. 직접 겪어보니 이건 의미 없는 비교였습니다. 요일, 날씨, 검색 트렌드 같은 외부 변수가 너무 많았고, 비교 대상인 두 기간의 트래픽 자체가 달랐으니까요.
CTR(Click-Through Rate)이란 광고가 노출된 횟수 대비 실제 클릭된 횟수의 비율입니다. 이 수치만 높이는 데 집중하면 문제가 생깁니다. 본문 흐름 한가운데 광고를 박아 넣으면 실수 클릭이 늘어나 CTR이 올라가지만, 독자는 맥락이 끊겨서 이탈합니다. 제가 실험에서 확인한 게 정확히 그 현상이었습니다.
RPM(Revenue Per Mille)이라는 지표도 함께 봐야 합니다. RPM은 광고 노출 1,000회당 벌어들인 수익을 나타내는 값입니다. CTR이 높아도 클릭 단가가 낮은 광고만 눌린다면 RPM은 오히려 떨어질 수 있습니다. 그래서 광고 최적화를 제대로 하려면 CTR, 이탈률, RPM 세 가지를 동시에 놓고 봐야 한다는 걸 뒤늦게 배웠습니다.
제대로 된 비교를 하려면 동일한 기간, 동일한 트래픽 조건에서 두 가지 버전을 동시에 노출해야 합니다. 그게 A/B 테스트의 기본입니다.
제대로 된 A/B 테스트 설계
저는 두 번째 실험부터 구조를 바꿨습니다. 세션 쿠키를 기준으로 홀수/짝수 그룹으로 사용자를 나눴고, 그룹 A에는 본문 상단 광고를, 그룹 B에는 본문 중간 광고를 보여줬습니다. HTML 구조는 건드리지 않고 JavaScript로 CSS 클래스를 동적으로 토글하는 방식을 썼습니다. 이렇게 하면 동일한 페이지 코드에서 두 변형을 관리할 수 있고, 사용자가 새로 고침해도 같은 버전을 계속 봅니다.
통계적 유의성(Statistical Significance)이라는 개념이 여기서 중요합니다. 통계적 유의성이란 측정된 차이가 우연이 아니라 실제로 의미 있는 차이일 확률을 말합니다. 보통 95% 이상을 기준으로 삼는데, 이 수준에 도달하려면 샘플 수가 충분해야 합니다. 저는 Evan Miller의 A/B Test Sample Size Calculator(출처: evanmiller.org)를 사용해 테스트 시작 전에 최소 샘플 수를 미리 계산했습니다. 그룹당 500클릭 이상, 기간은 최소 2주로 잡았습니다.
이벤트 트래킹은 Google Tag Manager 커스텀 이벤트로 처리했고, Google Analytics 4에서 실험 결과를 모니터링했습니다. 단순히 클릭 수만 세는 게 아니라, 클릭 후 이탈률과 세션 당 체류 시간까지 같이 끌어다 봤습니다.
A/B 테스트를 설계할 때 꼭 챙겨야 할 항목들을 정리하면 다음과 같습니다.
- 단일 변수 원칙: 광고 위치 하나만 바꾸고 나머지 조건은 동일하게 유지
- 사용자 그룹 고정: 동일 사용자가 항상 같은 변형을 보도록 localStorage 또는 쿠키에 저장
- 샘플 크기 사전 계산: 테스트 시작 전에 최소 샘플 수를 반드시 계산
- 충분한 기간 확보: 최소 2주 이상, 요일 편향을 없애기 위해 주말 포함 필수
- 다중 지표 수집: CTR, 이탈률, RPM을 동시에 측정
다중 비교 문제와 진짜 우선순위
실험 변형을 세 개, 네 개로 늘리면 어떻게 될까요. 제 경험상 이건 꽤 위험한 방향입니다. 다중 비교 문제(Multiple Comparison Problem)가 생기기 때문입니다. 다중 비교 문제란 테스트를 여러 번 반복할수록 우연히 유의미해 보이는 결과가 나올 확률이 높아지는 현상입니다. 변형이 네 개라면, 그중 하나가 순전히 운으로 좋은 수치를 보일 가능성이 생각보다 큽니다.
이걸 보정하는 방법이 Bonferroni 보정입니다. Bonferroni 보정이란 여러 개의 가설을 동시에 검정할 때 유의수준을 변형 수로 나눠서 오류 확률을 낮추는 통계 기법입니다. 예를 들어 변형이 4개라면 각 비교의 유의수준을 0.05가 아니라 0.05/4=0.0125로 잡아야 한다는 뜻입니다. 이런 처리 없이 "가장 CTR 높은 버전 채택"으로 결론 내리면 잘못된 방향으로 사이트를 고치게 됩니다. 저도 초반에 이 부분을 간과했다가 뒤늦게 다시 설계한 적이 있습니다.
테스트 결과 해석이 애매할 때는 Claude에게 수치를 그대로 넘겼습니다. "그룹 A: CTR 1.8%, 이탈률 45% / 그룹 B: CTR 2.2%, 이탈률 56%, 어느 쪽이 장기 수익에 유리한가?" 하는 식으로 물으면 단기 클릭과 장기 독자 유지율 관점을 동시에 정리해줘서 의사결정에 실제로 도움이 됐습니다.
그런데 더 솔직히 말하면, 광고 위치 최적화는 생각보다 나중 문제입니다. Google AdSense 고객센터 가이드라인에서도 트래픽이 충분히 확보된 상태에서 위치 최적화를 권장합니다(출처: Google AdSense 고객센터). 트래픽이 적은 상태에서 광고 위치를 아무리 최적화해봤자, 모수 자체가 작으면 얻을 수 있는 수익 차이도 미미합니다. 수익화의 근본은 트래픽이고, 트래픽의 근본은 콘텐츠입니다. 광고 최적화에 에너지를 쏟다 보면 정작 콘텐츠 품질을 올리는 데 써야 할 시간이 줄어듭니다. 이건 제가 직접 겪어보면서 가장 아팠던 부분입니다.
광고 A/B 테스트는 이미 충분한 트래픽이 있을 때 효과가 있는 2차 작업입니다. CTR 수치에 일희일비하기 전에, 독자가 다시 찾아오는 사이트를 만드는 게 먼저입니다. 테스트를 시작할 준비가 됐다면, 샘플 크기 계산부터 시작하고 측정할 지표를 CTR 하나로 좁히지 않는 것에서 출발하시길 권합니다.
참고:
- Google AdSense 고객센터, "광고 위치 최적화" — https://support.google.com/adsense/
- Evan Miller, "A/B Test Sample Size Calculator" — https://www.evanmiller.org/ab-testing/sample-size.html
- youngju.dev, "웹 성능 최적화 완전 가이드 2025" — https://www.youngju.dev/blog/culture/2026-04-14-web-performance-optimization-core-web-vitals-guide-2025
- nitropack.io, "What Is Lazy Loading" — https://nitropack.io/blog/what-is-lazy-loading/