메인 콘텐츠로 건너뛰기
Deep Thought
← 목록으로
Frontend

Next.js Image 컴포넌트를 사용하는 이유

신중선-- views
nextjsimage-optimizationweb-performancereactfrontend

Next.js Image 컴포넌트란?

Next.js Image 컴포넌트는 기본 HTML <img> 태그를 대체하여 자동으로 이미지 최적화와 성능 향상을 제공하는 React 컴포넌트입니다. 웹 성능에 큰 영향을 미치는 이미지 처리를 개발자가 별도로 구현하지 않아도 최적화된 상태로 제공받을 수 있습니다.

기본 <img> 태그와 달리 Next.js Image는 현대 웹 환경에 맞는 이미지 최적화 기능들을 내장하고 있어, 사용자 경험과 웹사이트 성능을 동시에 개선할 수 있습니다.

핵심 개념

1. 자동 포맷 최적화

Next.js Image는 브라우저 지원 여부에 따라 최적의 이미지 포맷을 자동으로 선택합니다.

// 기본 img 태그
<img src="/photo.jpg" alt="사진" />

// Next.js Image - 브라우저가 WebP를 지원하면 자동으로 WebP 제공
import Image from 'next/image'

<Image 
  src="/photo.jpg" 
  alt="사진"
  width={500}
  height={300}
/>

WebP를 지원하는 브라우저에서는 JPEG/PNG 대신 WebP를 제공하여 파일 크기를 25-50% 줄일 수 있습니다. 사용자는 동일한 이미지 품질을 더 빠르게 로딩할 수 있게 됩니다.

2. 반응형 이미지 크기 조정

요청되는 뷰포트 크기에 따라 적절한 크기의 이미지를 제공합니다.

// 다양한 화면 크기에 맞는 이미지 제공
<Image
  src="/hero-image.jpg"
  alt="히어로 이미지"
  sizes="(max-width: 768px) 100vw, 50vw"
  fill
  priority
/>

// 고정 크기 이미지
<Image
  src="/thumbnail.jpg"
  alt="썸네일"
  width={200}
  height={200}
/>

이를 통해 모바일에서는 작은 이미지를, 데스크톱에서는 큰 이미지를 제공하여 불필요한 데이터 전송을 방지합니다.

3. 지연 로딩과 플레이스홀더

기본적으로 뷰포트에 들어올 때만 이미지를 로드하며, 로딩 중 플레이스홀더를 제공합니다.

// 블러 플레이스홀더와 함께 지연 로딩
<Image
  src="/gallery-image.jpg"
  alt="갤러리 이미지"
  width={400}
  height={300}
  placeholder="blur"
  blurDataURL="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ..."
/>

// 즉시 로딩이 필요한 중요 이미지
<Image
  src="/logo.png"
  alt="로고"
  width={100}
  height={50}
  priority // 지연 로딩 비활성화
/>

4. 외부 도메인 이미지 처리

외부 도메인의 이미지를 사용할 때는 보안을 위해 허용 목록을 설정해야 합니다.

// next.config.js
module.exports = {
  images: {
    domains: ['example.com', 'cdn.example.com'],
    // 또는 패턴 사용
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.example.com',
        pathname: '/images/**',
      },
    ],
  },
}

정리

기능 기본 img 태그 Next.js Image
포맷 최적화 수동 구현 필요 자동 (WebP, AVIF 등)
반응형 크기 srcset 직접 작성 sizes 속성으로 간단 구현
지연 로딩 loading="lazy" 속성 기본 제공
플레이스홀더 CSS로 구현 blur, empty 옵션 제공
성능 최적화 개발자 직접 구현 자동 최적화

Next.js Image 컴포넌트는 이미지 최적화를 위한 복잡한 작업들을 자동화하여, 개발자가 성능과 사용자 경험을 쉽게 개선할 수 있게 해줍니다. 특히 대용량 이미지가 많은 웹사이트에서는 로딩 속도와 사용자 경험 측면에서 상당한 개선 효과를 얻을 수 있습니다.

References