앞서 middleware를 사용하여 비동기 처리를 통해 Redux 상태관리에 중앙집중화할 수 있었다. 다만, 현재 프로젝트에서 관리하던 상태는 서버 상태로서 관리하는 것이 효율성과 단순화에 좋다고 판단되었다.
RTK Query는 미들웨어, 액션, 리듀서 작성을 간소화하고 서버 데이터 캐싱, 업데이트, 리패칭을 효율적으로 관리하도록 도와준다.
useQuery, useMutation의 React Hooks을 제공한다. 이는 컴포넌트 내에서 API 요청을 쉽게 처리하고 데이터 상태를 관리하게 해준다.위의 특징은 React Query, SWR에서 제공해주는 특징과 비슷하다.
RTK Query는 React Query, SWR과 같은 데이터 패칭 기술과 비슷하지만 특별한 접근 방식을 API 디자인에 통합했다.
- Redux를 사용하는 프로젝트라면 RTK Query를 함께 사용하여 일관된 상태 관리를 가능토록 할 수 있다.
- Redux에 의존하지 않는 프로젝트에는 상대적으로 가벼운 React Query, SWR의 사용이 적합할 수 있다.
import { IUser, IUpdateUsers } from '@/modules/usersType';
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
const BASE_API_URL = 'http://localhost:9000';
export const userApi = createApi({
reducerPath: 'userApi',
baseQuery: fetchBaseQuery({ baseUrl: BASE_API_URL }),
endpoints: (builder) => ({
getUsers: builder.query<IUser[], void>({
query: () => '/user_data',
}),
addUser: builder.mutation<IUser, IUser>({
query: (user) => ({
url: '/user_data',
method: 'POST',
body: user,
}),
}),
updateUsers: builder.mutation<IUpdateUsers, IUpdateUsers>({
query: ({ ids, updateValue }) => ({
url: `/user_data`,
method: 'PATCH',
body: { ids, isDeleted: updateValue },
}),
}),
}),
});
export const { useGetUsersQuery, useAddUserMutation, useUpdateUsersMutation } =
userApi;
// 유저 데이터 조회 요청
const { data: users, isLoading, isError } = useGetUsersQuery();
// 유저 정보 업데이트 요청
const [updateUser] = useUpdateUsersMutation();
// 유저 추가 요청
const [addUser] = useAddUserMutation();
const restoreUser = async (ids: number[]) => {
await updateUser({ ids: ids, updateValue: false });
};
const onSubmit = async (data: IUser) => {
const newUserData: IUser = {
id: lastId + 1,
nickname: data.nickname,
birthday: data.birthday,
sex: data.sex,
isDeleted: false,
};
await addUser(newUserData);
onClose();
};
자동 캐싱, 데이터 무효화, 리패칭 기능은 성능 최적화에 도움을 준다.