리액트에서 UI가 늦게 뜨는 문제를 겪을 때, 하위 컴포넌트(Navbar 등)에서 useQuery
나 useEffect
로 직접 API 요청을 하는 구조가 원인일 수 있다. 이럴 땐 상위(AppLayout 등)에서 데이터를 먼저 불러온 뒤 props로 내려주는 방식이 성능상 훨씬 유리하다.
Navbar
내부에서 직접 useGetCurrentUserProfile()
을 실행undefined
상태로 먼저 렌더되고// AppLayout.tsx
const { data: userProfile, isLoading } = useGetCurrentUserProfile();
return (
<Navbar userProfile={userProfile} isLoading={isLoading} />
);
// Navbar.tsx
const Navbar = ({ userProfile, isLoading }: Props) => {
if (isLoading) return <Skeleton />;
return userProfile ? (
<div>{userProfile.display_name}님 환영합니다</div>
) : (
<LoginButton />
);
};
비교 항목 | Navbar 내부에서 fetch | AppLayout에서 fetch 후 props 전달 |
---|---|---|
상태 변화 | undefined → data 2번 렌더 | 1번만 렌더 |
사용자 체감 | "늦게 뜬다" 느낌 | 즉시 뜨는 느낌 |
렌더 흐름 | 비동기 fetch → 지연 발생 | 부모가 준비해서 자식은 빠르게 렌더 |
React에서 하위 컴포넌트가 직접 비동기 호출을 하게 되면 지연이 생길 수 있다.
이런 경우엔 상위 컴포넌트에서 먼저 데이터를 준비하고 자식 컴포넌트로 전달하는 방식이 훨씬 빠르고 자연스럽다.