ReactQuery

장현욱(Artlogy)·2022년 12월 13일
0

Next.js

목록 보기
6/6
post-thumbnail

본 포스팅은 Next.js환경에서 적용되는 ReactQuery사용법을 담고 있습니다.
기본 사용법과 설치법은 여기를 참고해주세요.

Prefetching

공식문서를 보면 ReactQuery는 두가지의 방법으로 prefetching을 지원합니다.

  1. initialData
  2. dehydrate - hydrate

Using InitailData

첫번째 사용방법은 다음과 같습니다.

export async function getStaticProps() {
	const posts = await getPosts()  
	return { props: { posts } }
}

function Posts(props) {  
	const { data } = useQuery(['posts'], getPosts, { initialData: props.posts })
  // ...
}

위 사용법은 직관적이고 간단하지만 getStaticProps로 마크업 할 데이터를 컴포넌트까지 props로 넘겨줘야 한다는 번거로움이 존재합니다.
데이터를 마크업만 하면 된다면 useQuery를 안쓰는게 더 깔끔 할 듯하다.

Using hydration

두번째 사용방법은 다음과 같습니다.

//_app.jsx
export default function MyApp({ Component, pageProps }) {  
	const [queryClient] = useState(()=> new QueryClient());
	return (    
		<QueryClientProvider client={queryClient}>      
			<Hydrate state={pageProps.dehydratedState}>       
				<Component {...pageProps} />      
			</Hydrate>    
		</QueryClientProvider>  
	)
}

위 처럼 설정한 후 다음과 같이 prefetch를 적용 할 수 있습니다.

// pages/posts.jsx
import { dehydrate, QueryClient, useQuery } from '@tanstack/react-query';

export async function getStaticProps() {
	const queryClient = new QueryClient()
	
	await queryClient.prefetchQuery('posts', getPosts)

	return {
		props: {
			dehydratedState: dehydrate(queryClient),
		},
	}
}

function Posts() {
	// 이 useQuery는 "Posts" 페이지에 대한 더 깊은 자식 요소에서 사용될 수도 있으며, data는 어느 쪽에서 사용되든 즉시 사용할 수 있다.
	const { data } = useQuery(['posts'], getPosts)

	// 이 query는 서버에서 prefetch된 것이 아니며 클라이언트에서 시작할 때까지 fetch하지 않는다. 
	// 두 가지 패턴(서버에서 prefetch, 클라이언트에서 fetch)은 혼합될 수 있다.
	const { data: otherData } = useQuery(['posts-2'], getPosts)
	
	// ...
}

따로 props를 넘겨 받지 않아도 queryClient.prefetchQuery의 queryKey를 통해 페이지 로드시 데이터 마크업이 가능합니다.

💡 hydrate & dehydrate
ReactDom에서 정적인 페이지(HTML)을 먼저 랜더링하고 JS코드가 모두 로드되면 HTML에 이벤트 핸들링등 JS코드를 적용하여 동적인 페이지를 만드는 작업을 hydreate라고 합니다. dehydrate는 hydreate로 공급될 cache에 대한 고정된 표현을 생성합니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN