https://www.npmjs.com/package/react-intersection-observer
웹 성능 최적화에서 중요한 요소 중 하나가 바로 이미지 로딩 방식이다. 특히 사용자가 스크롤을 내리기 전에 보이지 않는 이미지를 미리 로딩하지 않도록 하는 최적화 방법이 필요하다. 이를 위해, react-intersection-observer를 활용하여 지연 로딩을 적용했고, 이로써 불필요한 네트워크 요청을 줄이고 성능을 향상시킬 수 있었다.
react-intersection-observer란?
Intersection observer API를 react에서 쉽게 사용할 수 있도록 만든 라이브러리이다. 특정 요소가 뷰포트에 들어왔는지를 감지할 수 있고, 이를 활용하여 이미지나 콘텐츠가 사용자에게 보일 때 로드하도록 최적화할 수 있다.
나는 아래와 같이 이미지 디자인 컴포넌트를 만들었다. 여기서 핵심은 inView일 경우에만 src에 링크를 할당하는 것이다.
*HTML에서 <img> 태그의 src 속성에 이미지 URL이 설정되면 브라우저는 해당 URL로 네트워크 요청을 보내 이미지를 가져온다. AWS의 S3와 같은 곳으로 요청이 가는 것이다.
import {useInView} from 'react-intersection-observer'
function LazyImage({src, alt, size}: LazyImageProps) {
const {ref, inView} = useInView({triggerOnce: true, threshold: 0})
const isOriginal = size === 'original'
return (
<div ref={ref} className={cx({'img-container': true, [`${size}`]: true, original: isOriginal})}>
<img src={inView ? src : undefined} alt={alt || 'img'} />
</div>
)
}
- useInView 훅을 사용하여 특정 요소가 화면에 나타났는지를 감지한다.
- triggerOnce: true 옵션을 추가하여 한 번 화면에 나타나면 이후 감지를 중단하도록 설정한다.
- threshold: 값을 지정하여 0% 이상 화면에 노출될 경우 이미지를 로드하도록 설정한다.
이로써, react-intersection-observer를 활용한 이미지 지연 로딩을 통해 성능 최적화를 해봤다.
'React' 카테고리의 다른 글
| useMemo()에서 dependency 배열을 잘못 관리했을 때 발생하는 문제 (0) | 2025.08.20 |
|---|---|
| React Query의 retry 기능 (0) | 2025.06.23 |
| React query 적용 구조적 패턴 (0) | 2025.02.24 |
| React portal (0) | 2025.02.11 |
| 합성 컴포넌트 적용하기 (0) | 2025.02.11 |