Next.js는 Image 최적화를 어떻게 할까?

MinJae·2025년 2월 18일
4

nextjs

목록 보기
2/12

HTTP_아카이브_이미지_리포트

웹 페이지에서 이미지는 큰 비중을 차지하며, HTTP 아카이브에 따르면 웹 페이지의 대략 58%가 이미지로 구성되어 있고 이미지의 용량도 다른 콘텐츠에 비해 월등히 높습니다.
따라서 이미지 최적화는 웹 성능을 향상시키는 핵심 요소입니다.

최적화되지 않은 이미지는 페이지 로딩을 느리게 하여 사용자 이탈률을 높이며, SEO에도 부정적인 영향을 미칠
수 있습니다.

Next.js는 이러한 문제를 해결하기 위해 강력한 이미지 최적화 기능을 제공하는 next/image 컴포넌트를 제공합니다. next/image의 이미지 최적화 원리에 대해서 알아보겠습니다.

next/image 최적화 기능

next/image 컴포넌트는 아래 기능들을 제공합니다.

  • 최신 포맷으로 변환: WebP, AVIF 등 차세대 이미지 형식으로 자동 변환
  • 이미지 크기 최적화: 디바이스 크기에 맞는 이미지 제공
  • Lazy Loading: 레이지 로딩 (Lazy Loading) 구현
  • Placeholder Blur: 블러 이미지 플레이스홀더 제공
  • CDN 최적화: Vercel 배포 시 자동으로 CDN을 활용한 최적화 수행

next/image는 클라이언트가 지원하는 최적의 포맷으로 타입을 결정하는데, 만약 formats 배열의 값을 모두 지원하지 않는다면 원본 포맷을 유지합니다.

// next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    formats: ['image/avif', 'image/webp'], 
  },
}

export default nextConfig

next.config에서 options를 설정할 수 있으며 기본값은 image/webp 입니다.

최적화 되지 않는 이미지

동적으로 최적화를 해야 하므로 이미지 최적화가 필요 없는 SVG와 같은 vector 이미지, 그리고 GIF와 같은 상대적으로 복잡하고 최적화에 오래 걸리는 애니메이션 이미지의 경우에서는 코드 레벨에서 최적화를 진행하지 않고 바로 응답으로 내려주게 되어 있습니다.

GIF는이미지 최적화 과정을 건너뛰기 위해 unoptimized={true}를 권장합니다.

next/image에서 SVG를 사용하려면 unoptimized={true}를 반드시 적용해야 합니다.

next/image에서 unoptimized는 true인 경우, 품질, 크기 또는 형식을 변경하지 않고 원본 이미지를 그대로 제공합니다.

// next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    formats: ['image/avif', 'image/webp'],
    dangerouslyAllowSVG: true, 
    contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;", 
  },
}

export default nextConfig

next.config에서 프로젝트 전체에 적용할 수 있습니다. 대신 dangerouslyAllowSVG 설정이 필요하고,
XSS 공격 등 보안성 위험 때문에 contentSecurityPolicy 설정을 통해 보안 정책을 설정 할 수 있습니다.

최적화는 언제 이루어지는가?

next/image의 최적화는 빌드 시점이 아닌, 브라우저에서 이미지를 요청할 때 이루어집니다.

  1. HTML에서 이미지 태그 렌더링
  2. 브라우저가 서버에 이미지 요청
  3. 서버가 이미지 최적화 수행
  4. 최적화된 이미지 응답

과정으로 최적화가 이루어집니다.

img

next/image 컴포넌트를 사용하면 이미지 URL을 image?url= 형태로 반환합니다. 이 URL로 요청이 들어오면 Next.js의 이미지 최적화 미들웨어가 동작합니다.

sharp 라이브러리

Next.js는 기본으로 Squoosh를 최적화 모듈로 사용하고 있습니다. Squoosh는 빠른 설치 속도와 개발 환경에서 적합합니다.

운영 환경에서는 sharp를 사용하는 것을 매우 강력하게 권장하고 있습니다.

sharp

Next.js는 sharp의 설치 여부를 확인하고 이후에 동작하는 로직에서 sharp 변수를 기준으로 동작하는 방식으로 코드가 작성되어 있습니다.

Next.js 15 버전은 sharp를 기본적으로 사용하고 있습니다.


이미지 최적화 과정

  1. avif, webp 사용하기(최신 포맷으로 변환)

WebP는 Google이 개발한 이미지 포맷으로, JPEG보다 작은 파일 크기로 비슷한 품질을 제공합니다. AVIF는 더 최신의 포맷으로, WebP보다 더 나은 압축률을 제공할 수 있습니다.

  1. 이미지 크기 최적화

Next.js는 sizes 속성을 사용하여 다양한 화면 크기에 맞는 이미지를 생성합니다. 이를 통해 모바일 기기에는 작은 이미지를, 데스크톱에는 큰 이미지를 제공하여 불필요한 데이터 전송을 줄입니다.

  1. Lazy Loading

Lazy Loading을 통해 뷰포트 밖에 있는 이미지의 로딩을 지연시켜, 초기 페이지 로드 시간을 크게 줄일 수 있습니다. 이는 특히 이미지가 많은 페이지에서 효과적입니다.


before

after

위 과정을 적절히 사용하여 이미지의 Size와 Time을 최적화가 가능합니다.


✅ 참고

profile
고양이 간식 사줄려고 개발하는 사람

0개의 댓글