IT기타
(React)데이터 로딩 상태를 표시하는 방법
emilyyoo
2025. 2. 24. 13:04
728x90
데이터 로딩 상태를 표시하는 방법은 사용자 경험(UX)을 개선하는 중요한 요소다. 일반적으로 다음과 같은 방법들이 사용된다.
1. 스피너 (Spinner) 사용
- 로딩 중임을 시각적으로 알릴 수 있는 가장 간단한 방법.
- 보통 react-loading 같은 라이브러리를 사용하거나 CSS 애니메이션으로 직접 구현 가능.
✅ 예제 (ShadCN + Tailwind)
import { Loader2 } from "lucide-react"
const LoadingSpinner = () => {
return (
<div className="flex justify-center items-center h-20">
<Loader2 className="h-8 w-8 animate-spin text-gray-500" />
</div>
)
}
export default LoadingSpinner
##다른 페이지에서 사용시
{isLoading && <LoadingSpinner />}
⚡ 라이브러리 필요: lucide-react (npm install lucide-react)
2. Skeleton UI (스켈레톤 로딩)
- 실제 콘텐츠의 레이아웃을 미리 보여줘서 화면 깜빡임을 줄이는 기법.
- 콘텐츠가 로드되기 전에 흐릿한 박스를 보여주는 방식.
✅ 예제 (ShadCN)
import { Skeleton } from "@/components/ui/skeleton"
const MenuSkeleton = () => {
return (
<div className="space-y-4">
<Skeleton className="h-6 w-32" />
<Skeleton className="h-4 w-24" />
<Skeleton className="h-20 w-full rounded-lg" />
</div>
)
}
{isLoading ? <MenuSkeleton /> : <MenuItemCard item={item} />}
⚡ ShadCN의 Skeleton 컴포넌트 사용
3. 로딩 메시지 표시
- 단순한 텍스트로 "로딩 중..."을 보여줌.
✅ 예제
{isLoading ? <p className="text-gray-500 text-center">로딩 중...</p> : <MenuList />}
4. Progress Bar (프로그레스 바)
- 페이지 이동 중이나 큰 데이터를 불러올 때 유용.
- nprogress 같은 라이브러리를 사용하면 편리.
✅ 예제 (nprogress 라이브러리 사용)
1️⃣ 설치:
npm install nprogress
2️⃣ 코드 적용:
import NProgress from "nprogress"
import { useEffect } from "react"
const useLoadingIndicator = (isLoading: boolean) => {
useEffect(() => {
if (isLoading) {
NProgress.start()
} else {
NProgress.done()
}
}, [isLoading])
}
......
.....
useLoadingIndicator(isLoading)
⚡ 페이지 전환 중 로딩 표시 가능 (next/router 사용 가능)
5. Lazy Loading (지연 로딩)
- Next.js에서는 React.lazy()나 next/dynamic()을 사용하여 필요한 부분만 로드 가능.
✅ 예제 (next/dynamic 사용)
import dynamic from "next/dynamic"
const LazyComponent = dynamic(() => import("@/components/HeavyComponent"), {
loading: () => <p>로딩 중...</p>,
})
<LazyComponent />
⚡ 무거운 컴포넌트의 로딩 속도 최적화
결론 (언제 어떤 방법을 써야 할까?)
상황추천 기법
API 호출 중 | Spinner / Skeleton UI |
데이터가 많을 때 | Skeleton UI |
페이지 이동 중 | Progress Bar (nprogress) |
무거운 컴포넌트 | Lazy Loading (next/dynamic) |
위 방법 중 프로젝트에 맞는 방식으로 적용하면 될 것 같아요! 🚀
어떤 방식이든 적용할 때 사용자 경험을 고려해서 부드러운 전환이 되도록 하면 좋습니다. 😊
728x90