앞서 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();
};
자동 캐싱
, 데이터 무효화
, 리패칭
기능은 성능 최적화에 도움을 준다.