Vercel 청구서가 갑자기 비싸졌다면 — 바이브코더를 위한 비용 절감 체크리스트

최근 회사에서 운영 중인 여러 Vercel 프로젝트들의 비용을 점검할 일이 있었습니다. 들여다보다 보니 "어, 이거 다른 분들도 한 번쯤 점검해보면 좋겠는데?" 싶은 패턴들이 보이더라고요. 그래서 정리해서 공유드립니다.

바이브코딩으로 빠르게 배포할 때 가장 많이 쓰는 서비스가 Vercel이죠. 그런데 어느 날 청구서를 받아보면 "어? 내가 이렇게 많이 썼나?" 싶을 때가 있습니다. 대부분은 코드가 무거워진 게 아니라 배포가 너무 자주 일어났거나, AI가 자동으로 짠 코드가 비싼 패턴이라서인데요. 이 글에서는 그걸 줄이는 방법을 함께 정리해 보려고 합니다.

왜 청구서가 갑자기 뛸까요

Vercel은 "쓴 만큼 낸다"가 기본입니다. 무료 한도가 넉넉해서 처음에는 잘 체감되지 않지만, 프로젝트가 늘고 자동화가 붙기 시작하면 비용이 슬금슬금 올라가게 됩니다.

실무에서 자주 보이는 폭증 패턴은 보통 다섯 가지 중 하나입니다.

  • Dependabot 같은 자동 업데이트 봇이 매일 PR을 만들고, 그때마다 미리보기 빌드가 돕니다
  • 모노레포에서 한 줄만 고쳐도 전체 프로젝트가 다 빌드됩니다
  • AI가 짜준 코드의 ISR 값이 너무 짧게 설정되어 있어요 (revalidate: 60 같은 거)
  • AI 봇 크롤러(GPTBot, ClaudeBot, Bytespider 등)가 사이트를 들쑤시고 다닙니다
  • 스프린트 마감에 PR 여러 개를 한꺼번에 머지해서 빌드가 줄줄이 큐에 쌓입니다

저도 최근에 운영하는 한 팀에서 이런 패턴이 겹쳐서 청구서가 평소보다 꽤 많이 나온 적이 있었습니다. 분석해 보니 코드 변화는 거의 없었고, "빌드 횟수"와 "함수 호출 수"만 폭증해 있더라고요. 다행히 줄이는 건 의외로 간단했습니다.

Vercel은 어떤 식으로 돈을 매길까요

2026년 기준 Vercel Pro 플랜에서 돈이 빠지는 곳은 크게 네 곳입니다.

  • 빌드 시간 (Build Time) — 배포할 때마다 빌드 머신이 도는 시간
  • 함수 실행 (Function Duration) — API route, Server Action 등이 실행되는 시간
  • 트래픽 (Bandwidth, Fast Data Transfer) — 사용자에게 전송된 데이터양
  • 이미지 최적화 — next/image로 변환된 이미지 횟수

바이브코딩하는 분이 갑자기 비싸졌다면, 빌드 시간과 함수 실행 시간 두 곳이 가장 의심됩니다. 함수가 느려지거나 트래픽이 폭증하는 건 보통 직접 인지하시지만, 빌드가 자기도 모르게 하루 수십 번씩 도는 것과, AI가 짜준 코드의 함수 호출이 폭주하는 건 잘 안 보이거든요.

참고: 2025년 4월부터 신규 Vercel 프로젝트는 Fluid Compute가 기본으로 켜져 있습니다. AI/LLM 호출처럼 외부 응답을 기다리는 시간이 많은 함수는 그 대기 시간을 과금하지 않게 됩니다. 그 이전에 만든 프로젝트는 Settings → Functions에서 수동으로 켜주셔야 합니다.

실전 절감 — 쉬운 것부터 해보세요

1. AI가 짜준 코드의 revalidate 값부터 확인하기 ★ 가장 중요

이게 바이브코더에게 가장 흔한 빌쇼크 원인입니다. AI 툴(Cursor, Claude, GPT)이 Next.js 페이지를 짜줄 때 별 생각 없이 revalidate: 60을 박아 넣는 경우가 정말 많거든요.

// AI가 자주 만들어주는 패턴
export const revalidate = 60; // 60초마다 재생성

이게 무슨 뜻이냐 하면, 트래픽이 들어올 때마다 1분에 한 번씩 페이지를 다시 만들고 있다는 의미입니다. 블로그처럼 하루에 한 번 바뀌는 콘텐츠라면 완전히 과한 설정이에요.

실제 콘텐츠 변경 빈도에 맞춰 이렇게 바꿔주시면 함수 호출 수가 극적으로 줄어듭니다.

export const revalidate = 3600;  // 1시간에 한 번 (대부분의 경우)
// 또는
export const revalidate = 86400; // 하루에 한 번 (정적 콘텐츠)

프로젝트 전체에 grep "revalidate" 한 번 돌려보시는 걸 추천드립니다. 60이나 1로 박혀 있는 곳이 있다면 바로 손볼 만한 자리예요.

2. Dependabot 미리보기 빌드 끄기

Dependabot이 만드는 PR은 대부분 패키지 버전을 살짝 올리는 정도입니다. 미리보기 환경에서 직접 확인할 일이 거의 없는데, 빌드는 정직하게 매번 돌고 있죠.

Vercel 프로젝트 설정 → Git → Ignored Build Step에 한 줄만 넣으시면 됩니다.

if [[ "$VERCEL_GIT_COMMIT_REF" == dependabot/* ]]; then exit 0; else exit 1; fi

해석하면 "브랜치 이름이 dependabot/으로 시작하면 빌드 스킵, 아니면 빌드 진행"입니다. 종료 코드가 0이면 스킵, 1이면 빌드라는 약속이에요.

이거 하나만 켜둬도 자동 봇이 만드는 빌드의 절반 이상이 사라집니다.

3. Dependabot PR 묶어서 받기

매일 따로따로 오는 대신 일주일치를 묶어서 받으면 훨씬 깔끔해집니다. .github/dependabot.yml 파일에 이렇게 설정해 보세요.

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      minor-and-patch:
        update-types:
          - "minor"
          - "patch"

마이너·패치 업데이트는 한 PR에 모이고, 메이저만 따로 옵니다. PR 수가 줄어드니 빌드 수도 자연스럽게 줄어들게 되는 거죠.

4. 모노레포라면 "Skip unaffected projects" 켜기

모노레포(Turborepo, Nx, pnpm workspace, Bun 모두 지원)를 쓰고 계신다면, 이건 거의 공짜 점심입니다.

각 프로젝트의 Settings → Git에 "Skip unaffected projects" 토글이 있는데요. 켜두면 코드가 안 바뀐 프로젝트는 빌드를 아예 하지 않습니다. 좋은 소식은 2025년 후반부터 신규 모노레포 프로젝트는 이게 기본값으로 ON이에요. 기존 프로젝트만 수동으로 켜주시면 됩니다.

예전에는 turbo-ignore를 직접 박아 넣던 시절도 있었지만, 지금은 이 토글이 훨씬 깔끔하고 빠릅니다. 빌드 큐 slot도 점유하지 않거든요.

5. AI 봇 크롤러 차단하기

요즘은 GPTBot, ClaudeBot, Bytespider(틱톡), PerplexityBot 같은 AI 크롤러들이 웹을 굉장히 적극적으로 긁어가고 있습니다. 동적 라우트까지 들어와서 API를 호출하고 JSON을 파싱하고 자산을 반복해서 받아갑니다. 한 마디로, 우리 청구서로 남의 AI 학습 데이터를 만들어주는 셈이에요.

public/robots.txt 파일에 한 번 차단해 보시는 걸 추천드립니다.

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: PerplexityBot
Disallow: /

User-agent: anthropic-ai
Disallow: /

User-agent: CCBot
Disallow: /

물론 봇 입장에서 robots.txt를 100% 지키는 건 아니지만, 양심 있는 봇들은 따라줍니다. 더 강하게 막고 싶으시면 Vercel의 Firewall 기능이나 Cloudflare 앞단에서 User-Agent 필터링을 거셔도 좋습니다.

6. 자주 안 바뀌는 응답은 캐시하기

1번 전략의 연장선이에요. API route에서 GET 응답을 매번 새로 만들 필요가 없다면 캐시하시면 됩니다.

response.headers.set(
  'Cache-Control',
  'public, s-maxage=3600, stale-while-revalidate=86400'
);

캐시 히트되면 함수 자체가 실행되지 않으니까 호출 수도 0, 함수 시간도 0이 됩니다. stale-while-revalidate를 같이 쓰시면 캐시가 만료되어도 일단 옛 데이터를 즉시 돌려주고 백그라운드에서 새로 만드니까, 사용자는 느려진 걸 못 느낍니다.

7. 이미지 최적화 비용 줄이기

next/image는 이미지를 자동으로 변환해 주는 대신, 변환 횟수당 과금이 됩니다 (1K transformation당 $0.05). 무심코 켜두면 의외로 많이 나올 수 있는 항목이에요.

가장 흔한 낭비는 AVIF와 WebP를 동시에 켜둔 경우입니다. next.config.js에서:

// Before (변환 2배)
images: {
  formats: ['image/avif', 'image/webp'],
}

// After (충분히 빠르고 호환됨)
images: {
  formats: ['image/webp'],
}

그리고 작은 이미지(10KB 미만), SVG, GIF는 어차피 최적화 이득이 거의 없으니까 unoptimized 속성을 붙여서 변환 자체를 건너뛰시면 됩니다.

<Image src="/icon.svg" unoptimized alt="..." />

8. Spend Management로 상한선 걸기

마지막은 안전망입니다. Vercel은 일정 금액에 도달하면 알림을 주거나 프로젝트를 자동으로 일시정지하는 기능을 제공합니다.

팀 설정 → Billing → Spend Management로 들어가셔서 예산을 설정해 주세요. 50%, 75%, 100% 지점에서 자동으로 이메일·SMS 알림이 옵니다.

최근 변경 사항: 예전에는 "하드 캡(자동 정지)"을 따로 켜야 했는데, 지금은 예산을 설정하면 production deployment 일시정지가 기본으로 켜져 있습니다. 사용자 피드백 받아서 Vercel이 기본값을 바꿨어요.

주의: 일시정지는 즉각적이지 않습니다. Vercel은 spend를 몇 분마다 체크하기 때문에, 예산을 넘긴 시점 이후로도 몇 분간 트래픽과 사용량이 계속 누적될 수 있어요. DDoS 같은 비상 상황에는 별도 대응이 필요합니다.

한 줄 요약

Vercel 비용은 "코드가 무거워서"가 아니라 "AI가 짜준 패턴과 자동화가 너무 자주 돌아서" 비싸지는 경우가 대부분입니다.

위 8개 중 1, 2, 3, 5, 8번은 코드 한 줄도 안 건드리고 설정만 바꾸면 되는 일입니다. 30분이면 충분해요. 한 번만 점검해 두시면 다음 달 청구서가 한결 가벼워질 겁니다.

Companion Skill — 클로드 코드/커서에서 바로 쓰기

위 8가지 절감 방법을 Claude Code / Cursor에서 바로 쓰는 체크리스트 스킬로 정리해 두었습니다. 아래 코드 블록 전체를 복사하셔서 ~/.claude/skills/vercel-cost-optimizer.md 같은 경로에 저장하시면, "Vercel 비용 좀 봐줘"라고 말씀만 하셔도 청구서 진단부터 설정 적용까지 단계별로 안내해 드립니다.

---
name: vercel-cost-optimizer
description: Vercel 청구서가 비싸게 나왔을 때 원인을 찾고 줄이는 방법을 단계별로 안내해 드리는 가이드. 트리거 — "Vercel 비용 줄여줘", "이번 달 청구서 왜 비싸?", "build minutes 많이 나옴", "dependabot 빌드 너무 많이 돌아", "revalidate 값 점검", "AI 봇 차단", "이미지 최적화 비용", "Spend Management 설정", "Fluid Compute 켜야 해?" 같은 요청.
---

# Vercel 비용 점검 체크리스트

## Step 1 · 어디서 돈이 나가고 있는지 먼저 봅니다

Vercel Dashboard → Usage 탭으로 들어가서 4개 항목 중 어느 게 가장 큰지 확인하세요.

- Build Time → 빌드가 너무 자주 돕니다 (전략 2~4)
- Function Duration → revalidate 값이 너무 짧거나 AI 봇 트래픽 (전략 1, 5, 6)
- Fast Data Transfer → 큰 파일 또는 AI 봇이 자산을 반복 다운로드 (전략 5, 6)
- Image Optimization → AVIF+WebP 둘 다 켜져있거나 SVG도 변환 중 (전략 7)

## Step 2 · 쉬운 것부터 적용

### 1. AI가 짜준 코드의 revalidate 값 점검 (바이브코더 1순위)
grep -rn "revalidate" 로 짧은 값(60 등) 찾아서 콘텐츠 빈도에 맞게 조정.
- 실시간: dynamic = 'force-dynamic'
- 자주 바뀜: 60~300
- 일반: 3600 (1시간)
- 정적: 86400 (하루)

### 2. Dependabot 미리보기 빌드 끄기
Settings → Git → Ignored Build Step:
if [[ "$VERCEL_GIT_COMMIT_REF" == dependabot/* ]]; then exit 0; else exit 1; fi

### 3. Dependabot PR 묶기
.github/dependabot.yml에 groups + weekly schedule 추가.

### 4. 모노레포 "Skip unaffected projects" 켜기
Settings → Git 토글. 2025년 후반부터 신규 모노레포는 기본 ON.

### 5. AI 봇 크롤러 차단
public/robots.txt에 GPTBot, ClaudeBot, Bytespider, PerplexityBot, anthropic-ai, CCBot, Google-Extended Disallow.
강하게 막으려면 Vercel Firewall 또는 Cloudflare.

### 6. 응답 캐싱
Cache-Control: public, s-maxage=3600, stale-while-revalidate=86400

### 7. 이미지 최적화 비용
- images.formats: ['image/webp'] 로 통일 (AVIF 제거)
- 작은 이미지/SVG/GIF는 unoptimized 속성
- minimumCacheTTL: 2678400 (31일)

### 8. Fluid Compute 확인
2025년 4월 이전 프로젝트는 Settings → Functions에서 수동 ON. AI/LLM 함수 우선.

## Step 3 · Spend Management 안전망
Team Settings → Billing → Spend Management.
2024년 후반부터 production pause 기본 ON.
단, 즉각적이지 않으니 DDoS는 Firewall/Cloudflare 별도 대응.

## 자주 헷갈리는 함정
1. revalidate: 60은 짧다 (60초마다 페이지 재생성)
2. Ignored Build Step: exit 0 = 스킵, exit 1 = 빌드
3. turbo-ignore와 Skip unaffected 동시 사용 충돌
4. Spend cap은 이제 기본 ON, 다만 즉각적이지 않음
5. Fluid Compute는 새 배포부터 적용
6. robots.txt는 양심 있는 봇만 따름

스킬 파일로 저장하시는 게 번거로우시면, 그냥 위 체크리스트를 보면서 한 번 점검만 하셔도 충분합니다.

참고 자료

1개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 아침,
읽고 바로 써먹을 AI 소식만