0Pricing
HTML Academy · 강의

무한 스크롤 구현하기

사용자가 스크롤할 때 콘텐츠를 자동으로 더 로드하기

무한 스크롤 구현하기은(는) CoddyKit의 무료 HTML Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 HTML Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. HTML Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

패턴

무한 스크롤은 사용자가 목록 아래쪽에 가까워질 때 더 많은 콘텐츠를 로드합니다. 가장 깔끔한 구현은 IntersectionObserver를 사용하는 것입니다. 목록 끝에 "sentinel" 요소를 배치하고 관찰하십시오. sentinel이 뷰포트에 들어오면 다음 page를 가져옵니다.

Sentinel 요소

마지막 목록 항목 뒤에 보이지 않는 <div> 또는 "로드 중..." 자리 표시자를 추가합니다. IntersectionObserver로 이를 관찰하십시오. 교차하면 사용자가 아래쪽 끝에 가까워졌다는 뜻이므로 더 가져올 때입니다.

<ul id="feed">
  <li>Post 1</li>
  <li>Post 2</li>
</ul>
<div id="sentinel" aria-hidden="true"></div>

관찰자 반복

교차하면 다음 page를 가져오고 새 항목을 렌더링한 다음 sentinel의 위치를 다시 조정합니다. sentinel 앞에 항목을 추가하면 자동으로 목록 끝에 남아 있습니다. unobserve한 뒤 다시 observe할 필요는 없습니다. sentinel은 계속 관찰되고 있기 때문입니다.

const sentinel = document.getElementById("sentinel");
const feed = document.getElementById("feed");
let page = 1;
let loading = false;
const observer = new IntersectionObserver(async (entries) => {
  if (!entries[0].isIntersecting || loading) return;
  loading = true;
  const items = await fetchPage(page++);
  items.forEach((it) => feed.insertAdjacentHTML("beforeend", renderItem(it)));
  loading = false;
});
observer.observe(sentinel);

로드 상태 보호

불리언 loading 플래그는 첫 번째 응답이 도착하기 전에 사용자가 빠르게 스크롤하여 여러 교차를 발생시킬 때 요청이 쌓이는 것을 방지합니다. 이 플래그가 없으면 같은 page를 반복해서 가져오고 항목이 중복되어 나타납니다.

데이터의 끝

서버가 빈 page를 반환하거나 "더 이상 없음"을 알리면 sentinel의 관찰을 중지하고 목록 끝 메시지로 교체하십시오. 이후의 교차는 가져오기를 실행하지 않으며, 사용자는 끝까지 도달했음을 알 수 있습니다.

오류 처리

가져오기 작업을 예외 처리로 감싸십시오. 오류가 발생하면 loading을 참으로 유지하여 재시도가 자동으로 실행되지 않게 하고, loading을 재설정한 뒤 로드를 다시 실행하는 "다시 시도" 버튼을 표시하십시오. 이렇게 하지 않으면 네트워크 오류로 재시도가 폭주합니다.

미리 가져오기 위한 rootMargin

rootMargin: "500px"는 사용자가 sentinel에 도달하기 500픽셀 전에 다음 가져오기를 시작합니다. 항목 높이와 평균 스크롤 속도를 기준으로 조정하십시오. 너무 작으면 사용자가 "아직 콘텐츠가 없음" 상태에 도달하고, 너무 크면 필요 이상으로 미리 가져오게 됩니다.

스크롤 위치 복원

사용자가 다른 곳으로 이동했다가 돌아오면 스크롤 위치가 보존되어야 하며 AND 이전에 로드한 항목도 다시 렌더링되어야 합니다. 항목을 sessionStorage 또는 Zustand 방식의 저장소에 캐시하고, 마운트할 때 복원한 뒤 기억해 둔 오프셋으로 scrollTo하십시오.

메모리 고려 사항

긴 무한 스크롤은 수천 개의 DOM 노드를 누적합니다. 매우 긴 feed(Twitter, Facebook)에는 윈도잉을 함께 사용하십시오. 뷰포트 위의 항목을 DOM에서 제거하고 위로 스크롤하면 다시 복원하는 방식입니다. react-virtual 또는 @tanstack/virtual과 같은 라이브러리는 이를 효율적으로 처리합니다.

접근성

무한 스크롤은 바닥글에 쉽게 도달할 수 없는 키보드 및 화면 낭독기 사용자에게 불편합니다. 대체 방식으로 "더 불러오기" 버튼을 제공하고, Home/End 키로 접근할 수 있는 실제 바닥글이 페이지에 있도록 하십시오. 새 항목을 알리는 실시간 영역도 도움이 됩니다.

모바일 탄성 스크롤

iOS의 탄성 스크롤은 아래쪽 근처에서 교차를 여러 번 발생시킬 수 있습니다. 로드 상태 보호가 대부분의 경우를 처리하지만, 탄성 스크롤 중 발생하는 교차 폭주를 걸러내기 위해 300ms 디바운스를 추가할 수도 있습니다.

대안: 커서 기반 페이지 매김

서버 API는 클라이언트가 추적하는 페이지 번호에 의존하는 대신 "다음 커서"를 반환해야 합니다. 스크롤 중 항목이 추가되거나 삭제되어도 더 안정적으로 동작합니다. 클라이언트는 각 요청에 커서를 전달하고 서버가 커서를 반환하지 않으면 중지합니다.

지식 확인

무한 스크롤 IntersectionObserver 콜백에서 로딩 플래그가 왜 필요합니까?

요약

무한 스크롤은 목록 끝의 센티널 요소에 IntersectionObserver를 사용합니다. 교차가 감지되면 다음 페이지를 가져와 렌더링하고 계속 관찰합니다. 로딩 플래그로 중복 실행을 방지하고, 데이터가 끝났을 때와 오류를 자연스럽게 처리하며, 미리 가져올 거리에 맞게 rootMargin을 조정합니다. 키보드 사용자를 위한 대안(더 불러오기 버튼)을 제공하고, 매우 긴 피드에는 윈도잉을 고려합니다.

자주 묻는 질문

“무한 스크롤 구현하기” 강의는 무료인가요?

네 — “무한 스크롤 구현하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 HTML Academy 강의 전체를 잠금 해제할 수 있습니다. HTML Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“무한 스크롤 구현하기”에서 뭘 배우나요?

사용자가 스크롤할 때 콘텐츠를 자동으로 더 로드하기 브라우저에서 직접 실행하는 실습 코드로 HTML Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

HTML Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 HTML Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“무한 스크롤 구현하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 HTML Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 HTML Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. IntersectionObserver API 및 임계값
  2. IntersectionObserver로 지연 로딩하기
  3. 무한 스크롤 구현하기
  4. 스크롤 연동 애니메이션 설정하기
← HTML Academy(으)로 돌아가기