상황

부모-자식 관계인 여러 컴포넌트에서 동일한 서버 데이터를 사용한다. react-query의 useQuery를 통해 데이터를 불러오려 할 때, 어떤 식으로 코드를 작성하는 것이 좋을까?

1. 최상위 컴포넌트에서 useQuery 호출 후 자식 컴포넌트의 props로 전달

최상위 컴포넌트에서 필요한 모든 데이터를 불러온 후, 자식 컴포넌트에게 차례로 props로 내려주는 방식이다.

export function GrandParent() {
	const user = useQuery(['user'], fetchUser);
	const score = useQuery(['score'], fetchScore);
	// ...
	return <Parent user={user} score={score} />
}

export function Parent({user, score}) {
	// ...
	return <Child score={score} />
}

export function Child({score}) {
	// ...
}

장점

단점

2. 데이터가 필요한 컴포넌트에서 각자 useQuery 호출

react-query가 서버 상태를 전역 상태처럼 다룰 수 있다는 장점을 이용한 방법이다.

여러 컴포넌트에서 동시에 useQuery를 호출하더라도 실제 데이터 페칭은 1번만 이루어지므로 성능도 크게 문제가 되지 않는다.

export function GrandParent() {
	const user = useQuery(['user'], fetchUser);
	const score = useQuery(['score'], fetchScore);
	// ...
	return <Parent user={user} score={score} />
}

export function Parent() {
	const user = useQuery(['user'], fetchUser);
	// ...
	return <Child score={score} />
}

export function Child() {
	const score = useQuery(['score'], fetchScore);
	// ...
}

장점

단점

그런데 왜 useQuery를 여러 번 호출해도 괜찮을까?