page.tsx는 server component로만 구성한다. 그리고 필요한 데이터는 여기서 모두 fetch한다.
Component.tsx는 필요시 client component로 한다. 필요한 데이터는 모두 page.tsx로부터 상속받는다.
마트 앱을 생각해보자. 유저가 물건 카드 옆의 카트 버튼을 눌러서 장바구니에 그 물건을 담았다. (페이지는 그대로이다.) 그리고 상단의 장바구니 아이콘에 마우스를 올리면 현재 담긴 물건들을 보여주고 싶다고 해보자.
1. 유저의 행동은 client component에서 이뤄진다.
2. 유저의 행동은 새로고침 없인 server component에 영향을 주지 못한다.
3. 유저의 행동으로 인한 데이터의 변화를 보기 위해선 React Query가 필요하다.
layout.tsx의 <body> 태그 안을 감싼다."use client"
import { PropsWithChildren } from 'react'
import {
QueryClient,
QueryClientProvider as ReactQueryClientProvider
} from '@tanstack/react-query'
const queryClient = new QueryClient()
const QueryClientProvider = ({ children }: PropsWithChildren) => {
return (
<ReactQueryClientProvider client={queryClient}>
{ children }
</ReactQueryClientProvider>
)
}
export default QueryClientProvider
const { isPending, error, data, isFetching } = useQuery({ queryKey: ['users'],
queryFn: () => axios.get("/api/users").then(res => res.data)
})
isPending vs isFetchingisPending: 캐시 없이 처음으로 fetch를 하는 중이다.
isFetching: 캐시된 데이터에서 fetch를 하는 중이다.
useQuery vs useQueries: 단수, 복수 차이