Next.js
[Nextjs]상태관리
Dev갱이
2022. 12. 22. 13:06
728x90
Nextjs를 공부할겸 프로젝트를 하나 만들고 있는데, seo가 필요해서 ssr를 사용 해야했다. 근데 Nextjs에는 Hydrate라는 개념이 존재함.
따라서 비동기 서버 상태 관리는 react-query를 사용하고, 클라이언트 상태관리는 Recoil을 사용함.
- 서버 상태관리 : react-query
- 클라이언트 상태관리 : recoil
npm i react-query
npm install recoil
2가지를 적용하기 위해서 _app.tsx 파일에서 설정 해줘야함.
import '../styles/globals.css';
import React from 'react';
import type { AppProps } from 'next/app';
import { Hydrate, QueryClient, QueryClientProvider } from 'react-query';
function MyApp({ Component, pageProps }: AppProps) {
const queryClient = React.useRef(new QueryClient());
return (
<QueryClientProvider client={queryClient.current}>
<Hydrate state={pageProps.dehydratedState}>
<Component {...pageProps} />
</Hydrate>
</QueryClientProvider>
);
}
export default MyApp
react-query 먼저 적용을 하는 과정에서 queryClient 만들때 React.useRef가 있는데, 어떤글이나 react-query 공홈에서는 useState를 사용하고 어떤글에선 useRef를 사용해서 둘이 무엇이 차이가 있는걸까 궁금했다. 그 이유를 알려면
useState와 useRef의 차이를 알면된다.
useState와 useRef 모두 상태관리를 위해 사용할 수 있다. 다만
useState의 경우 state변화 후에 re-rendering을 진행하는 반면 useRef는 진행하지 않는다.
결론적으로 나는 서버상태관리로 react-query를 사용 하는데, 비동기 데이터를 다룰것이기 때문에 state가 변화해서 re-rendering 하지 않는다. 그러므로 나는 useRef를 사용하는게 맞다!
import '../styles/globals.css';
import React from 'react';
import type { AppProps } from 'next/app';
import { Hydrate, QueryClient, QueryClientProvider } from 'react-query';
import { RecoilRoot } from 'recoil';
function MyApp({ Component, pageProps }: AppProps) {
const queryClient = React.useRef(new QueryClient());
return (
<QueryClientProvider client={queryClient.current}>
<Hydrate state={pageProps.dehydratedState}>
<RecoilRoot>
<Component {...pageProps} />
</RecoilRoot>
</Hydrate>
</QueryClientProvider>
);
}
export default MyApp
728x90