블로그를 운영시 광고 지연 로딩을 Intersection Observer로 구현하여 웹 성능과 Core Web Vitals를 개선하는 실전 방법입니다.
이번글은 광고 지연 로딩을 통해 검색최적화(LCP, CLS, FID)에 미치는 영향을 줄이고, 광고 수익을 지키면서 사용자 경험을 향상시키는 방법을 다룹니다.
1. Intersection Observer로 광고 지연 로딩을 구현해야 하는 이유
광고를 설정할때 일반적으로 사용하는 광고 지연 로딩 방법(스크롤 이벤트 기반)은 빈번한 이벤트 호출로 메인 스레드 작업을 늘리고, 애니메이션과 렌더링 성능을 저하시킬 수 있습니다. 반면 광고 지연 로딩을 Intersection Observer로 처리하면 브라우저가 비동기적으로 요소의 뷰포트 진입 여부를 관찰하므로 메인 스레드 부담을 크게 줄일 수 있습니다.
특히 모바일 환경에서의 스크롤 성능과 전반적인 페이지 반응성도 개선됩니다.
Intersection Observer는 요소가 뷰포트의 어느 지점에 들어올 때를 정확하게 감지하고, 미리 정의된 마진(예: rootMargin: ‘200px 0px’)에 도달하면 광고를 로드하도록 설계할 수 있습니다. 이렇게 하면 사용자가 실제로 광고를 보기 직전에만 광고를 불러와 광고 지연 로딩의 이점의 효과를 노릴수 있습니다.
1-1. 기본 구조와 핵심 구현 패턴
기본적으로 광고가 노출되는 지점에 광고 슬롯은 플레이스홀더(광고가 들어갈 빈위치)로 남겨두고, 광고를 추가하는 방법으로 로드 여부를 결정합니다.
div id="ad-slot-1" class="ad-lazy-load" data-ad-ready="false"/div
광고를 노출하는 자바스크립트 쪽에서는 Observer 옵션을 설정하고, 콜백에서 요소가 교차하면 실제 광고 로딩 함수를 호출합니다. 이 방법은 다음과 같은 장점을 제공합니다:.
광고 로드 시점 제어, 중복 로드 방지, 폴백 처리 용이성. 요약하면, 광고 지연 로딩은 광고 호출 비용을 실사용자 시점에 맞춰 최소화합니다.
2. 광고 지연 로딩 세부 구현 방법 (핵심 코드 개요)
블로그나 사이트에서 사용할 수 있는 객체 패턴은 다음과 같습니다.
핵심은 observerCallback에서 entry.isIntersecting가 true일 때 loadAd를 호출하고, 성공 시 observer.unobserve를 호출해 추가 광고 로드 시점을 중단하는 것입니다. 이렇게 하면 한 번 로드된 슬롯이 반복 호출되는 것을 방지하며, 전체 페이지의 성능과 안정성을 확보할수 있습니다.
| 항목 | 스크롤 이벤트 방식 | Intersection Observer 방식 |
|---|---|---|
| 메인 스레드 부하 | 높음 | 낮음 |
| 정확성 | 스크롤 빈도에 의존 | 브라우저가 직접 관찰 |
| 폴백 처리 | 직접 구현 필요 | 비지원 브라우저에 대한 폴백 필요 |
아래는 핵심 옵션 권장값입니다:
root은 null로(뷰포트), rootMargin은 ‘200px 0px’ 권장, threshold는 0.01. 이 설정은 사용자가 요소를 보기 전 약간의 여유를 두고 광고를 불러와 초기 LCP 영향을 줄이는 데 도움이 됩니다. 즉, 광고 지연 로딩을 통해 첫 화면 렌더링 부담을 줄이면서 광고 전환 가능성은 용의하게 하게 합니다.
또한, 광고 로드 후에는 반드시 데이터 플래그(예: data-ad-ready)를 업데이트하고, 플레이스홀더를 적절히 제거하거나 교체하도록 합니다. 이 후속 처리는 UI 전환 시 클리킹 경험(UX)에 직접적인 영향을 줍니다.
예를 들자면 광고가 로드되기 전후의 높이 변화는 CLS(누적 레이아웃 이동)로 이어질 수 있으므로, 플레이스홀더는 고정된 높이를 갖도록 스타일링(CSS 적용)해야 합니다.

3. 광고 성능안정성수익 간 트레이드오프
광고를 완전히 지연하면 페이지 성능은 개선되지만 광고 노출 기회가 줄어들 수 있습니다. 따라서 광고 지연 로딩 구현 시에는 다음 세 가지 값을 균형 있게 고려해야 합니다:
- 로딩 시점(지연 시간): rootMargin을 사용해 뷰포트 진입 몇 픽셀 전에 로드할지 결정하세요. 너무 늦으면 광고가 표시될 기회를 놓치고, 너무 이르면 LCP에 영향이 큽니다.
- 플레이스홀더 설계: 고정 높이 플레이스홀더를 사용해 CLS를 방지하세요. 광고 로드 후 플레이스홀더를 자연스럽게 치환하면 UX가 향상됩니다.
- 폴백 전략: IntersectionObserver 미지원 브라우저에 대한 즉시 로드 또는 타이머 기반 로드 폴백을 구현하세요. 이는 수익 손실을 방지합니다.
4. 광고 최적화 체크리스트
다음은 운영 중 반드시 점검해야 할 체크리스트입니다. 각 항목은 광고 지연 로딩의 안정성과 수익성 확보에 직결됩니다.
| 점검 항목 | 권장 행동 | 우선도 |
|---|---|---|
| 플레이스홀더 높이 | 광고 슬롯의 고정 높이 지정 | 높음 |
| rootMargin 설정 | ‘100px~300px’ 범위에서 A/B 테스트 | 중 |
| 데이터 속성 관리 | data-ad-ready로 상태 관리 | 높음 |
| 오류 로깅 | 로드 실패 시 폴백 및 로그 기록 | 중 |
5. 코드 통합 및 모듈화 권장 패턴
사이트 규모가 커지면 광고 로더를 모듈화하여 BlogApp이나 SiteCore의 일부로 통합하세요. 모듈화 시 다음을 권장합니다:
초기화(init)에서 Observer를 설정, adLoader 객체를 외부에서 재사용 가능하게 노출, fail-safe(네트워크 실패 시 정적 컨텐츠 표시) 포함. 예시: BlogApp.adLoader.initObserver()를 DOMContentLoaded 또는 SPA 라우트 변경 시 호출합니다.
아래는 운영 중 바로 적용할 수 있는 최적화 팁입니다:
- 중요 광고 슬롯(예: 첫 화면 상단)은 rootMargin을 작게 하여 우선 로드.
- 비핵심 광고 슬롯은 큰 rootMargin 또는 지연 시간 설정으로 비용 절감.
- 뷰포트 내에서 빠르게 지나가는 영역(예: 스와이프 시)이 있다면 threshold를 조정해 과도한 로드를 방지.
구현 시 반드시 고려할 점: 광고 네트워크의 비동기 스크립트가 외부 리소스이므로 네트워크 블로킹을 유발하지 않도록 async 또는 defer로 로드하고, 광고 호출은 가능한 비동기 콜백으로 처리하세요. 또한, 광고 스크립트가 DOM에서 동적으로 생성한 iframe을 삽입할 때 높이와 너비가 예측 가능하도록 플레이스홀더를 설계하면 CLS를 방지할 수 있습니다.
5-1. 모니터링과 A/B 테스트
블로그에 광고 최적화를 적용후 변경 사항은 반드시 A/B 테스트와 모니터링을 통해 검증하세요. 관심 지표는 다음과 같습니다: LCP, CLS, FCP(First Contentful Paint), 광고뷰(views), 클릭률(CTR), RPM. 광고 지연 로딩 적용 전후의 지표를 비교해 로드 시점(rootMargin/threshold) 조합을 최적화합니다.
5-2. 광고 최적화 구현 샘플
요약하면 구현 절차는 다음과 같습니다.
(1) 슬롯 마크업 준비 (2) Intersection Observer 초기화 (3) entry.isIntersecting 시 loadAd 호출 (4) 로드 성공 시 observer.unobserve 및 data-ad-ready 업데이트 (5) 오류 시 폴백 처리.
!-- [1] 광고 컨테이너 (HTML) --
div id="ad-slot-1" class="ad-lazy-load" data-ad-ready="false"/div
div id="ad-slot-2" class="ad-lazy-load" data-ad-ready="false"/div
script
/
* Intersection Observer 기반 광고 지연 로딩 (Lazy Loading)
*/
(() = {
const adLoader = {
observerOptions: {
root: null, // 뷰포트를 기준
rootMargin: '200px 0px', // 200px 전 미리 로드
threshold: 0.01 // 1% 보이면 트리거
},
observerCallback(entries, observer) {
entries.forEach(entry = {
if (entry.isIntersecting) {
const adSlot = entry.target;
adLoader.loadAd(adSlot.id);
observer.unobserve(adSlot); // 한 번 로드 후 관찰 중단
}
});
},
loadAd(adSlotId) {
const adSlot = document.getElementById(adSlotId);
if (!adSlot || adSlot.dataset.adReady === 'true') return;
// 실제 광고 로드 코드 (AdSense 예시)
const ins = document.createElement('ins');
ins.className = 'adsbygoogle';
ins.style.display = 'block';
ins.setAttribute('data-ad-client', 'ca-pub-XXXXXXXXXXXXXXX'); // ▶ 자신의 ID 입력
ins.setAttribute('data-ad-slot', '1234567890'); // ▶ 광고 슬롯 ID
ins.setAttribute('data-ad-format', 'auto');
ins.setAttribute('data-full-width-responsive', 'true');
adSlot.appendChild(ins);
try {
(adsbygoogle = window.adsbygoogle || []).push({});
console.log(`Lazy Loaded Ad: $adSlotId}`);
} catch (e) {
console.warn(`광고 로드 실패: $adSlotId}`, e);
}
adSlot.dataset.adReady = 'true';
},
initObserver() {
const slots = document.querySelectorAll('.ad-lazy-load[data-ad-ready="false"]');
if (!('IntersectionObserver' in window)) {
console.log('IntersectionObserver 미지원 브라우저: 모든 광고 즉시 로드');
slots.forEach(slot = adLoader.loadAd(slot.id));
return;
}
const observer = new IntersectionObserver(adLoader.observerCallback, adLoader.observerOptions);
slots.forEach(slot = observer.observe(slot));
console.log(`광고 $slots.length}개 관찰 시작`);
}
};
// 페이지 로드 완료 시 광고 지연 로딩 초기화
window.addEventListener('load', () = adLoader.initObserver());
})();
/script
광고 지연 로딩은 단순한 기술적 트릭이 아니라 사용자 경험(UX)과 수익성의 균형을 맞추는 전략적 선택입니다. 광고 지연 로딩은 LCP를 개선하고, 불필요한 리소스 호출을 줄이며, 사용자 이탈을 낮춰 궁극적으로 수익 안정화에 기여할수 있습니다. 운영자 입장에서는 광고 지연 로딩의 적절한 rootMargin 설정, 플레이스홀더 높이 확보, 폴백 처리 세 가지를 철저히 관리해 보세요!
Q1: Intersection Observer를 지원하지 않는 브라우저에서 어떻게 처리해야 하나요?
A1: Intersection Observer 미지원 브라우저를 위해 폴백을 구현하세요. 폴백 예시로는 페이지 로드 시 모든 광고를 즉시 로드하거나, 일정 시간(예: 2초) 후에 광고를 로드하는 타이머 기반 로직을 적용할 수 있습니다. 또한, 사용자의 에이전트 정보를 바탕으로 조건부로 폴백 행동을 선택하면 됩니다.
Q2: 광고 지연 로딩이 광고 수익에 악영향을 주진 않나요?
A2: 적절하게 설정된 광고 지연 로딩은 노출 기회를 지나치게 줄이지 않으면서도 초기 페이지 성능을 개선합니다. 핵심은 rootMargin과 threshold를 조절하여 ‘보여질 가능성이 높은 시점’에 광고를 로드하는 것입니다. A/B 테스트를 통해 최적의 균형점을 찾는 것이 중요합니다.
Q3: 플레이스홀더로 어떤 것을 사용해야 CLS를 예방할 수 있나요?
A3: 플레이스홀더는 광고가 차지할 정확한 공간(높이/너비)을 사전에 확보해야 합니다. 고정된 높이 값을 CSS로 설정하거나, 비율 기반 박스(예: aspect-ratio)로 공간을 예약하면 광고 로드 전후의 레이아웃 변동을 줄일 수 있습니다.
요약 강조: 광고 지연 로딩의 성공 포인트는 정확한 로드 시점, 안정적 플레이스홀더, 신속한 폴백입니다. 반복적으로 점검하고 개선하면, 광고 지연 로딩은 페이지 성능과 광고 수익 모두에 긍정적 결과를 가져옵니다.