- ํด๋น ๋ฌธ์๋ tkdodo - inside-react-query ํฌ์คํ ์ ๋ฒ์ญํ๊ณ , ์ข ๋ ์ดํด์ ํ์ํ ๋ด์ฉ์ ์ถ๊ฐํ ๋ฌธ์์ ๋๋ค.
- React Query๋ ๋ฆฌ๋ ๋๋งํด์ผ ํ๋ ์์ ์ ์ด๋ป๊ฒ ์ ์ ์์๊น์? ๋ ์ด๋ป๊ฒ ์ค๋ณต ์์ฒญ์ ์ ๊ฑฐํ๊ณ , ์ด๋ป๊ฒ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์์ ์ ์์๊น์?
- ์ ์ง๋ฌธ๋ค์ ๋ตํ๋ ค๋ฉด React Query์ ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค๋ณด๊ณ , useQuery๋ฅผ ํธ์ถํ ๋ ์ค์ ๋ก ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ถ์ํด๋ด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ๊ฒ์
QueryClient์์ ์์๋ฉ๋๋ค. - QueryClient๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ,
QueryClientProvider๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด๋์์๋ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํด๋์ค์ ๋๋ค.
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
// โฌ๏ธ this creates the client
const queryClient = new QueryClient();
function App() {
return (
// โฌ๏ธ this distributes the client
<QueryClientProvider client={queryClient}>
<RestOfYourApp />
</QueryClientProvider>
);
}- QueryClientProvider๋
React Context๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ QueryClient๋ฅผ ์ ๋ฌํฉ๋๋ค. new QueryClient()๋ก ์์ฑํ ์ธ์คํด์ค๋์์ ์ ์ธ ๊ฐ์ด๋ฉฐ ํ ๋ฒ๋ง ์์ฑ๋๋ฏ๋ก, React Context๋ก ์ ๋ฌํ๊ธฐ์ ์ ์ ํฉ๋๋ค.- Context๊ฐ ์ฑ์ ๋ค์ ๋ฆฌ๋ ๋๋ง์ํค๋ ๊ฒ์ด ์๋๋ผ, ๋จ์ง useQueryClient๋ฅผ ํตํด queryClient์ ๋ํ
์ก์ธ์ค ๊ถํ๋ง ๋ถ์ฌํฉ๋๋ค. - ๋ค๋ง queryClient ์ธ์คํด์ค๊ฐ ์ค์๋ก ์์ฃผ ๋ค์ ์์ฑ๋์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- Context๊ฐ ์ฑ์ ๋ค์ ๋ฆฌ๋ ๋๋ง์ํค๋ ๊ฒ์ด ์๋๋ผ, ๋จ์ง useQueryClient๋ฅผ ํตํด queryClient์ ๋ํ
- ์ ์๋ ค์ ธ ์์ง ์์ ์๋ ์์ง๋ง, QueryClient ์์ฒด๋ ์ค์ ๋ก ๋ง์ ์ผ์ ํ์ง ์์ต๋๋ค.
- QueryClient๋
new QueryClient()๋ฅผ ํธ์ถํ ๋ ํจ๊ป ์์ฑ๋๋QueryCache์MutationCache๋ฅผ ๋ด๋ ์ปจํ ์ด๋์ ๋๋ค. ๋ํ ๋ชจ๋query์mutation์ ์ ์ฉํ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ๊ฐ์ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ, cache(์บ์)๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. - ๋๋ถ๋ถ์ ์ํฉ์์๋
cache์ ์ง์ ์ํธ ์์ฉํ์ง ์๊ณ QueryClient๋ฅผ ํตํด cache์ ์ก์ธ์คํฉ๋๋ค.
- QueryClient๋ ์ฐ๋ฆฌ๊ฐ cache๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ค๋๋ค. ๊ทธ๋ ๋ค๋ฉด cache(QueryCache)๋ ๋ฌด์์ผ๊น์?
- ๊ฐ๋จํ ๋งํด QueryCache๋
in-memory๊ฐ์ฒด์ ๋๋ค. key๋์์ ์ ์ผ๋ก ์ง๋ ฌํ๋ queryKey(queryKeyHash๋ผ๊ณ ํฉ๋๋ค)์ด๊ณ , value๋Query ํด๋์ค์ ์ธ์คํด์ค์ ๋๋ค. - React Query๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ
in-memory์๋ง ์ ์ฅํ๊ณ , ๋ค๋ฅธ ๊ณณ์๋ ์ ์ฅํ์ง ์์ต๋๋ค. ์ด ์ ์ ์ดํดํ๋ ๊ฒ์ด ๊ต์ฅํ ์ค์ํฉ๋๋ค.
ํด์: ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์บ์๋ ์ธ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ฉฐ, ํด๋น ํญ์ JavaScript ์ปจํ ์คํธ๊ฐ ์ด์์๋ ๋์์๋ง ์ ์ง๋ฉ๋๋ค. ์๋ก๊ณ ์นจ, ํ๋ ๋ด๋น๊ฒ์ด์ (pushState๋ replaceState ํ์คํ ๋ฆฌ API๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด๋), ํญ์ ๋ซ๊ฑฐ๋ ์๋ก ์ฌ๋ ๊ฒฝ์ฐ์๋ ์บ์๊ฐ ์ ์ง๋์ง ์์ต๋๋ค.
- TanStack/query#1677 (comment)
- cache๋ฅผ ์ข ๋ ์์ธํ ์ดํดํ๊ธฐ ์ํด ์ ์ด์์์ React Query์ ์ฐฝ์์
tannerlinsley๊ฐ ์ธ๊ธํ ๋ด์ฉ์ ํ์ธํด๋ด ์๋ค. tannerlinsley๋ React Query์ cache๊ฐ in-memory ๊ฐ์ฒด์ด๋ฉฐ, ๋ธ๋ผ์ฐ์ ํญ์JavaScript Context(์๋ฐ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ) ์๋ช ์ฃผ๊ธฐ ๋ด์์๋ง ์กด์ฌํ๋ค๊ณ ์ธ๊ธํฉ๋๋ค.- ์ฆ, React Query ์บ์๋ ๋ธ๋ผ์ฐ์ ํญ ๊ฐ์ ๊ณต์ ๋์ง ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ์ฌ๋ผ์ง๋๋ค. ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๊ฐ์ ์ธ๋ถ ์ ์ฅ์์ ์บ์๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด persisters๋ฅผ ์ดํด๋ณด๋ ๊ฒ ์ข์ต๋๋ค.
- ์์์ ๋งํ๋ in-memory๋
๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ต์ ๋ธ๋ผ์ฐ์ ๋ ๋์ฒด๋ก ํญ์ ๋ณ๋์ ํ๋ก์ธ์ค๋ก ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ ํญ์ ๋ ๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋ฐ์ต๋๋ค. - ์ด๋ ๊ฐ ๋ธ๋ผ์ฐ์ ํญ์ด ์์ ๋ง์ ๋
๋ฆฝ๋ JavaScript ์คํ ํ๊ฒฝ์ ๊ฐ์ง๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ํ ํญ์์ ์์ฑ๋ ๋ณ์, ๊ฐ์ฒด ๋ฑ์ ๋ค๋ฅธ ํญ๊ณผ ๊ณต์ ๋์ง ์์ต๋๋ค.
- QueryCache์๋ Query๋ค์ด ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ๋ก์ง์ ์ด Query์์ ์คํ๋ฉ๋๋ค.
- Query๋
๋ฐ์ดํฐ, ์ํ ํ๋, ๋ง์ง๋ง fetching์ด ๋ฐ์ํ ์์ ๊ณผ ๊ฐ์ meta ์ ๋ณด ๋ฑ query์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ ๋ฟ๋ง ์๋๋ผ, query ํจ์๋ฅผ์คํํ๊ณ์ฌ์๋,์ทจ์,์ค๋ณต ์ ๊ฑฐ๋ก์ง๊น์ง ํฌํจํฉ๋๋ค. - Query์๋ ๋ด๋ถ ์ํ ๋จธ์ ์ด ์์ด์ ๋ถ๊ฐ๋ฅํ ์ํ์ ๋น ์ง์ง ์๋๋ก ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ด๋ฏธ fetching์ด ์งํ ์ค์ธ ์ํ์์ query ํจ์๊ฐ ๋ค์ ํธ๋ฆฌ๊ฑฐ๋๋ฉด ํด๋น ์์ฒญ์ ์ค๋ณต์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
- query๊ฐ ์ทจ์๋๋ฉด ์ด์ ์ํ๋ก ๋์๊ฐ๋๋ค.
- ํต์ฌ ํฌ์ธํธ๋ query๊ฐ ๋๊ฐ ์์ ์ ๋ฐ์ดํฐ์ ๊ด์ฌ์ด ์๋์ง ํ์ ํ ์ ์๊ณ , ํด๋น ๊ด์ฐฐ์(Observer)๋ค์๊ฒ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆด ์ ์๋ค๋ ์ ์ ๋๋ค.
- Observer๋ query์ query๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ปดํฌ๋ํธ ์ฌ์ด์์
์ ์ฐฉ์ ์ญํ์ ํฉ๋๋ค. - Observer๋
useQuery๋ฅผ ํธ์ถํ ๋ ์์ฑ๋๋ฉฐ,ํญ์ ์ ํํ ํ๋์ query๋ฅผ ๊ตฌ๋ ํฉ๋๋ค.- ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ์ฐ๋ฆฌ๋ useQuery์ queryKey๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
- Observer๋ ์กฐ๊ธ ๋ ๋ง์ ์์ ์ ์ํํ๋ฉฐ, ๋๋ถ๋ถ์ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ณณ์ ๋๋ค.
- Observer๋ ์ปดํฌ๋ํธ๊ฐ ํ์ฌ ์ฌ์ฉ ์ค์ธ
query์ ์์ฑ์ ์๊ณ ์์ผ๋ฏ๋ก, ๊ด๋ จ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆด ํ์๊ฐ ์์ต๋๋ค.- ์๋ฅผ ๋ค์ด, ์ปดํฌ๋ํธ๊ฐ
data ํ๋๋ง ์ฌ์ฉํ๋ค๋ฉด background refetch๋กisFetching์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ํด๋น ์ปดํฌ๋ํธ์๋ ๊ด๋ จ ์๋ ์์ฑ์ด๋ฏ๋ก ๊ตณ์ด ๋ฆฌ๋ ๋๋งํ ํ์๊ฐ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ปดํฌ๋ํธ๊ฐ
- ๋ ๋์๊ฐ ๊ฐ Observer๋
select์ต์ ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์์ data ํ๋์ ์ด๋ค ๋ถ๋ถ์ ๊ด์ฌ์ด ์๋์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค.- ๊ด๋ จ๋ ๋ด์ฉ์ tkdodo - #2: React Query Data Transformations ์์ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค.
- staleTime ๋๋ interval fetching๊ณผ ๊ฐ์ ๋๋ถ๋ถ์ ํ์ด๋จธ๋
Observer Level์์ ๋์ํฉ๋๋ค.
- Observer๊ฐ ์๋ query๋ฅผ inactive(๋นํ์ฑ) query๋ผ๊ณ ํฉ๋๋ค.
- inactive query๋ ์ฌ์ ํ ์บ์์ ๋จ์ ์์ง๋ง, ์ด๋ค ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- ์ด๋ฌํ inactive query๋ React Query Devtools์์ ํ์์ผ๋ก ํ์๋๋ฉฐ, ์ผ์ชฝ์ ์ซ์๋ ํด๋น query๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ Observer์ ์๋ฅผ ๋ํ๋ ๋๋ค.
- ์ ๊ทธ๋ฆผ์ ์ข
ํฉํด๋ณด๋ฉด ๋๋ถ๋ถ์ ๋ก์ง์ด ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋
Query Core์์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.QueryClient,QueryCache,Query,QueryObserver๊ฐ ๋ชจ๋ Query Core์ ์ํฉ๋๋ค.
- ๋ฐ๋ผ์ ์๋ก์ด ํ๋ ์์ํฌ์ฉ
Adapter(์ด๋ํฐ)๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
- Adapter๋ ์๋ก ๋ค๋ฅธ ๋ ์์คํ ์ด๋ ์ฅ์น, ์ํํธ์จ์ด ์ปดํฌ๋ํธ ์ฌ์ด์์ ํธํ์ฑ์ ์ ๊ณตํ๊ฑฐ๋ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์ฅ์น ๋๋ ํ๋ก๊ทธ๋จ์ ์๋ฏธํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ปดํฌ๋ํธ๋ถํฐ ์์ํ์ฌ ๋ค๋ฅธ ๊ฐ๋์์ ํ๋ฆ์ ์ดํด๋ด
์๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๋ฉด
useQuery๋ฅผ ํธ์ถํ์ฌObserver๋ฅผ ์์ฑํฉ๋๋ค. - ์์ฑ๋
Observer๋QueryCache์ ์๋Query๋ฅผ ๊ตฌ๋ ํฉ๋๋ค. - ์ด ๊ตฌ๋
์
Query๊ฐ ์์ง ์กด์ฌํ์ง ์์ผ๋ฉดQuery ์์ฑ์, ๋ฐ์ดํฐ๊ฐ ์ค๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฉดbackground refetch๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. - fetching์ด ์์๋๋ฉด
Query์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์Observer์๊ฒ ์ด์ ๋ํ ์ ๋ณด๊ฐ ์ ๋ฌ๋ฉ๋๋ค. - ๊ทธ๋ฌ๋ฉด
Observer๋ ๋ช ๊ฐ์ง ์ต์ ํ๋ฅผ ์ํํ๊ณ , ํ์ํ๋ค๊ณ ํ๋จ๋๋ฉด ์ปดํฌ๋ํธ์ ์ ๋ฐ์ดํธ๋ฅผ ์๋ ค ์๋ก์ด ์ํ๋ฅผ ๋ ๋๋งํ๊ฒ ํฉ๋๋ค. Query์คํ์ด ๋๋๋ฉดObserver์๊ฒ ์ด ์ฌ์ค์ ๋ค์ ์๋ฆฝ๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๋ฉด
- ์ ๋ด์ฉ์ ๊ฐ๋ฅํ ์ฌ๋ฌ ํ๋ฆ ์ค ํ๋์ ๋ถ๊ณผํ๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
- ๊ฐ์ฅ ์ด์์ ์ธ ๊ฒฝ์ฐ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ cache์ ์๋ ๊ฒ์
๋๋ค.
- tkdodo - #17: Seeding the Query Cache ํด๋น ํฌ์คํ ์์ ๊ด๋ จ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ํ๋ฆ์์ ๊ณตํต์ ์ธ ์ ์ ๋๋ถ๋ถ์ ๋ก์ง์ด React(๋๋ Vue, Solid) ์ธ๋ถ์์ ๋ฐ์ํ๊ณ , ์ํ ์์คํ ์ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ Observer์๊ฒ ์ ๋ฌ๋๋ฉฐ, Observer๊ฐ ์ปดํฌ๋ํธ์๋ ์๋ ค์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค๋ ๊ฒ์ ๋๋ค.