무한스크롤과 optimistic update를 구현하기 위해 next.js에 react-query를 사용하기로 했다.
next.js 14 app router에 react-query를 설정하는 방법을 기록하자
providers
폴더 생성ReactQueryProvider.tsx
생성1'use client'; 2 3import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; 4import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; 5import { useState } from 'react'; 6 7function ReactQueryProvider({ children }: React.PropsWithChildren) { 8 const [client] = useState(new QueryClient()); 9 10 return ( 11 <QueryClientProvider client={client}> 12 {children} 13 <ReactQueryDevtools initialIsOpen={false} /> 14 </QueryClientProvider> 15 ); 16} 17 18export default ReactQueryProvider;
const client = new QueryClient()
를 사용하면, 컴포넌트가 리렌더링될 때마다 새로운 QueryClient 인스턴스가 생성된다. 이는 불필요한 인스턴스 생성과 데이터 캐싱의 중복을 초래한다.ReactQueryDevtools
는 개발 모드일 때 여러 쿼리를 시각적으로 볼 수 있는 관리 툴이다.layout.tsx
에서 children
감싸기1import ReactQueryProvider from '../providers/ReactQueryProvider'; 2import './globals.css'; 3 4export default function RootLayout({ 5 children, 6}: Readonly<{ 7 children: React.ReactNode; 8}>) { 9 return ( 10 <html lang='ko'> 11 <body> 12 <ReactQueryProvider>{children}</ReactQueryProvider> 13 </body> 14 </html> 15 ); 16}
ReactQueryProvider
로 감싸주는 이유useQuery
사용하기1const { data, isLoading } = useQuery<Reply[]>({ 2 queryKey: ['reply-list', post_id], 3 queryFn: () => getReplyList(post_id), 4 });
끝!