React에서 이미지 사이즈별 로드와 반응형 처리
브라우저와 화면 크기에 맞춰 적절한 이미지 파일을 선택해 전송량을 줄이고 표시 품질을 유지하는 방법
목차
소개
이미지는 웹 페이지 성능에 큰 영향을 준다. 특히 모바일 사용자가 많아지면서 화면 크기별로 적절한 이미지를 제공하는 것이 중요하다. 이 글은 React 환경에서 이미지 크기 최적화와 반응형 처리를 쉽게 이해하도록 정리한다. 키워드는 자연스럽게 포함돼 있으며, 초보자도 따라와 이해할 수 있는 구성으로 설명한다.
왜 이미지 최적화가 필요한가
대용량 이미지는 로딩 지연과 데이터 과다 사용을 초래한다. 또한 불필요한 대역폭 소비로 사용자 경험이 저하된다. 반면 적절한 이미지 선택은 렌더링 속도를 높이고 SEO와 Core Web Vitals 점수 개선에 기여한다. React에서 이러한 최적화를 적용하는 방법을 살펴본다.
기본 원리: srcset과 sizes
srcset과 sizes의 역할
srcset은 브라우저가 여러 해상도 파일 중 적절한 것을 선택하도록 돕는다. sizes는 뷰포트에서 이미지가 차지할 예상 너비를 명시한다. 함께 사용하면 브라우저가 네트워크 조건과 화면에 맞춰 최적 파일을 고른다. 이 패턴은 react responsive images 구현의 핵심이다.
HTML 예시
<img
srcSet="/images/photo-400.jpg 400w, /images/photo-800.jpg 800w, /images/photo-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, (max-width: 1200px) 50vw, 33vw"
src="/images/photo-800.jpg"
alt="예시 이미지"
loading="lazy"
decoding="async"
/>
위 코드는 브라우저가 화면 너비와 DPR(device pixel ratio)을 고려해 적합한 이미지를 선택하도록 한다. loading="lazy"와 decoding="async"는 렌더링 효율을 더한다.
React에서의 활용
정적 마크업 사용
간단한 컴포넌트는 JSX에 바로 srcSet과 sizes를 넣어 처리할 수 있다. 다음은 React 컴포넌트 예시이다.
function ResponsiveImage(){
return (
<img
srcSet="/images/photo-400.jpg 400w, /images/photo-800.jpg 800w, /images/photo-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, (max-width: 1200px) 50vw, 33vw"
src="/images/photo-800.jpg"
alt="반응형 예시"
loading="lazy"
/>
);
}
JSX에서 속성 이름은 HTML과 동일하게 사용된다. 앞서 본 srcset react 사용법을 적용한 기본 형태다.
동적 srcSet 생성
이미지가 여러 크기와 형식(webp 등)을 갖는 경우, props로 경로와 브레이크포인트를 받아 srcSet을 동적으로 생성하면 관리가 편하다.
function makeSrcSet(baseName, sizes){
return sizes.map(s => `${baseName}-${s}.jpg ${s}w`).join(', ');
}
function DynamicImage({base, sizes, alt}){
const srcSet = makeSrcSet(base, sizes);
return (
<img srcSet={srcSet} sizes="100vw" src={`${base}-${sizes[Math.floor(sizes.length/2)]}.jpg`} alt={alt} loading="lazy" />
);
}
이 방식은 빌드 파이프라인이나 CDN과 함께 사용하면 많은 이점을 제공한다.
picture 요소와 형식 선택
브라우저가 지원하는 최적 형식(webp, avif 등)을 우선 제공하려면 picture 요소를 사용한다. 해상도와 형식을 함께 고려할 수 있다.
<picture>
<source type="image/avif" srcSet="/img/photo-800.avif 800w, /img/photo-1200.avif 1200w" sizes="100vw" />
<source type="image/webp" srcSet="/img/photo-800.webp 800w, /img/photo-1200.webp 1200w" sizes="100vw" />
<img src="/img/photo-800.jpg" alt="포맷 우선 예시" loading="lazy" />
</picture>
React에서 picture 태그를 그대로 사용하면 각 브라우저가 가장 적절한 리소스를 골라 가져온다.
CSS 반응형 처리
이미지는 CSS로 크기를 제어해야 한다. width:100%와 height:auto를 기본으로 하면 비율을 유지한다. 배경 이미지의 경우 media query와 이미지 세트를 함께 사용한다.
성능과 접근성 고려사항
- 이미지 포맷: 가능한 경우 WebP나 AVIF 사용으로 전송량 절감.
- 레이지 로딩: loading="lazy"로 초기 렌더 비용 절감.
- 대체 텍스트: alt 속성으로 접근성 확보.
- CDN과 캐싱 활용: 이미지 서빙 최적화.
- 화면 배율 처리: 1x, 2x 파일 제공으로 선명도 보장.
결론
React에서 이미지 크기별 로드와 반응형 처리는 srcset, sizes, picture 요소와 CSS를 조합하면 효과적이다. 동적 생성과 포맷 선택을 통해 전송량을 줄이고 품질을 유지할 수 있다. 위 방법으로 react responsive images와 이미지 크기 최적화 리액트 요구를 충족하면서 사용자 경험을 개선할 수 있다.