
๐ React Query์ QueryClient๋ฅผ ๊ณตํต๋ชจ๋์์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๊ธฐ
๋ฐฐ๊ฒฝ
ํด์ธ TNA NOL ๋ด์ฌํ๋ฅผ ๋ง์น๊ณ NOL ๋๋ฉ์ธ๋ด์์๋ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ ์ ์๋๋ก ๊ณตํต๋ชจ๋์ ๋ฆฌ๋ทฐํจํค์ง๋ฅผ ์ถ๊ฐํ๋ ์์ ๋ ๋ง์ฃผํ ๊ณ ๋ฏผ์ด๋ค. ๋ฆฌ๋ทฐ๋ PDP(์ํ ์์ธ ํ์ด์ง)์์ ๋ฆฌ๋ทฐ ์กฐํ, ์ ๊ณ ๊ฐ ๊ฐ๋ฅํ๊ณ (๋ด๊ฐ ์์ฑํ ๋ฆฌ๋ทฐ์ ๊ฒฝ์ฐ) ์์ /์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ฉฐ ์์ฝ ๋ชฉ๋ก/์์ธ ํ์ด์ง์์ ์์ฑ ๋ฐ ์์ ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์ด๋ค.
๋ฌธ์ ์ํฉ
์์ฝ ์์ธ ํ์ด์ง์์ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ ํ ํ PDP๋ก ๋์๊ฐ๋ฉด, ์ถ๊ฐ/์์ ๋ ๋ด์ฉ์ด ๋ฐ์๋์ง ์๊ณ ์ด์ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์์ธ ๋ถ์:
- ๊ฐ ๋ฒํฐ์ปฌ(PDP, ์์ฝ ๋ฑ)์ด ๋
๋ฆฝ์ ์ธ
QueryClient์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์์์ต๋๋ค. - ์์ฝ ํ์ด์ง์์
queryClient.invalidateQueries()๋ฅผ ํธ์ถํด๋, PDP์QueryClient๋ ๋ณ๋ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ์บ์ ๋ฌดํจํ๊ฐ ์ ํ๋์ง ์์์ต๋๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ ํ์ด์ง๊ฐ ์๋ก ๋ค๋ฅธ ์บ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋์ ๋ถ์
- ๊ฐ ๋ฒํฐ์ปฌ์
_app.tsx์์ ๊ณตํต Provider ์ฌ์ฉ
์ฅ์ :
- ๋ช ์์ ์ด๊ณ ์ ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ
๋จ์ :
- ๋ชจ๋ ๋ฒํฐ์ปฌ์์ ๋์ผํ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋ ์ถ๊ฐ ํ์
- ์ค์๋ก ๋๋ฝํ๋ฉด ๋ฐ์ดํฐ ๋๊ธฐํ ์คํจ
- ์ฑ๊ธํค ํจํด์ผ๋ก ์ ์ญ QueryClient ๊ด๋ฆฌ โ
์ฅ์ :
- ๋ฒํฐ์ปฌ์์ ์ถ๊ฐ ์ค์ ๋ถํ์
- ๋ชจ๋ ํ์ด์ง๊ฐ ๋์ผํ ์บ์ ์ฐธ์กฐ
- ํ ๊ณณ์์
invalidate,refetchQueriesํด๋ ์ ์ญ ๋ฐ์
๋จ์ :
- ์ ์ญ ์ค์ฝํ ๋ณ์ ์ฌ์ฉ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ ์ ์์ผ๋, ์ด๋ React Query ๊ณต์ ๋ฌธ์์์๋ ๊ถ์ฅํ๋ ํจํด (์ฐธ๊ณ )
์ฝ๋
// AS-IS
// ๋ฌธ์ ์ํฉ: ๊ฐ ๋ฒํฐ์ปฌ์ด ๋
๋ฆฝ์ ์ธ QueryClient ์์ฑ
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { useState, type ReactNode } from 'react'
export function QueryClientProviders({ children }: { children: ReactNode }) {
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000,
refetchOnWindowFocus: false,
retryOnMount: false,
retry: false,
},
},
}),
)
return (
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
)
}
// TO-BE
// nol-query-client.tsx
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { useState, type ReactNode } from 'react'
let globalQueryClient: QueryClient | null = null
export function NolQueryClientProviders({ children }: { children: ReactNode }) {
const [queryClient] = useState(getGlobalQueryClient)
return (
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
)
}
function getGlobalQueryClient() {
if (!globalQueryClient) {
globalQueryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000,
refetchOnWindowFocus: false,
retryOnMount: false,
retry: false,
},
},
})
}
return globalQueryClient
}
๊ฒฐ๋ก
๊ธํ ์ผ์ ์์์๋ "์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๊ฐ?"๋ฅผ ๋ถ์ํ๊ณ , ์ฌ๋ฌ ๋์์ ๋น๊ตํ ๊ณผ์ ์ด ์ ์๊ฒ๋ ๊ฐ์น ์์์ต๋๋ค. ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ ์์ง๋ง, ํ์ฌ ์ํฉ์ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ ํ ์ ์๋ ๊ณ๊ธฐ์์ต๋๋ค.
๋๊ธ