페이지 스크롤 시 자동으로 로딩되는 Lazy Loading 구현 방법

많은 웹 페이지에서 많은 양의 콘텐츠를 효율적으로 로드하기 위해 “Lazy Loading”이라는 개념을 사용합니다. Lazy Loading은 사용자가 페이지를 스크롤할 때 필요한 콘텐츠만 로드해 성능을 최적화하는 기술입니다. 이 기술은 웹 사이트의 로딩 속도를 향상시키고 데이터 소비를 줄여주는 중요한 역할을 합니다.

1. Intersection Observer API 사용

Lazy Loading을 구현하기 위해 JavaScript의 Intersection Observer API를 사용할 수 있습니다. 이 API를 사용하면 요소가 뷰포트 안에 들어오거나 뷰포트를 벗어났을 때를 바로 감지할 수 있습니다.

const lazyLoad = (target) => {
  const io = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        const src = img.getAttribute('data-lazy');

        img.setAttribute('src', src);
        img.classList.add('fade');

        observer.unobserve(img);
      }
    });
  });

  io.observe(target);
};

const images = document.querySelectorAll('img.lazy');

images.forEach(image => {
  lazyLoad(image);
});

위의 예시에서 img.lazy 선택자를 사용하여 로딩 지연되는 이미지들을 선택합니다. data-lazy 속성을 활용하여 이미지의 실제 소스를 추출하고 해당 소스를 이미지의 src 속성에 할당합니다. 이후 fade 클래스를 이미지에 추가해 페이드 효과를 주고, Intersection Observer를 더 이상 사용하지 않도록 이미지를 언옵저빙합니다.

2. jQuery 사용

Lazy Loading을 구현하는 또 다른 방법은 jQuery 플러그인을 사용하는 것입니다. jQuery Lazy Load 플러그인은 기존의 이미지 로딩 방식을 고려하여 이미지를 지연시키며, 사용자가 스크롤 할 때 이미지를 동적으로 로드합니다.

// jQuery 라이브러리를 페이지에 포함해야 합니다.

$('img.lazy').lazy({
  effect: 'fadeIn',
  threshold: 200
});

위의 예시에서 $('img.lazy') 선택자를 사용하여 로딩 지연되는 이미지들을 선택하고, .lazy() 메서드를 사용하여 Lazy Loading을 적용합니다. effect 옵션은 이미지가 보여질 때의 효과를 설정하고, threshold 옵션은 이미지가 로드되기 전에 뷰포트 기준으로 멈춰야 할 거리를 설정합니다.

두 예시 모두 효율적인 Lazy Loading을 구현하는 방법입니다. 사용자가 페이지를 스크롤할 때 불필요한 데이터를 미리 로드하지 않고 필요한 시점에만 로딩되므로 웹 페이지의 성능을 향상시킬 수 있습니다.

참고 자료: