PageSpeed Insights API 자동화 — 전체 사이트 성능을 한 눈에
사이트에 페이지가 수십 개 있으면 매번 수동으로 PageSpeed를 돌리기 어렵습니다.PageSpeed Insights API v5를 활용하면 전체 사이트의 성능을 자동으로 측정하고, 결과를 리포트로 정리하고, 관리자 UI에서 원클릭으로 실행할 수 있습니다. 수동 측정 시절에서 벗어나는 방법을 정리했습니다.
자동
전체 페이지 측정
마크다운
리포트 생성
원클릭
관리자 UI
무료
API 비용
1API 키 발급 및 설정
PageSpeed Insights API는 Google Cloud Console에서 API 키를 발급받아 사용합니다. API 키 없이도 호출은 가능하지만, 일일 쿼터가 매우 제한적이므로 키를 발급받는 것을 권장합니다.
API 키 발급 과정
Google Cloud Console에 접속하여 프로젝트 생성
APIs & Services → Library에서 'PageSpeed Insights API' 검색 및 활성화
APIs & Services → Credentials에서 'Create Credentials → API key' 선택
발급된 API 키를 환경변수에 저장 (PAGESPEED_API_KEY)
보안을 위해 API 키에 HTTP referrer 또는 IP 제한 설정 권장
API 키를 코드에 하드코딩하지 마세요
API 키는 반드시 환경변수로 관리하고, Git에 커밋하지 않아야 합니다. 키가 노출되면 타인이 쿼터를 소진시킬 수 있습니다.
2API 호출 구현
PageSpeed Insights API v5는 REST API로, URL과 전략(모바일/데스크톱)을 파라미터로 전달하면 Lighthouse 기반의 성능 측정 결과를 JSON으로 반환합니다.
lib/pagespeed.ts — API 호출 함수
interface PageSpeedResult {
url: string;
strategy: "mobile" | "desktop";
scores: {
performance: number;
accessibility: number;
bestPractices: number;
seo: number;
};
metrics: {
fcp: string; // First Contentful Paint
lcp: string; // Largest Contentful Paint
cls: string; // Cumulative Layout Shift
tbt: string; // Total Blocking Time
};
}
export async function measurePageSpeed(
url: string,
strategy: "mobile" | "desktop" = "mobile"
): Promise<PageSpeedResult> {
const apiKey = process.env.PAGESPEED_API_KEY;
const apiUrl = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
+ `?url=${encodeURIComponent(url)}`
+ `&strategy=${strategy}`
+ `&key=${apiKey}`
+ "&category=performance&category=accessibility"
+ "&category=best-practices&category=seo";
const res = await fetch(apiUrl);
const data = await res.json();
const categories = data.lighthouseResult.categories;
const audits = data.lighthouseResult.audits;
return {
url,
strategy,
scores: {
performance: Math.round(categories.performance.score * 100),
accessibility: Math.round(categories.accessibility.score * 100),
bestPractices: Math.round(categories["best-practices"].score * 100),
seo: Math.round(categories.seo.score * 100),
},
metrics: {
fcp: audits["first-contentful-paint"].displayValue,
lcp: audits["largest-contentful-paint"].displayValue,
cls: audits["cumulative-layout-shift"].displayValue,
tbt: audits["total-blocking-time"].displayValue,
},
};
}| 점수 범위 | 등급 | 의미 |
|---|---|---|
| 90~100 | Good | 우수한 성능 |
| 50~89 | Needs Improvement | 개선 필요 |
| 0~49 | Poor | 즉시 개선 필요 |
3전체 페이지 순차 측정
사이트의 모든 페이지를 한 번에 측정하려면 병렬이 아닌 순차 측정이 필요합니다. PageSpeed API는 요청당 20~30초가 걸리고, 병렬 호출하면 쿼터를 빠르게 소진합니다.
전체 페이지 순차 측정
const pages = [
{ url: "https://example.com/", name: "홈" },
{ url: "https://example.com/blog", name: "블로그" },
{ url: "https://example.com/services", name: "서비스" },
{ url: "https://example.com/support", name: "고객지원" },
// ... 전체 페이지 목록
];
async function measureAll() {
const results: PageSpeedResult[] = [];
for (const page of pages) {
console.log(`측정 중: ${page.name} (${page.url})`);
try {
const result = await measurePageSpeed(page.url, "mobile");
results.push(result);
console.log(` 성능: ${result.scores.performance}점`);
} catch (error) {
console.error(` 측정 실패: ${page.name}`);
}
// API 쿼터 보호를 위한 딜레이 (3초)
await new Promise(resolve => setTimeout(resolve, 3000));
}
return results;
}측정 간격에 3초 이상의 딜레이를 넣으세요
PageSpeed API는 각 호출마다 실제 Lighthouse 분석을 수행하므로 응답이 느립니다. 요청 간 딜레이 없이 연속 호출하면 429(Too Many Requests) 에러가 발생합니다. 3~5초 딜레이를 넣으면 안정적으로 동작합니다.
4마크다운 리포트 생성
측정 결과를 마크다운 형식으로 저장하면 Git에 커밋하거나 Slack에 공유하기 편합니다. 테이블 형태로 정리하면 전체 사이트의 성능 현황을 한눈에 파악할 수 있습니다.
마크다운 리포트 생성
function generateMarkdownReport(
results: PageSpeedResult[]
): string {
const date = new Date().toISOString().split("T")[0];
let md = `# PageSpeed 측정 리포트\n`;
md += `측정일: ${date}\n\n`;
md += `| 페이지 | 성능 | 접근성 | BP | SEO | LCP |\n`;
md += `|--------|------|--------|-----|-----|-----|\n`;
for (const r of results) {
const path = new URL(r.url).pathname || "/";
md += `| ${path} `;
md += `| ${r.scores.performance} `;
md += `| ${r.scores.accessibility} `;
md += `| ${r.scores.bestPractices} `;
md += `| ${r.scores.seo} `;
md += `| ${r.metrics.lcp} |\n`;
}
// 평균 점수
const avg = results.reduce(
(sum, r) => sum + r.scores.performance, 0
) / results.length;
md += `\n**평균 성능 점수: ${Math.round(avg)}점**\n`;
return md;
}리포트 출력 예시
| 페이지 | 성능 | 접근성 | BP | SEO | LCP |
|---|---|---|---|---|---|
| / | 92 | 100 | 100 | 100 | 1.2s |
| /blog | 88 | 96 | 100 | 100 | 1.8s |
| /services | 76 | 100 | 96 | 100 | 2.4s |
5관리자 UI 통합
어드민 패널에 PageSpeed 측정 기능을 넣으면 비개발자도 성능 현황을 쉽게 확인할 수 있습니다. "전체 측정" 버튼 하나로 모든 페이지의 성능을 측정하고 결과를 표시합니다.
어드민 PageSpeed 페이지 (간소화)
"use client";
import { useState } from "react";
export default function PageSpeedAdmin() {
const [results, setResults] = useState([]);
const [measuring, setMeasuring] = useState(false);
const [progress, setProgress] = useState("");
const handleMeasure = async () => {
setMeasuring(true);
setProgress("측정 시작...");
const res = await fetch("/api/admin/pagespeed", {
method: "POST",
});
// Server-Sent Events로 진행 상황 수신
const reader = res.body?.getReader();
// ... 결과 처리 ...
setMeasuring(false);
};
return (
<div>
<h1>PageSpeed 측정</h1>
<button
onClick={handleMeasure}
disabled={measuring}
>
{measuring ? progress : "전체 페이지 측정"}
</button>
{/* 결과 테이블 */}
</div>
);
}측정 진행 상황을 실시간으로 표시하세요
페이지가 20개면 측정에 몇 분이 걸립니다. Server-Sent Events(SSE)나 폴링으로 "3/20 측정 중: /blog" 같은 진행 상황을 표시하면 사용자 경험이 좋아집니다.
6쿼터 관리와 주의사항
PageSpeed Insights API는 무료지만 일일 쿼터가 있습니다. 과도한 호출을 방지하고 안정적으로 운영하려면 쿼터를 관리해야 합니다.
| 항목 | API 키 없음 | API 키 있음 |
|---|---|---|
| 일일 쿼터 | ~50회 | 25,000회 |
| 분당 제한 | ~5회 | ~60회 |
| 응답 시간 | 10~30초 (페이지 복잡도에 따라) | |
| 비용 | 완전 무료 | |
# 쿼터 초과 방지 팁
// 1. 요청 간 딜레이 (최소 3초)
await new Promise(r => setTimeout(r, 3000));
// 2. 일일 측정 횟수 제한
const MAX_DAILY_MEASUREMENTS = 100;
const todayCount = await getTodayMeasurementCount();
if (todayCount >= MAX_DAILY_MEASUREMENTS) {
throw new Error("일일 측정 한도 초과");
}
// 3. 결과 캐싱 (같은 URL을 중복 측정 방지)
const cached = await getCachedResult(url);
if (cached && isRecent(cached, 24)) { // 24시간 이내
return cached;
}측정 결과는 매번 달라질 수 있습니다
PageSpeed 점수는 네트워크 상태, 서버 부하, CDN 캐시 등에 따라 매번 조금씩 달라집니다. 3~5회 측정 후 평균값을 사용하면 더 정확한 결과를 얻을 수 있습니다. 단, 쿼터 소모가 늘어나므로 중요한 페이지에만 복수 측정을 적용하세요.
요약 체크리스트
PageSpeed API 자동화 핵심 요약
- ✓Google Cloud Console에서 API 키를 발급받아 환경변수로 관리한다
- ✓API 호출 함수를 만들어 성능, 접근성, SEO 점수를 파싱한다
- ✓전체 페이지를 순차 측정하고 3초 이상 딜레이를 넣는다
- ✓마크다운 리포트를 생성하여 Git 커밋 또는 Slack 공유한다
- ✓어드민 UI에 원클릭 측정 기능을 통합한다
- ✓일일 쿼터를 관리하고 결과를 캐싱하여 중복 측정을 방지한다
본 글은 PageSpeed Insights API v5 기준으로 작성되었습니다. API 스펙, 쿼터 정책은 Google에 의해 변경될 수 있으므로 공식 문서를 참고하시기 바랍니다. 본 콘텐츠의 비상업적 공유는 자유이나, 상업적 이용 시 문의 페이지를 통해 연락 바랍니다.
사이트 성능 최적화가 필요하신가요?
Treeru는 PageSpeed 자동화 도구 구축부터 성능 최적화 컨설팅까지 제공합니다. 전체 사이트의 성능을 체계적으로 관리하세요.
성능 최적화 상담 신청댓글
(5개)로그인하면 댓글을 작성할 수 있습니다.
쿼터 관리 부분이 중요합니다. 무료 API 한도가 생각보다 낮아서, 페이지 수가 많은 사이트는 측정 간격을 잘 조절해야 하더라고요.
관리자 UI에 원클릭 측정 버튼을 넣은 게 실전적입니다. 비개발자도 성능 현황을 바로 확인할 수 있어서 커뮤니케이션 비용이 줄었어요.
마크다운 리포트를 Slack에 자동으로 보내고 있는데, 팀 전체가 성능 현황을 공유할 수 있어서 좋습니다. 점수 떨어지면 바로 대응할 수 있어요.
관련 글
© 2026 TreeRU. All rights reserved.
본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.