stack-analysis
CHAPTER 17 / 90
읽기 약 2분
FUNCTION
이미지 최적화: next/image + CDN + WebP/AVIF
핵심 개념
next/image·placeholder=blur·sizes·loader 커스텀 — Lighthouse 100점 이미지.
본문
기본 next/image
import Image from 'next/image';
export default function ProductCard({ product }: { product: Product }) {
return (
<div>
<Image
src={product.imageUrl}
alt={product.name}
width={400}
height={300}
priority={product.featured} // LCP 후보
placeholder="blur"
blurDataURL={product.blurDataURL}
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
style={{ objectFit: 'cover' }}
/>
</div>
);
}자동 변환 — WebP/AVIF
// next.config.js
module.exports = {
images: {
formats: ['image/avif', 'image/webp'],
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
minimumCacheTTL: 60 * 60 * 24 * 30, // 30일
remotePatterns: [
{ protocol: 'https', hostname: 'cdn.example.com' },
{ protocol: 'https', hostname: '*.amazonaws.com' },
],
},
};blurDataURL 자동 생성
// 빌드 타임 — plaiceholder
// pnpm add plaiceholder
import { getPlaiceholder } from 'plaiceholder';
async function getProduct(id: string) {
const product = await db.product.findUnique({ where: { id } });
const buffer = await fetch(product.imageUrl).then(r => r.arrayBuffer());
const { base64 } = await getPlaiceholder(Buffer.from(buffer));
return { ...product, blurDataURL: base64 };
}외부 CDN 로더 (Cloudinary)
// next.config.js
module.exports = {
images: {
loader: 'custom',
loaderFile: './lib/cloudinary-loader.ts',
},
};
// lib/cloudinary-loader.ts
export default function cloudinaryLoader({
src, width, quality
}: { src: string; width: number; quality?: number }) {
const params = ['f_auto', 'c_limit', `w_${width}`, `q_${quality || 'auto'}`];
return `https://res.cloudinary.com/your-cloud/image/upload/${params.join(',')}/${src}`;
}sizes 속성 — 반응형 핵심
// 잘못 — 항상 1920px 다운로드
<Image src="/hero.jpg" alt="" fill />
// 올바름 — 화면 크기별 적합 이미지
<Image
src="/hero.jpg"
alt=""
fill
sizes="(max-width: 768px) 100vw, (max-width: 1280px) 80vw, 1280px"
/>
// 그리드 카드 (3열)
<Image
src={p.url}
alt={p.name}
width={400}
height={300}
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
/>Lighthouse 100점 체크리스트
✅ next/image 사용 (자동 최적화)
✅ priority on LCP image (히어로 이미지)
✅ alt 속성 (접근성)
✅ width/height 또는 fill (CLS 방지)
✅ sizes 정확히 (네트워크 절약)
✅ placeholder=blur (UX)
✅ formats: avif/webp (next.config)
✅ remotePatterns 설정 (외부 이미지)다음 챕터
CH.18 "SEO 완전 정복" — 메타데이터 API.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 코드의 이미지 최적화 부분을 분석해서 실전 분석 + 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
이미지 최적화 관련 인기 라이브러리/패턴 5개를 비교 분석해서 패턴 추출를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 이미지 최적화 최적화 가능 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 프론트엔드 시장의 이미지 최적화 트렌드를 솔직히 알려줘.
⭐ 이것만 기억하세요
이미지 최적화: next/image + CDN + WebP/AVIF는 이 3가지만 확실히 잡으세요
1.next/image는 자동 최적화 — WebP/AVIF + responsive + lazy
2.sizes 속성이 핵심 — 화면별 적합 해상도 다운로드
3.priority + blurDataURL = LCP 이미지의 표준
공유하기
진행도 17 / 90