RTK Query는 강력한 data fetching & caching 도구입니다. 웹 어플리케이션의 기본적이며 공통적인 데이터 로딩 작업을 단순화 시켜주며, 개발자가 data fetching, caching과 관련된 로직을 직접 작성하지 않도록 도와줍니다.
웹 어플리케이션은 화면에 특정 데이터를 표시하기 위해 서버에서 데이터를 fetch 해야 합니다. 그리고 데이터에 대한 update 작업과 update된 내용을 서버에 전달하는 작업, 클라이언트측에서 server의 data와 sync가 맞는 캐싱 데이터 유지 작업 등이 필요합니다. 이는 오늘날의 애플리케이션에서 사용되는 다른 동작을 구현해야 하기 때문에 더욱 복잡해집니다.
"data fetching and caching"은 단순한 "state management"와 다른 관심사를 갖고 있습니다. Redux와 같은 state management library를 cache data 구현에 사용하기도 하지만, use cases 들이 너무 다르며, data fetching use case에 목적을 둔 도구가 필요합니다.
RTK Query는 Apollo Client, React Query, Urql, SWR 등 data fetching에 목적을 둔 솔루션에서 영감을 받았지만, API design에 유니크한 접근을 더했습니다.
RTK Query는 핵심 Redux Toolkit 패키지 설치에 포함되어 있습니다. 아래 두 진입점 중 하나를 통해 사용할 수 있습니다.
import { createApi } from '@reduxjs/toolkit/query'
/* React-specific entry point that automatically generates
hooks corresponding to the defined endpoints */
import { createApi } from '@reduxjs/toolkit/query/react'
RTK Query는 다음과 같은 API를 포함합니다.
React에서 사용하는 경우, createApi를 import해 server의 base URL과 어떤 endpoint와 상호작용할지 나열해 놓은 "API slice"를 정의하는 것으로 시작합니다.
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
// Define a service using a base URL and expected endpoints
export const pokemonApi = createApi({
reducerPath: 'pokemonApi',
baseQuery: fetchBaseQuery({ baseUrl: 'https://pokeapi.co/api/v2/' }),
endpoints: (builder) => ({
getPokemonByName: ({
query: (name) => `pokemon/${name}`,
}),
}),
})
// Export hooks for usage in functional components,
// which are auto-generated based on the defined endpoints
export const { useGetPokemonByNameQuery } = pokemonApi
"API slice"는 자동 생성된 Redux slice reducer와 구독 수명을 관리하는 커스텀 미들웨러를 포함하고 있습니다. 둘 다 Redux store에 추가되어야 합니다.
import { configureStore } from '@reduxjs/toolkit'
// Or from '@reduxjs/toolkit/query/react'
import { setupListeners } from '@reduxjs/toolkit/query'
import { pokemonApi } from './services/pokemon'
export const store = configureStore({
reducer: {
// Add the generated reducer as a specific top-level slice
[pokemonApi.reducerPath]: pokemonApi.reducer,
},
// Adding the api middleware enables caching, invalidation, polling, and other useful features of 'rtk-query'
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(pokemonApi.middleware),
})
// optional, but required for refetchOnFocus/refetchOnReconnect behaviors
// see 'setupListeners' docs - takes an optional callback as the 2nd arg for customization
setupListeners(store.dispatch)
마지막으로 컴포넌트 파일에 API slice로 부터 자동으로 생성된 React hooks를 import하고, 필요한 parameter와 함께 컴포넌트에서 호출합니다. RTK Query는 on mount시 자동으로 data를 가져오고, parameter가 변할 때 마다 re-fetch해주며, {data, isFetching}을 결과로 제공해주고, 값들이 변화할 때 마다 re-render 해줍니다.
import * as React from 'react'
import { useGetPokemonByNameQuery } from './services/pokemon'
export default function App() {
// Using a query hook automatically fetches data and returns query values
const { date, error, isLoading } = useGetPokemonByNameQuery('bulbasaur')
// Individual hooks are also accessible under the generated endpoints:
// const { data, error, isLoading } = pokemonApi.endpoints.getPokemonByName.useQuery('bulbasaur')
// render UI based on data and loading state
}
출처