React 이미지 최적화: 로딩·포맷·레이지 전략
React 앱에서 이미지 파일 크기와 로딩 시간을 줄이고, 웹픽처 포맷 활용과 react lazy 이미지 로드 적용을 포함한 성능 최적화 전략
목차
서론: 이미지 최적화의 필요성
이미지는 웹 성능에서 큰 비중을 차지한다. 큰 이미지 파일은 초기 로딩 속도를 저하시킨다. React 앱에서는 렌더링 방식과 번들링 특성 때문에 이미지 최적화가 더 중요하다. 반응형 페이지와 모바일 환경에서 속도와 사용자 경험 향상이 필수다.
이미지 포맷과 압축
웹픽처 포맷 활용
새로운 이미지 포맷은 더 작은 파일 크기와 향상된 품질을 제공한다. 특히 WebP와 AVIF는 기존 JPEG, PNG 대비 효율이 높다. 브라우저 호환성을 고려해 <picture> 태그로 포맷별 소스를 제공하면 효과적이다. 다음 예제는 웹픽처 포맷 활용 방식이다.
<picture>
<source type="image/avif" srcset="/images/photo.avif">
<source type="image/webp" srcset="/images/photo.webp">
<img src="/images/photo.jpg" alt="예시 이미지" />
</picture>
이 방식은 브라우저가 지원하는 최적 포맷을 선택하게 한다. 빌드 단계에서 AVIF/WebP 변환을 자동화하면 관리가 편리하다.
압축과 해상도 전략
압축은 손실과 무손실 방식 중 요구 품질에 맞춰 선택한다. 해상도는 디바이스 픽셀 비율과 뷰포트 크기를 고려한다. srcset과 sizes 속성을 함께 사용하면 브라우저가 적절한 크기의 이미지를 불러온다.
<img src="/images/photo-800.jpg"
srcset="/images/photo-400.jpg 400w, /images/photo-800.jpg 800w, /images/photo-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, 600px"
alt="반응형 이미지" />
로딩 최적화: 네트워크와 캐싱
CDN 사용은 지연 시간을 줄인다. 이미지 캐싱 정책은 적절한 만료 시간을 설정해 재요청을 최소화한다. 또한 HTTP/2와 HTTP/3는 다중 요청 효율을 높여 이미지 로딩 성능에 긍정적 영향을 준다.
레이지 로딩 기법
브라우저 기본 레이지 로딩
간단한 경우에는 loading="lazy" 속성이 가장 쉬운 방법이다. 브라우저가 지원하면 스크롤에 따라 자동으로 이미지를 지연 로드한다.
<img src="/images/photo.jpg" alt="예시" loading="lazy" />
Intersection Observer로 제어
세밀한 제어가 필요하면 Intersection Observer를 사용한다. React에서는 훅으로 추상화해 재사용 가능한 컴포넌트로 만든다. 아래 예제는 간단한 구현 구조를 보여준다.
function LazyImage({ src, alt, placeholder }) {
const ref = useRef(null);
const [visible, setVisible] = useState(false);
useEffect(() => {
const io = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
setVisible(true);
io.disconnect();
}
});
});
if (ref.current) io.observe(ref.current);
return () => io.disconnect();
}, []);
return (
<div ref={ref}>
{visible ? <img src={src} alt={alt} /> : <img src={placeholder} alt={alt} />}
</div>
);
}
이 방식은 초기 렌더 비용을 줄인다. 페이드 인이나 저해상도 플레이스홀더(LQIP)를 결합하면 사용자 경험이 개선된다.
빌드 파이프라인에서의 최적화
이미지 최적화는 빌드 단계에서 자동화해야 한다. Webpack, Vite, Rollup 같은 도구의 플러그인으로 변환과 압축을 적용할 수 있다. Next.js나 Gatsby 같은 프레임워크는 자체 이미지 최적화 기능을 제공한다. CI 파이프라인에서 이미지 변환을 적용하면 배포 시 일관성이 유지된다.
성능 측정과 검증
성능 변화는 측정으로 확인한다. Lighthouse, WebPageTest, Chrome DevTools의 네트워크 패널을 활용한다. 주요 지표는 Largest Contentful Paint(LCP), Total Blocking Time(TBT), First Contentful Paint(FCP) 등이다. 최적화 후에는 실제 기기와 네트워크 환경에서 재검증이 필요하다.
체크리스트
- 웹픽처 포맷 활용으로 파일 크기 감소
- srcset과 sizes로 반응형 이미지 제공
- 레이지 로딩으로 초기 렌더 비용 절감
- CDN과 캐싱 설정으로 네트워크 개선
- 빌드 파이프라인에서 자동 변환 및 압축 적용
- 성능 지표로 최적화 효과 검증
마무리
React 앱에서 이미지 최적화는 단일 기법이 아닌 여러 전략의 조합이다. react 이미지 최적화는 포맷 선택, 압축, responsive 제공, 레이지 로딩, 빌드 자동화, 그리고 측정의 순환을 포함한다. react lazy 이미지 로드와 웹픽처 포맷 활용을 적절히 결합하면 페이지 속도와 사용자 경험 모두 개선된다.