OPEN HYPER STEP
← 목록으로 (stack-analysis)
STACK-ANALYSIS · 17 / 90
stack-analysis
CHAPTER 17 / 90
읽기 약 2
FUNCTION

이미지 최적화: next/image + CDN + WebP/AVIF


핵심 개념

next/image·placeholder=blur·sizes·loader 커스텀 — Lighthouse 100점 이미지.

본문

기본 next/image

TSX📋 코드 (19줄)
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

JAVASCRIPT📋 코드 (13줄)
// 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 자동 생성

TSX📋 코드 (12줄)
// 빌드 타임 — 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)

JAVASCRIPT📋 코드 (16줄)
// 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 속성 — 반응형 핵심

TSX📋 코드 (20줄)
// 잘못 — 항상 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점 체크리스트

📋 코드 (8줄)
✅ 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