왜 WebP를 디폴트로 설정해야할까?

바이브코딩, 왜 WebP를 디폴트로 설정해야 하는가 | IMLAB Tech Blog
IMLAB Tech Blog 개발 환경·툴 바이브코딩 이미지 최적화

바이브코딩, 왜 WebP를 디폴트로 설정해야 하는가

AI가 생성한 코드는 기본적으로 PNG를 쓴다. 그 한 줄의 습관이 LCP를 망친다.

IMLAB.AI 2025.04 AI & 기술 / 개발 환경 읽기 약 6분

결론 먼저 읽기 (TL;DR)

바이브코딩으로 빠르게 만든 앱은 이미지 포맷 설정을 생략하기 쉽다. PNG·JPEG를 그대로 쓰면 파일 크기가 불필요하게 커지고, LCP가 무너진다. WebP를 프로젝트 시작 시점에 디폴트로 박아두면 성능 부채를 0에서 시작할 수 있다.

  • 1AI 코드 생성은 PNG·JPEG를 기본값으로 출력한다 — 명시하지 않으면 최적화가 빠진다
  • 2WebP는 동일 품질 기준 PNG 대비 약 26%, JPEG 대비 약 25~34% 용량이 작다
  • 3LCP(Largest Contentful Paint)는 이미지 포맷에 직결된다 — 첫 화면 이미지가 PNG면 점수가 즉시 떨어진다
  • 4Next.js·Vite·Nginx 모두 설정 3줄로 WebP 디폴트를 강제할 수 있다
  • 5바이브코딩 프롬프트에 WebP를 명시하면 AI가 처음부터 최적화된 코드를 생성한다

바이브코딩이 이미지를 잊는 이유

바이브코딩의 흐름은 빠르다. 아이디어 → 프롬프트 → 배포까지 몇 시간이면 끝난다. 하지만 그 속도가 만드는 맹점이 하나 있다. 이미지 포맷이다.

Claude, Cursor, Bolt, v0 같은 AI 코드 생성 도구가 뱉는 이미지 관련 코드는 대부분 이렇게 생겼다:

AI가 기본으로 생성하는 코드 (React)
// AI 생성 기본값 — 포맷 설정 없음
import Image from 'next/image'

export default function Hero() {
  return (
    <Image
      src="/hero.png"    // ← PNG 하드코딩
      alt="hero"
      width={1200}
      height={630}
    />
  )
}

포맷을 명시하지 않으면 업로드된 원본 파일 그대로 서빙된다. 빠른 프로토타이핑 단계에서 Figma에서 뽑은 PNG를 그냥 넣는 경우가 대부분이다. 그 PNG가 프로덕션까지 그대로 올라간다.

바이브코딩의 구조적 문제

AI는 “작동하는 코드”를 만든다. “최적화된 코드”를 만들지 않는다. 포맷, 압축, CDN 정책은 개발자가 명시적으로 요구하지 않으면 AI가 판단하지 않는다.

WebP가 실제로 얼마나 가벼운가

숫자로 보는 것이 빠르다. Google이 공개한 WebP 인코딩 비교 데이터 기준이다.

PNG
기준
투명도 지원, 무손실
파일 크기 최대
JPEG
−25~34%
손실 압축, 투명도 없음
사진 계열에 강함
WebP
−26~34%
손실·무손실 모두 지원
투명도·애니메이션 포함
잠깐, 이론 설명
WebP는 왜 작은가

WebP는 Google이 VP8 비디오 코덱 기술을 정지 이미지에 적용해 만든 포맷이다. 손실 압축 시 예측 블록 인코딩, 무손실 압축 시 팔레트 최적화와 LZ77 변형 알고리즘을 사용한다. JPEG가 DCT(이산 코사인 변환) 기반인 것과 달리, WebP는 공간적 예측을 통해 같은 화질에서 더 높은 압축률을 달성한다.

브라우저 지원도 더 이상 문제가 아니다. 2025년 기준 전 세계 브라우저의 97% 이상이 WebP를 지원한다. IE를 지원하지 않는 프로젝트라면 폴백 없이 WebP만 써도 된다.

지원 범위

Chrome 23+, Safari 14+, Firefox 65+, Edge 18+ — 모두 WebP 지원. iOS Safari도 14(2020년 9월)부터 지원한다. 신규 프로젝트에서 PNG·JPEG를 고집할 이유가 없다.

Core Web Vitals와 직결되는 이유

Google은 LCP(Largest Contentful Paint)를 Core Web Vitals의 핵심 지표로 삼는다. LCP는 뷰포트에서 가장 큰 콘텐츠 요소가 렌더링되는 시간이다. 대부분의 경우 그 요소는 히어로 이미지다.

  • 🟢
    LCP 2.5초 이하 — Good
    WebP 최적화 + CDN 캐싱 설정 시 달성 가능한 구간. Google 검색 순위에 긍정적으로 작용한다.
  • 🟡
    LCP 2.5~4초 — Needs Improvement
    PNG 히어로 이미지를 CDN 없이 서빙하면 자주 도달하는 구간. 바이브코딩 초기 배포의 전형적인 상태다.
  • 🔴
    LCP 4초 이상 — Poor
    대형 비압축 PNG + 느린 원서버 + 모바일 환경이 겹치면 쉽게 도달한다. 이탈률이 급등하는 구간이다.

이미지 포맷 하나로 LCP 구간이 달라진다. WebP로 이미지 크기가 30% 줄면 네트워크 전송 시간이 그만큼 줄고, LCP가 직접적으로 개선된다. 바이브코딩으로 랜딩 페이지를 만들고 광고를 붙이는 시나리오에서 LCP는 전환율에 직결된다.

프레임워크별 WebP 디폴트 설정 — 3줄 레시피

바이브코딩 환경에서 자주 쓰는 스택 기준으로 WebP를 디폴트로 강제하는 설정을 정리했다.

Next.js — next.config.js

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    formats: ['image/webp'],   // ← WebP 우선 출력
    deviceSizes: [640, 750, 828, 1080, 1200, 1920],
    minimumCacheTTL: 60,          // ← 캐시 TTL (초)
  },
}

module.exports = nextConfig

Next.js의 next/image는 이 설정만으로 업로드된 원본 이미지를 WebP로 자동 변환해 서빙한다. 소스 파일이 PNG여도 브라우저에는 WebP가 전달된다.

Vite + React — vite-imagetools 또는 빌드 플러그인

vite.config.ts
import { defineConfig } from 'vite'
import { imagetools } from 'vite-imagetools'

export default defineConfig({
  plugins: [
    imagetools({
      defaultDirectives: new URLSearchParams({
        format: 'webp',        // ← 기본 포맷 강제
        quality: '80',        // ← 품질 설정
      })
    })
  ]
})

Vite 환경에서는 vite-imagetools가 빌드 시 이미지를 WebP로 변환한다. 임포트 구문 한 줄로 적용된다.

컴포넌트 사용 예시
// 빌드 시 hero.png → hero.webp로 자동 변환
import heroUrl from './hero.png?format=webp&quality=80'

export default function Hero() {
  return <img src={heroUrl} alt="hero" />
}

Nginx — 정적 파일 서빙 시 WebP 우선 설정

nginx.conf
map $http_accept $webp_suffix {
  ""                  "";
  "~*webp"           ".webp";   # Accept 헤더에 webp 포함 시
}

server {
  location ~* \.(png|jpg|jpeg)$ {
    add_header Vary Accept;
    try_files $uri$webp_suffix $uri =404;
    expires 30d;
  }
}

WebP 파일이 동일 경로에 존재할 경우 브라우저가 지원하면 자동으로 WebP를 서빙한다. cwebp CLI로 사전 변환해두는 방식이다.

바이브코딩 프롬프트에 WebP를 명시하는 방법

설정 파일을 고치는 것보다 더 근본적인 해결책이 있다. 프롬프트 자체에 WebP 요구사항을 박아두는 것이다. AI는 명시된 제약을 잘 따른다.

❌ 이미지 최적화 빠진 프롬프트
프롬프트
히어로 섹션 컴포넌트를 
만들어줘. 배경 이미지가 
있고 CTA 버튼이 있어야 해.
✅ WebP 명시 프롬프트
프롬프트
히어로 섹션 컴포넌트를 
만들어줘. 이미지는 반드시 
WebP 포맷을 사용하고, 
next/image에 width·height·
priority 속성을 포함해줘.

프롬프트에 WebP를 명시하면 AI가 처음부터 최적화된 코드를 생성한다. 나중에 PNG를 WebP로 바꾸는 리팩터링 비용이 사라진다. IMLAB에서는 프로젝트 CLAUDE.md에 이미지 관련 컨벤션을 명시해 모든 에이전트 세션에 자동 적용되도록 관리한다.

CLAUDE.md — 이미지 컨벤션 섹션 예시
## 이미지 컨벤션

# 포맷
- 모든 정적 이미지는 WebP 포맷 사용
- PNG·JPEG 직접 사용 금지 (변환 후 사용)
- 투명도 필요 시 WebP 무손실 모드 사용

# Next.js 사용 시
- 반드시 next/image 사용 (img 태그 사용 금지)
- width, height 명시 필수
- 히어로 이미지에 priority 속성 추가

# 품질
- 사진 계열: quality=80
- 일러스트·UI: quality=90

FAQ

QNext.js를 쓰면 자동으로 WebP가 되는 것 아닌가?
Next.js의 next/image는 브라우저가 WebP를 지원하면 WebP로 변환한다. 하지만 img 태그를 직접 쓰거나 next/imageunoptimized 속성을 붙이면 원본 PNG가 그대로 나간다. AI 코드 생성 결과물에는 두 패턴이 섞여 있으므로 코드 리뷰 시 확인이 필요하다. next.config.js에 formats 설정을 명시해두면 next/image 사용 시 항상 WebP가 우선 적용된다.
QWebP가 JPEG보다 항상 작은가?
대부분의 경우 그렇지만 항상은 아니다. 매우 단순한 색상의 이미지나 특정 텍스트 이미지는 PNG가 더 효율적인 경우가 있다. 실무에서는 품질 80~85 기준으로 WebP를 적용하면 JPEG 대비 평균 25~34% 절감이 일관되게 나타난다. 사진 계열이 아닌 일러스트·UI 이미지도 WebP 무손실 모드가 PNG보다 약 26% 작다.
Q기존 프로젝트의 PNG를 WebP로 일괄 변환하는 방법은?
Google이 제공하는 CLI 도구 cwebp를 사용하면 된다. cwebp -q 80 input.png -o output.webp 명령으로 단일 파일을 변환한다. 폴더 전체 일괄 변환은 for f in *.png; do cwebp -q 80 "$f" -o "${f%.png}.webp"; done 쉘 스크립트로 처리한다. Node.js 환경이면 sharp 라이브러리가 가장 빠르다.
QAVIF가 WebP보다 낫다는 말이 있는데, 왜 WebP를 권장하는가?
AVIF는 WebP보다 압축률이 10~20% 더 높지만 인코딩 속도가 느리고 Edge·Safari 구형 버전에서 지원이 불안정하다. Next.js는 formats: ['image/avif', 'image/webp']로 AVIF 우선, WebP 폴백 순서를 지정할 수 있다. 2025년 기준 안정적인 기본값은 WebP 단독 설정이며, 성능에 극도로 민감한 프로젝트는 AVIF+WebP 듀얼 설정을 고려한다.

핵심 요약표

항목 핵심 내용 실무 포인트 리스크 / 주의
AI 기본값 AI 코드 생성은 PNG·JPEG를 기본 출력 프롬프트에 WebP 명시 또는 CLAUDE.md 컨벤션 등록 명시하지 않으면 매 세션마다 PNG로 회귀
압축률 PNG 대비 ~26%, JPEG 대비 ~25~34% 용량 절감 quality=80 기준 사진 계열에서 효과 극대화 단순 UI 이미지는 무손실 모드(quality=100) 사용
LCP 연관 히어로 이미지 포맷이 LCP 지표에 직결 priority 속성 + WebP = LCP 최우선 최적화 이미지 크기만 줄여도 LCP 미개선 시 CDN 확인 필요
Next.js 설정 next.config.js formats 배열로 WebP 강제 next/image 사용 시 자동 변환 — 소스 파일 불변 img 태그 직접 사용 시 자동 변환 미적용
Vite 설정 vite-imagetools 플러그인으로 빌드 시 변환 defaultDirectives로 전체 프로젝트 일괄 적용 SSR 환경이 아니므로 서버 사이드 이미지 요청과 별도 처리 필요
AVIF 비교 AVIF가 압축률 높지만 인코딩 느리고 지원 불안정 안정성 우선이면 WebP 단독, 성능 극대화 시 AVIF+WebP Next.js formats 배열에 avif 추가 시 서버 CPU 부하 증가
출처 및 참고
Google Developers — “WebP Compression Study” (2022) · Google Chrome — “A new image format for the Web (WebP)” (2010, updated 2024) · web.dev — “Use WebP images” (2024) · MDN Web Docs — “Image file type and format guide: WebP” (2024) · Next.js Docs — “next/image: Image Optimization” (2025) · HTTP Archive — “Web Almanac: Media” (2024)