웹 프레임워크(React, Vue) 그 자체만으로는 전역 상태 관리를 하는것이 불편하다. 그래서 완전 소규모의 웹개발이 아닌이상 개발 시에는 상태 관리 라이브러리 (Redux, Recoil 등등...)을 같이 사용한다.
그런데 상태 관리 라이브러리들의 경우 클라이언트 상태 관리에는 적합하지만, 비동기, 서버 상태를 관리하는데 있어서는 아래와 같은 이유로 적합하지 않다.
가령 서버에서 현재 로그인한 유저의 데이터를 가져와 저장하는 로직을 Recoil을 사용해 구현해본다 해보자.
export const currentUserID = atom<string>({
key: "currentUserID",
default: "".
});
export const getCurrentUserInfo = selector({
key: "getCurrentUserInfo",
get: async({get}) => {
const id = get(currentUserID);
if (!id) return {};
try {
return await (await fetch(`https://somepage.com/users/${id}`)).json();
} catch(error) {
throw Error("Network Error");
}
}
});
// 토큰이 쿠키에 저장되어 있다 해보자.
const { status, data: currentUser } = useQuery({
queryKey: ["getCurrentUserInfo"],
queryFn: () => await (await fetch(`https://somepage.com/currentuser/`)).json(),
});
import {
QueryClient,
QueryClientProvider,
useQuery,
} from '@tanstack/react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
const { isLoading, error, data } = useQuery({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://api.github.com/repos/TanStack/query').then(
(res) => res.json(),
),
})
if (isLoading) return 'Loading...'
if (error) return 'An error has occurred: ' + error.message
return (
<div>
<h1>{data.name}</h1>
<p>{data.description}</p>
<strong>👀 {data.subscribers_count}</strong>{' '}
<strong>✨ {data.stargazers_count}</strong>{' '}
<strong>🍴 {data.forks_count}</strong>
</div>
)
}
많은 것을 배웠습니다, 감사합니다.