TanStack Query๋
๋คํธ์ํฌ์์ ๋ฐ์์จ ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๊ณต์๋ฌธ์
TS/JS, React, Solid, Vue, Svelte๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋น๋๊ธฐ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ธ๋ถ์ ์ธ ์ํ๊ด๋ฆฌ, ์๋์ ์ธ refetching ๊ทธ๋ฆฌ๊ณ ๋์์๋ ๋น๋๊ธฐ ์คํ๊ฒํฐ ์ฝ๋๋ฅผ ํ ์คํด๋ผ. ํ ์คํ ์ฟผ๋ฆฌ๋ ์ ์ธ์ ์ด๊ณ , ์ต์ ์ ์๋ํ๋ ์ฟผ๋ฆฌ ๊ทธ๋ฆฌ๊ณ mutation์ ์ค ๊ฒ์ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฐ๋ฐ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ ๊ฒ์ ๋๋ค.
์ ์ธ์ ์ด๊ณ ์๋์ ์ ๋๋ค.
๋ฐ์ดํฐ fetching ๋ก์ง์ ์ผ์ผ์ด ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. TanStack Query์๊ฒ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋๋์ง ์ผ๋ง๋ ๋ฐ์ดํฐ์ ์ ์ ๋๋ฅผ ์ ์งํ ๊ฒ์ธ์ง ๋งํด์ฃผ์ธ์. ๊ทธ๋ฌ๋ฉด ๋๋จธ์ง๋ ์๋์ ์ผ๊ฒ์ ๋๋ค. TanStack ์ฟผ๋ฆฌ๋ ์บ์ฑ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฐ์ดํธ, ์ค๋๋(stale) ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ์ค์ ์์ด ์๋์ผ๋ก ํด๊ฒฐํด์ค๋๋ค.
์ฌํํ๊ณ ์น์ํฉ๋๋ค.
ํ๋ก๋ฏธ์ค์ async/await์ ๋ํด์ ์๊ณ ์๋ค๋ฉด, ๋น์ ์ ์ด๋ฏธ TanStack ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋ฒ์ ์๊ณ ์๋ ๊ฒ์ ๋๋ค. ๊ธ๋ก๋ฒ ์ํ, reducer, ๋ณต์กํ ์ค์ ์ ์๊ตฌํ์ง ์์ต๋๋ค. ๋จ์ํ ํจ์๋ง ์ ๋ฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ด๋ฒ์ํฉ๋๋ค.
๊ฐ๋ฐ์๋๊ตฌ, ๋ฌด์ ํ ๋ก๋ฉ API, ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ mutation tools๋ฅผ ์ ๊ณตํด์ค๋๋ค.
๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ ๋ฆฌ์กํธ๋ฅผ ์ํ ๋ฐ์ดํฐ fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ง ์ฌ๊ฒจ์ง๊ณ ์๋๋ฐ ์ข๋ ์๋ฐํ ๋งํ์๋ฉด, ๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ fetching, caching, synchronizing and updating server state๋ฅผ ํด์ค๋๋ค.
- Caching... (possibly the hardest thing to do in programming)
- Deduping multiple requests for the same data into a single request
์์ํ๊ธฐ
npm i @tanstack/react-query
- Query client ๋ง๋ค๊ธฐ
- Query client๊ฐ ์ฟผ๋ฆฌ์ ์บ์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- QueryProvider ์ ์ฉํ๊ธฐ
- ์์ ์ปดํฌ๋ํธ์ ์บ์ ๋ฐ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- QueryProvider๋ ์ฟผ๋ฆฌ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
- useQuery ํธ์ถํ๊ธฐ
- ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ ค๋ฉด useQuery Hook์ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ ์ฉํ๊ธฐ
import { Posts } from "./Posts"; import "./App.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; const queryClient = new QueryClient(); function App() { return ( // Provider์ ์์๋ค์ ์บ์๋ฅผ ํฌํจํ ์ฟผ๋ฆฌํด๋ผ์ด์ธํธ์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค. <QueryClientProvider client={queryClient}> <div className="App"> <h1>Blog 'em Ipsum</h1> <Posts /> </div> </QueryClientProvider> ); } export default App;
useQuery์์ ๋ฐํ๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
useQuery | TanStack Query React Docs
isFetching vs isLoading
- isFetching
- ๋น๋๊ธฐ ์ฟผ๋ฆฌ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์๋ค๋ ๊ฒ์ ์๋ฏธ
- isLoading
- ์บ์๋ ๋ฐ์ดํฐ๊ฐ ์์. isFetching๋ณด๋ค ์์ ๊ฐ๋
Devtools
npm i @tanstack/react-query-devtools
Devtools | TanStack Query React Docs
stale, gcTime
stale
- stale data๋ผ๋ ๊ฒ์ ๋ง๋ฃ๋์๊ฑฐ๋ refetch๋ ์ค๋น๊ฐ ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํฉ๋๋ค.
- ์ฌ์ ํ ์บ์์ ์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ฒ์ฆ ๋์ผ ํ๋ค๋ ๋ป์ ๋๋ค.
- data refetch๋ ์ค์ง stale data์๋ง ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
- ์๋ฅผ๋ค์ด, ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ง์ดํธ ๋๋ค๊ฑฐ๋, ์๋์ฐ๊ฐ refocus๋ ๋, data refetching์ด ๋ฐ์ํฉ๋๋ค.
- staleTime์ด๋ผ๋ ๊ฒ์ ๋ฐ์ดํฐ์ ์ต๋ ์๋ช ์ผ๋ก ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
gcTime
- gcTime์ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ์ ์งํ ์๊ฐ์ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ฐ์ดํฐ์ ์ฐ๊ด๋ ํ์ฑ useQuery ํ์๊ฐ ์๊ณ , ๋ฐ์ดํฐ๊ฐ ํ์ฌ ํ์ด์ง์ ํ์๋์ง ์์ผ๋ฉด, cold storage ์ํ๋ก ๋ค์ด๊ฐ๋๋ค.