- json-server : DB와 API 서버를 생성해주는 패키지
- axios : HTTP 요청(GET, POST 등)을 처리하기 위한 Javascript 라이브러리
- TanStack Query : 서버상태 관리 라이브러리
yarn add json-server{
"todos": [
{
"id": 1,
"title": "json-server",
"content": "json-server를 배워봅시다."
}
]
}
yarn json-server db.json --port 4000: HTTP 요청(GET, POST 등)을 처리하기 위한 Javascript 라이브러리
설치: yarn add axios
'크로스브라우징' 이슈를 해결하기 위해 리셋css 설정
main.jsx파일에서 QueryClientProvider를 이용하여 전역에서 queryClient를 사용 (-> 'invalidateQueries' 사용 가능)
(1) 비동기 로직의 복잡성 해결 필요
- 'useEffect'와 'useState'를 사용한 비동기 데이터 처리방식은 상태 관리가 복잡하고, 코드 중복이 많아 유지보수가 어려움
- 'Redux Thunk'와 같은 미들웨어를 사용해도, 비동기 로직의 테스트가 복잡하고, 보일러플레이트 코드가 많이 생김.
(2) 서버상태 관리의 어려움
- 서버상태는 클라이언트상태와 달리 캐싱, 동기화, 재검증 등 관리해야 할 요소가 많음.
설치: yarn add @tanstack/react-query
const getPosts = async () => { const response = await axios.get("http://localhost:5000/posts"); return response.data; }; const { data, isLoading, isError } = useQuery({ queryKey: ["posts"], // 배열 queryFn: getPosts, // 함수('getPosts'라는 페칭함수(axios사용)) }); if (isLoading) { return <div>로딩중입니다...</div>; } if (isError) { return <div>오류가 발생했습니다..</div>; }
=> 데이터를 가져오고, 로딩 상태(isLoading), 오류 상태(isError), 그리고 데이터를 반환(return response.data)
const addPost = async (newPost) => {
await axios.post("http://localhost:5000/posts", {
title: newPost.title,
views: newPost.views,
});
};
const mutation = useMutation({
mutationFn: addPost,
onSuccess: () => {/*invalidateQuerys 사용*/},
});
return (
<div>
<button
onClick={() => {
mutation.mutate({ title, views }),
}}
>
추가
</button>
</div>)
: queryKey가 더이상 유효하지 않다고 알려주는 것 (특정 쿼리를 무효화하여 데이터를 다시 패칭하게 하는 함수)
: 데이터를 캐싱하는 기준(서버에 계속 요청하지 않고 계속 가지고 있는 기준): queryKey
const queryClient = useQueryClient(); // main.jsx에서 queryClient 가져옴
const mutation = useMutation({
mutationFn: addPost,
onSuccess: () => {
queryClient.invalidateQueries(["posts"]); // ["posts"]를 다시 패칭해줌.
},
});
여기가 그 TIL맛집 ?!