treeru.com
개발

PageSpeed Insights API 자동화 — 전체 사이트 성능을 한 눈에

2026-02-15
Treeru

사이트에 페이지가 수십 개 있으면 매번 수동으로 PageSpeed를 돌리기 어렵습니다.PageSpeed Insights API v5를 활용하면 전체 사이트의 성능을 자동으로 측정하고, 결과를 리포트로 정리하고, 관리자 UI에서 원클릭으로 실행할 수 있습니다. 수동 측정 시절에서 벗어나는 방법을 정리했습니다.

자동

전체 페이지 측정

마크다운

리포트 생성

원클릭

관리자 UI

무료

API 비용

1API 키 발급 및 설정

PageSpeed Insights API는 Google Cloud Console에서 API 키를 발급받아 사용합니다. API 키 없이도 호출은 가능하지만, 일일 쿼터가 매우 제한적이므로 키를 발급받는 것을 권장합니다.

API 키 발급 과정

1

Google Cloud Console에 접속하여 프로젝트 생성

2

APIs & Services → Library에서 'PageSpeed Insights API' 검색 및 활성화

3

APIs & Services → Credentials에서 'Create Credentials → API key' 선택

4

발급된 API 키를 환경변수에 저장 (PAGESPEED_API_KEY)

5

보안을 위해 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~100Good우수한 성능
50~89Needs Improvement개선 필요
0~49Poor즉시 개선 필요

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;
}

리포트 출력 예시

페이지성능접근성BPSEOLCP
/921001001001.2s
/blog88961001001.8s
/services76100961002.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 자동화 도구 구축부터 성능 최적화 컨설팅까지 제공합니다. 전체 사이트의 성능을 체계적으로 관리하세요.

성능 최적화 상담 신청
T

Treeru

웹 개발, IT 인프라, AI 솔루션 분야의 실무 인사이트를 공유합니다. 기업의 디지털 전환을 돕는 IT 파트너, Treeru입니다.

공유

댓글

(5개)
4.60/ 5

로그인하면 댓글을 작성할 수 있습니다.

2026-02-27
4.554.5

쿼터 관리 부분이 중요합니다. 무료 API 한도가 생각보다 낮아서, 페이지 수가 많은 사이트는 측정 간격을 잘 조절해야 하더라고요.

2026-02-25
555.0

관리자 UI에 원클릭 측정 버튼을 넣은 게 실전적입니다. 비개발자도 성능 현황을 바로 확인할 수 있어서 커뮤니케이션 비용이 줄었어요.

2026-02-22
454.0

마크다운 리포트를 Slack에 자동으로 보내고 있는데, 팀 전체가 성능 현황을 공유할 수 있어서 좋습니다. 점수 떨어지면 바로 대응할 수 있어요.

관련 글

© 2026 TreeRU. All rights reserved.

본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.