๐ป QueryClient ์ฃผ์ ๋ด์ฉ
react-query์์ QueryClient์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์บ์์ ์ํธ์์ฉ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
// v4
import { QueryClient } from "@tanstack/react-query" ;
const queryClient = new QueryClient ( {
defaultOptions : {
queries : {
staleTime : Infinity ,
} ,
} ,
} ) ;
// v3
import { QueryClient } from "react-query" ;
const queryClient = new QueryClient ( {
defaultOptions : {
queries : {
staleTime : Infinity ,
} ,
} ,
} ) ;
queryCache?: QueryCache
Optional
ํด๋น queryClient ์ฐ๊ฒฐ๋ query ์บ์ ์
๋๋ค.
์ ์์ฐ์ด์ง๋ ์์
mutationCache?: MutationCache
Optional
ํด๋น queryClient์ ์ฐ๊ฒฐ๋ mutation cache์
๋๋ค.
์ ์์ฐ์ด์ง๋ ์์
logger?: Logger
v4
Optional
ํด๋น queryClient์ ๋๋ฒ๊น
์ ๋ณด, ๊ฒฝ๊ณ ๋ฐ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ก๊ฑฐ์
๋๋ค. ์ค์ ํ์ง ์์ผ๋ฉด console๊ธฐ๋ณธ ๋ก๊ฑฐ์
๋๋ค.
defaultOptions?: DefaultOptions
Optional
๋ชจ๋ query ๋ฐ mutation์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ ์ํฉ๋๋ค.
์์ฃผ ์ฐ์ โญ๏ธ
์์ฃผ ์ฐ์ด๋ QueryClient ์ต์
queryClient.useQueryClient
queryClient.getQueryData
queryClient.getQueriesData
queryClient.setQueryData
queryClient.setQueriesData
queryClient.invalidateQueries
queryClient.refetchQueries
queryClient.cancelQueries
queryClient.removeQueries
queryClient.resetQueries
queryClient.clear
๐ ์ฐธ๊ณ ๋ก v3 ํํ๋ฅผ v4์์ ๋๋ถ๋ถ ์ง์ํฉ๋๋ค ๐
์ผ๋ฐ์ ์ผ๋ก QueryClient์ ์ต์
๋ค์ ์ด์ฉํ ๋๋ ํ์ฌ QueryClient์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ useQueryClient Hook
์ ์ฌ์ฉํฉ๋๋ค.
// v3
import { useQueryClient } from "react-query" ;
const queryClient = useQueryClient ( ) ;
// v4
import { useQueryClient } from "@tanstack/react-query" ;
const queryClient = useQueryClient ( { context } ) ;
// context?: React.Context<QueryClient | undefined>
// ์ฌ์ฉ์ ์ ์ React Query Context๋ฅผ ์ฌ์ฉํ ๋ ํด๋น ์ต์
์ฌ์ฉํจ
queryClient.getQueryData๋ ๊ธฐ์กด ์ฟผ๋ฆฌ์ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ธฐ ํจ์
์
๋๋ค. ์ฟผ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด undefined
๋ฅผ ๋ฐํํฉ๋๋ค.
// v3
const data = queryClient . getQueryData ( queryKey ) ;
// v4
const data = queryClient . getQueryData ( { queryKey } ) ;
// ์ค์ ์์
const queryData = queryClient . getQueryData ( [ "super-heroes" ] ) ;
// type
getQueryData < TQueryFnData = unknown > ( queryKey : QueryKey , filters ?: QueryFilters ) : TQueryFnData | undefined ;
queryClient.getQueriesData๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ธฐ ํจ์
์
๋๋ค. ์ ๋ฌ๋ queryKey
๋๋ filters
์ ์ผ์นํ๋ ์ฟผ๋ฆฌ๋ง ๋ฐํํฉ๋๋ค. ์ผ์นํ๋ ์ฟผ๋ฆฌ๊ฐ ์์ผ๋ฉด ๋น ๋ฐฐ์ด
์ด ๋ฐํ๋ฉ๋๋ค.
Query filters
// v3/v4
const data = queryClient . getQueriesData ( queryKey | filters ) ;
v4์์๋ v3 ํํ๋ ์ง์ํฉ๋๋ค
// type
getQueriesData < TQueryFnData = unknown > ( queryKey : QueryKey ) : [ QueryKey , TQueryFnData | undefined ] [ ] ;
getQueriesData < TQueryFnData = unknown > ( filters : QueryFilters ) : [ QueryKey , TQueryFnData | undefined ] [ ] ;
queryClient.setQueryData๋ ์บ์ฑ๋ ์ฟผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์
๋ฐ์ดํธํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ธฐ ํจ์
์
๋๋ค.
invalidateQueries์ ๋๋ถ์ด ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ต์ ํํ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
// v3/v4
queryClient . setQueryData ( [ "super-hero" ] , ( oldData ) => {
return {
...oldData ,
data : [ ...oldData . data , data . data ] ,
} ;
} ) ;
v4์์๋ v3 ํํ๋ ์ง์ํฉ๋๋ค
// type
setQueryData < TQueryFnData > ( queryKey : QueryKey , updater : Updater < TQueryFnData | undefined , TQueryFnData | undefined > , options ?: SetDataOptions ) : TQueryFnData | undefined ;
queryClient.setQueriesData๋ ํํฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฑฐ๋ ์ฟผ๋ฆฌ ํค๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์ผ์น์์ผ ์ฌ๋ฌ ์ฟผ๋ฆฌ์ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์
๋ฐ์ดํธํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ธฐ ํจ์
์ด๋ค.
์ ๋ฌ๋ queryKey ๋๋ filters์ ์ผ์นํ๋ ์ฟผ๋ฆฌ๋ง ์
๋ฐ์ดํธ๋๋ฉฐ, ์ ์บ์ ํญ๋ชฉ์ด ์์ฑ๋์ง ์๋๋ค.
// v3/v4
queryClient . setQueriesData ( [ "super-hero" ] , ( oldData ) => {
return {
...oldData ,
data : [ ...oldData . data , data . data ] ,
} ;
} ) ;
v4์์๋ v3 ํํ๋ ์ง์ํฉ๋๋ค
setQueriesData < TQueryFnData > ( queryKey : QueryKey , updater : Updater < TQueryFnData | undefined , TQueryFnData | undefined > , options ?: SetDataOptions ) : [ QueryKey , TQueryFnData | undefined ] [ ] ;
setQueriesData < TQueryFnData > ( filters : QueryFilters , updater : Updater < TQueryFnData | undefined , TQueryFnData | undefined > , options ?: SetDataOptions ) : [ QueryKey , TQueryFnData | undefined ] [ ] ;
queryClient.invalidateQueries๋ setQueryData์ ๋๋ถ์ด ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ต์ ํ
ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ ํจ์์ด๋ค. (์ฟผ๋ฆฌ ๋ฌดํจํ ์์ ) ๋จ์ผ ๋๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํจํํ๊ณ , ๋ค์ ๊ฐ์ ธ์ค๋๋ฐ ๋ง์ด ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์นํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ ์ฆ์ ์ ํจํ์ง ์์ ๊ฒ์ผ๋ก ํ์๋๊ณ , ํ์ฑ ์ฟผ๋ฆฌ๋ ๋ฐฑ๋๋ผ์ด๋์์ ๋ค์ ๊ฐ์ ธ์จ๋ค.
๋ง์ฝ, ํ์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ํ์ง ์์ผ๋ฉด v3์์๋ refetchActive: false
, v4์์๋ refetchType: 'none'
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋๋ก ๋น ํ์ฑํ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ๋ค๋ฉด v3์์๋ refetchInactive: true
, v4์์๋ refetchType: 'all'
์ ์ฌ์ฉํ ์ ์๋ค.
์ฐธ๊ณ ๋ก query ์ต์
์ผ๋ก enabled: false
์ต์
์ ์ฃผ๋ฉด queryClient๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ค ์ค invalidateQueries
์ refetchQueries
๋ฅผ ๋ฌด์ํ๋ค.
// v3
await queryClient . invalidateQueries (
[ "super-heroes" ] ,
{
exact,
refetchActive : true ,
refetchInactive : false ,
} ,
{ throwOnError, cancelRefetch }
) ;
// v4
await queryClient . invalidateQueries (
{
queryKey : [ "super-heroes" ] ,
exact,
refetchType : "active" ,
} ,
{ throwOnError, cancelRefetch }
) ;
// exact์ต์
์ ์คฌ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ํค์ ์ ํํ ์ผ์นํ๋ ์ฟผ๋ฆฌ๋ง์ ๋ฌดํจํํ๊ณ ๋ค์ ๊ฐ์ ธ์จ๋ค.
์ถ๊ฐ์ ์ผ๋ก invalidateQueries๊ฐ ๋ฌดํจํํ๋ ์ฟผ๋ฆฌ ๋ฒ์
๋ ๊ธฐ๋ณธ์ ์ผ๋ก์์ -> ํ์
๋ก ์ ํ๋๋ค. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด ์๋์ ๊ฐ์ด ['super-heros']
์ฟผ๋ฆฌ๋ฅผ ๋ฌดํจํ ํ๊ฒ ๋๋ฉด ์๋ ํ์ ์ฟผ๋ฆฌ๋ค๋ ๋ชจ๋ ์ด๊ธฐํ๋๋ค.
queryClient . invalidateQueries ( {
queryKey : [ "super-heroes" ] ,
} ) ;
[ "super-heros" ] ,
[ "super-heros" , 'superman' ] ,
[ "super-heros" , { id : 1 } ] ,
์์ ๊ฐ์ด ['super-heros']
์ฟผ๋ฆฌ๋ฅผ ๋ฌดํจํ ํ๊ฒ ๋๋ฉด ์๋ ํ์ ์ฟผ๋ฆฌ๋ค๋ ๋ชจ๋ ์ด๊ธฐํ๋๋ค.
ํ์ง๋ง ํด๋น key๋ง
๋ฌดํจํ ์ํค๋ ค๋ฉด ์ฒซ ๋ฒ์งธ ์์ ์ฝ๋์์๋ ์ธ๊ธํ๋ฏ์ด exact
์ต์
์ ์ฃผ๋ฉด ๋๋ค.
v4์์๋ v3 ํํ๋ ์ง์ํฉ๋๋ค
// type
invalidateQueries < TPageData = unknown > ( filters ?: InvalidateQueryFilters < TPageData > , options ?: InvalidateOptions ) : Promise < void > ;
invalidateQueries < TPageData = unknown > ( queryKey ?: QueryKey , filters ?: InvalidateQueryFilters < TPageData > , options ?: InvalidateOptions ) : Promise < void > ;
queryClient.refetchQueries๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ๋ ํจ์
์ด๋ค.
์ฐธ๊ณ ๋ก query ์ต์
์ผ๋ก enabled: false
์ต์
์ ์ฃผ๋ฉด queryClient๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ค ์ค invalidateQueries
์ refetchQueries
๋ฅผ ๋ฌด์ํ๋ค.
// v3
// ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค
await queryClient . refetchQueries ( ) ;
// ๋ชจ๋ stale ์ํ์ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.
await queryClient . refetchQueries ( { stale : true } ) ;
// ์ฟผ๋ฆฌ ํค์ ๋ถ๋ถ์ ์ผ๋ก ์ผ์นํ๋ ๋ชจ๋ ํ์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.
await queryClient . refetchQueries ( [ "super-heroes" ] , { active : true } ) ;
// exact ์ต์
์ ์คฌ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ํค์ ์ ํํ ์ผ์นํ๋ ๋ชจ๋ ํ์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.
await queryClient . refetchQueries ( [ "super-heroes" , 1 ] , {
active : true ,
exact : true ,
} ) ;
// v4
// ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค
await queryClient . refetchQueries ( ) ;
// ๋ชจ๋ stale ์ํ์ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.
await queryClient . refetchQueries ( { stale : true } ) ;
// ์ฟผ๋ฆฌ ํค์ ๋ถ๋ถ์ ์ผ๋ก ์ผ์นํ๋ ๋ชจ๋ ํ์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.
await queryClient . refetchQueries ( {
queryKey : [ "super-heroes" ] ,
type : "active" ,
} ) ;
// exact ์ต์
์ ์คฌ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ํค์ ์ ํํ ์ผ์นํ๋ ๋ชจ๋ ํ์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.
await queryClient . refetchQueries ( {
queryKey : [ "super-heroes" , 1 ] ,
type : "active" ,
exact : true ,
} ) ;
await queryClient . refetchQueries (
{
queryKey : [ "super-heroes" , 1 ] ,
type : "active" ,
exact : true ,
} ,
{ throwOnError, cancelRefetch }
) ;
v4์์๋ v3ํํ๋ก ์ง์ํฉ๋๋ค.
// type
refetchQueries < TPageData = unknown > ( filters ?: RefetchQueryFilters < TPageData > , options ?: RefetchOptions ) : Promise < void > ;
refetchQueries < TPageData = unknown > ( queryKey ?: QueryKey , filters ?: RefetchQueryFilters < TPageData > , options ?: RefetchOptions ) : Promise < void > ;
queryClient.cancelQueries๋ ๋๊ฐ๊ณ ์๋ ์ก์ธ์ค ๊ฐ๋ฅํ ์ฟผ๋ฆฌ๋ฅผ ์๋์ ์ผ๋ก ์ทจ์์ํฌ ์ ์๋ ํจ์
์ด๋ค.
ํด๋น ํจ์๋ ๋๊ฐ๊ณ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๊ด์ ์
๋ฐ์ดํธ
๋ฅผ ํ ๋ ์ํํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ค. (๋๊ด์ ์
๋ฐ์ดํธ ์ฐธ๊ณ )
// v3
await queryClient . cancelQueries ( [ "super-heroes" ] , { exact : true } ) ;
// v4
await queryClient . cancelQueries ( { queryKey : [ "super-heroes" ] , exact : true } ) ;
v4์์๋ v3ํํ๋ ์ง์ํฉ๋๋ค.
// type
cancelQueries ( filters ?: QueryFilters , options ?: CancelOptions ) : Promise < void > ;
cancelQueries ( queryKey ?: QueryKey , filters ?: QueryFilters , options ?: CancelOptions ) : Promise < void > ;
queryClient.removeQueries๋ ์ก์ธ์ค ๊ฐ๋ฅํ ์บ์ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ ๋ ์ฌ์ฉํ๋ ํจ์์ด๋ค.
// v3
queryClient . removeQueries ( [ "super-heroes" ] , { exact : true } ) ;
// v4
queryClient . removeQueries ( { queryKey : [ "super-heroes" ] , exact : true } ) ;
v4์์๋ v3ํํ๋ ์ง์ํฉ๋๋ค.
removeQueries ( filters ?: QueryFilters ) : void ;
removeQueries ( queryKey ?: QueryKey , filters ?: QueryFilters ) : void ;
queryClient.resetQueries๋ ์ก์ธ์ค ๊ฐ๋ฅํ ์บ์ ์ฟผ๋ฆฌ๋ฅผ ์ด๊ธฐ ์ํ๋ก ์ฌ์ค์ ํ๋๋ฐ ์ฌ์ฉํ๋ ํจ์
์ด๋ค.
ํด๋น ํจ์๋ clear์๋ ๋ฌ๋ฆฌ ๋ชจ๋ ๊ตฌ๋
์๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ๊ตฌ๋
์๋ค์๊ฒ ์๋ฆฐ๋ค. ๋ํ invalidateQueries์๋ ๋ฌ๋ฆฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋๋ ์ํ๋ก ์ฌ์ค์ ํ๋ค.
๋ง์ฝ, ์ฟผ๋ฆฌ ์ต์
์ผ๋ก initialData
๊ฐ ์๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ํด๋น ๋ฐ์ดํฐ๋ก ์ฌ์ค์ ๋๋ค.
// v3
queryClient . resetQueries ( [ "super-heroes" ] , { exact : true } ) ;
// v4
queryClient . resetQueries ( { queryKey : [ "super-heroes" ] , exact : true } ) ;
v4์์๋ v3ํํ๋ ์ง์ํฉ๋๋ค.
// type
resetQueries < TPageData = unknown > ( filters ?: ResetQueryFilters < TPageData > , options ?: ResetOptions ) : Promise < void > ;
resetQueries < TPageData = unknown > ( queryKey ?: QueryKey , filters ?: ResetQueryFilters < TPageData > , options ?: ResetOptions ) : Promise < void > ;
queryClient.clear๋ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์บ์๋ฅผ ์ ๊ฑฐํ๋ค.