react
CHAPTER 21 / 34
읽기 약 2분
FUNCTION
React로 무한 스크롤 구현
핵심 개념
IntersectionObserver와 useRef/useEffect를 조합해 무한 스크롤을 구현합니다. 스크롤 끝에 도달하면 새 데이터를 로드합니다. useState로 데이터와 로딩 상태를 관리합니다. Observer를 지우며 무한 스크롤이 어떻게 멈추는지 확인하십시오.
코드 분석
const { useState, useEffect, useRef } = React;
function InfiniteList() {
const [items, setItems] = useState(Array.from({length:5}, (_,i) => `UNIT-${i+1}` ));
const [loading, setLoading] = useState(false);
const loaderRef = useRef(null);
useEffect(() => {
const observer = new IntersectionObserver(entries => {
if (entries[0].isIntersecting && !loading) {
setLoading(true);
setTimeout(() => {
setItems(prev => [...prev, ...Array.from({length:3}, (_,i) => `UNIT-${prev.length+i+1}`)]);
setLoading(false);
}, 800);
}
});
if (loaderRef.current) observer.observe(loaderRef.current);
return () => observer.disconnect();
}, [loading]);
return (
<div style={{height:'200px', overflowY:'auto', border:'1px solid #1a1a1a', padding:'8px'}}>
{items.map(item => <div key={item} style={{color:'#888', padding:'6px 0', borderBottom:'1px solid #1a1a1a', fontSize:'12px'}}>▶ {item}</div>)}
<div ref={loaderRef} style={{color:'#333', textAlign:'center', padding:'8px', fontSize:'11px'}}>{loading ? 'LOADING...' : 'SCROLL DOWN'}</div>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<InfiniteList />);AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
이 React '무한 스크롤' 컴포넌트에서 불필요한 리렌더링·메모리 누수·의존성 배열 누락을 찾고 최적화 코드로 리팩토링해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
'무한 스크롤'를 사용한 실전 컴포넌트를 TypeScript + Tailwind 포함 완성 코드로 만들어줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
이 React '무한 스크롤' 사용 패턴 전체를 분석하고 번들 크기·렌더링 횟수·Core Web Vitals 개선 방안을 우선순위로 알려줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
React '무한 스크롤' vs 다른 프레임워크(Vue/Svelte/Solid)의 동일 기능 구현 방식을 솔직하게 비교하고 2026년 트렌드를 알려줘.
⭐ 이것만 기억하세요
React로 무한 스크롤 구현은 이 3가지만 확실히 잡으세요
1.페이지를 한 번에 전부 로딩하면 초기 로딩이 느리고, 수천 개 DOM 노드가 생겨 스크롤 성능이 떨어집니다
2.IntersectionObserver로 하단 감지 → API로 다음 페이지 요청 → 기존 목록에 concat하는 3단계가 핵심 패턴입니다
3.다음 챕터에서 마우스로 요소를 끌어 재배치하는 드래그 앤 드롭을 구현합니다
공유하기
진행도 21 / 34