개요
이번 튜토리얼에서는 React의 Suspense 기능과 무한 스크롤을 함께 사용하여 웹 페이지의 사용자 경험을 향상시킬 수 있는 방법을 알아보겠습니다. Suspense는 데이터 가져오기와 같은 지연 시간이 필요한 작업을 처리하고 로딩 상태를 처리하는 데 사용되며, 무한 스크롤은 사용자가 스크롤을 내릴 때 추가적인 컨텐츠를 동적으로 로드하는 기능입니다.
단계 1: React 프로젝트 설정
먼저 React 프로젝트를 설정해야 합니다. 아래의 명령을 통해 React 앱을 생성합니다.
npx create-react-app infinite-scroll-app
프로젝트 디렉토리로 이동한 후 아래의 명령을 사용하여 React 앱을 실행합니다.
cd infinite-scroll-app
npm start
단계 2: 무한 스크롤 컴포넌트 작성
이제 무한 스크롤을 구현할 컴포넌트를 작성해보겠습니다. InfiniteScroll
컴포넌트를 생성하고 아래의 코드를 추가합니다.
import React, { Suspense, useEffect, useState } from 'react';
const InfiniteScroll = () => {
const [data, setData] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [page, setPage] = useState(1);
useEffect(() => {
// 스크롤 이벤트 리스너 추가
window.addEventListener('scroll', handleScroll);
// 컴포넌트가 처음 마운트될 때 데이터를 가져옴
fetchData();
return () => {
// 컴포넌트가 언마운트될 때 스크롤 이벤트 리스너 제거
window.removeEventListener('scroll', handleScroll);
};
}, []);
const fetchData = async () => {
try {
// API 호출
const response = await fetch(`https://api.example.com/data?page=${page}`);
const newData = await response.json();
setData([...data, ...newData]);
setPage(page + 1);
setIsLoading(false);
} catch (error) {
console.error('Error fetching data:', error);
}
};
const handleScroll = () => {
// 스크롤이 끝에 도달했는지 확인
if (
window.innerHeight + document.documentElement.scrollTop ===
document.documentElement.offsetHeight
) {
// 추가 데이터를 가져오기 위해 로딩 상태 설정
setIsLoading(true);
fetchData();
}
};
return (
<div>
{data.map((item, index) => (
<div key={index}>
{/* 데이터 렌더링 */}
<p>{item}</p>
</div>
))}
{/* 로딩 상태 표시 */}
{isLoading && <p>Loading...</p>}
</div>
);
};
export default InfiniteScroll;
코드 설명
위의 코드는 InfiniteScroll
컴포넌트를 정의하고, 데이터 가져오기 및 추가 데이터 로드를 위한 함수들을 포함하고 있습니다.
data
: 현재까지 가져온 모든 데이터를 저장하는 배열입니다.isLoading
: 데이터를 가져오는 중인지를 나타내는 상태 변수입니다.page
: 현재 페이지 번호를 저장하는 변수입니다.
useEffect
를 사용하여 컴포넌트가 처음 마운트될 때 스크롤 이벤트 리스너를 추가하고, 데이터를 가져오는 fetchData
함수를 실행합니다. 또한 컴포넌트가 언마운트될 때 스크롤 이벤트 리스너를 제거합니다.
fetchData
함수는 fetch
를 사용하여 API로부터 데이터를 가져옵니다. 데이터를 가져온 후 현재 데이터 배열에 새로운 데이터를 추가합니다. 이후 페이지 번호를 증가시키고 로딩 상태를 해제합니다.
handleScroll
함수는 사용자가 스크롤을 끝까지 내렸을 때 추가 데이터를 가져오는 역할을 합니다. 이때 로딩 상태를 설정하여 사용자에게 로딩 중임을 알립니다.
마지막으로 data
를 매핑하여 모든 데이터를 렌더링하고, isLoading
변수가 true
일 때 로딩 메시지를 표시하는 JSX를 반환합니다.
단계 3: 무한 스크롤 컴포넌트 사용
마지막으로 App
컴포넌트에서 InfiniteScroll
컴포넌트를 사용하여 무한 스크롤을 구현해보겠습니다. src/App.js
파일을 열고 다음과 같이 수정합니다.
import React from 'react';
import InfiniteScroll from './InfiniteScroll';
function App() {
return (
<div>
<h1>Infinite Scroll Example</h1>
<InfiniteScroll />
</div>
);
}
export default App;
위의 코드는 InfiniteScroll
컴포넌트를 App
컴포넌트에서 사용하고 있습니다. 이제 앱을 실행하고 스크롤을 내려보면 추가 데이터가 스크롤 동작에 따라 동적으로 로드되는 것을 확인할 수 있습니다.
결론
이번 튜토리얼에서는 Suspense와 무한 스크롤을 함께 사용하여 웹 애플리케이션의 사용자 경험을 향상시키는 방법을 소개했습니다. 예제 코드를 사용하여 자신만의 무한 스크롤 구현에 도전해보세요.
#React #웹개발