๐ react query์ staleTime๊ณผ cacheTime์ refetch ์กฐ๊ฑด์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ฌ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ ๋ฐ ์ฌ๋ฌ ์คํ ํ ๊ธฐ๋กํด๋ก๋๋ค.

0. ์ต์ ๋ฒ(Observer)์ ์ฟผ๋ฆฌ(Query)
๊ฐ์ฅ ๋จผ์ react-query์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ธ ์ต์ ๋ฒ์ ์ฟผ๋ฆฌ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ต์ ๋ฒ(Observer)
์ต์ ๋ฒ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญ์ ์ถ์ ํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ ๋๋ค. ์ฟผ๋ฆฌ์ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ๋ณํ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ์ UI๋ฅผ ์ ๋ฐ์ดํธ ์ํฌ ์ ์์ต๋๋ค. useQuery ํ ์ ์ฌ์ฉํ์ฌ ์ต์ ๋ฒ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ต์ ๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- isLoading : ์บ์์ ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญ์ด ์งํ ์ค์ธ์ง ์ฌ๋ถ
- isFetching: ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญ์ด ์งํ ์ค์ธ์ง ์ฌ๋ถ(isLoading๋ณด๋ค ๋ฒ์๊ฐ ํฐ ์์ ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.)
- isError : ์์ฒญ์ด ์คํจํ๋์ง ์ฌ๋ถ
- data, error, refetch ๋ฑ๋ฑ...
- ๋ช ๋ นํ ์ฝ๋๋ก ์ฒ๋ฆฌ๋ฅผ ํ ๋ isLoading || isFetching ์ isLoading๋ง ์ฒ๋ฆฌ๋ฅผ ํ๊ฑฐ๋ ์ด๋ ๊ฒ ๋ ผ๋ฆฌํฉ ์ฐ์ฐ์๋ก ์กฐ๊ฑด๋ฌธ์ ์ค์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ์ต์ ๋ฒ๊ฐ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ(Query)
์ฟผ๋ฆฌ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญ์ ๋ํ๋ด๋ ๊ฐ์ฒด์
๋๋ค. ์ข ๋ ์ ํํ ์๊ธฐํ์๋ฉด, unique key์ ๋ฐ์ธ๋ฉ๋์ด ์๋ ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ source ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. prefetch, useQuery, fetchQuery ๋ฑ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฑ์ ์์
์ ์ํํ๋ฉฐ ๊ฐ์ ์ฟผ๋ฆฌ์ ๋ํด ๊ฐ์ ๋ค๋ฅธ ์ค์ ๋ ํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ๋ ์ต์ ๋ฒ์ ์
๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค. ์ต์ ๋ฒ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ UI๋ฅผ ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ์ปดํฌ๋ํธ๋ ์ปค์คํ
ํ
์์๋ useQuery hook์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์ ์ต์ ๋ฒ๋ฅผ ์์ฑํ์ฌ query ๋ฅผ ๊ตฌ๋
ํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- queryKey : ์ฟผ๋ฆฌ๋ฅผ ์๋ณํ๋ ํค
- queryFn : ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญ ํจ์
- onSuccess, onError, onMutaion ๋ฑ์ ์ฝ๋ฐฑํจ์ ๋ฑ๋ฑ...
- ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ์ต์ ๋ฒ๊ฐ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
1. staleTime
- ๋ฐ์ดํฐ๊ฐ fresh ์ํ์์ stale ์ํ๋ก ๋ณ๊ฒฝ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๋ค.
- ์ฆ, ์ ์ ํ ๋ฐ์ดํฐ๋ก ๊ต์ฒด(fetch) ํ์ ์ฉ์ง ์๋ ์๊ฐ์ ์๋ฏธํ๋ค.
- default ๊ฐ์ 0
- ms ๋จ์์ด๋ค. 3000ms = 3์ด
staleTime: 3000,
๋ฐ์ดํฐ๊ฐ ํ ๋ฒ fetch ๋๊ณ ๋์ staleTime์ด ์ง๋์ง ์์๋ค๋ฉด unmount ํ์ ๋ค์ mount ๋์ด๋ fetch๊ฐ ์ผ์ด๋์ง ์๋๋ค.
์ ์ฝ๋์ ๊ฒฝ์ฐ์๋ 3์ด๋์ ์์ฃผ ๋น ๋ฅด๊ฒ 100๋ง ๋ฒ ํด๋น ํ์ด์ง๋ฅผ ์ฌ์ง์ ํด๋ api ์์ฒญ์ ํตํ background-refetching ์์ด ์ด์ ์ ์ฟผ๋ฆฌ ์บ์ฑ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
๐ staleTIme ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ฃผ์์ฃผ ๋ณํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ์ง์ ํ์ง ์๋ ํธ์ด ์ข๊ณ ํด๋น ๋ธ๋ผ์ฐ์ ์ ํํ๋๋ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ค์ด ์ ์ ์ด๋ผ๋ฉด staleTime์ ์ง์ ํด์ฃผ๊ณ ์์ฒญํ๋ ๊ฒ์ด ์๋ฒ์ ๋ถ๋ด์ ๊ฒฝ๊ฐ์ํฌ ์ ์๋ ์ค์ ์ด๋ค.
staleTime์ query์ ์ค์ ๋ง๋ค ๋ค๋ฅด๊ฒ ์๋ํ๋ค.
์ด๋ react query์์ ์ดํดํ๊ณ ์์ด์ผ ํ ์์ฃผ ์์ฃผ ์์ฃผ ์ค์ํ ๊ฐ๋ ์ด๋ค. ์๋ฅผ ๋ค์ด์ ์ค๋ช ํ๋ฉด ์ดํด๊ฐ ์ฝ๋ค.
์๋ฅผ ๋ค์ด ๊ฐ์ ์ฟผ๋ฆฌ ํค ๋ฐ์ดํฐ(ํค ์์ ๋์ผ)๋ก fetch๋ฅผ ํด์ ์ฌ์ฉํ๋ A, B ์ปดํฌ๋ํธ๊ฐ ์๋ค. ๊ทธ๋ฐ๋ฐ A ์ปดํฌ๋ํธ์๋ staleTime์ด 0์ผ๋ก ์ง์ ๋์ด ์๊ณ , B ์ปดํฌ๋ํธ์๋ staleTime์ด 1000 * 10(10์ด)๋ก ์ง์ ๋์ด ์๋ค. ์ด ๋ ์ด ๋ ์ปดํฌ๋ํธ๋ ๊ฐ์ ์ฟผ๋ฆฌ ํค ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋๋ผ๋ A์ query์์๋ A์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋๋ง๋ค stale ์ํ์ด๋ฏ๋ก ๋งค๋ฒ ๊ณ์ํด์ background-refetching์ด ์ผ์ด๋๋ค. ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ B ์ปดํฌ๋ํธ๋ (B)์ปดํฌ๋ํธ์ ๋ง์ดํธ์๋ ์๊ด์์ด ์ด staleTime์ด ๋ค ์ง๋์ผ์ง๋ง background-refetching์ด ๋ฐ์ํ๋ค. ์ด๊ฒ ๋ฌด์จ ๋ป์ธ์ง๋ ๋ฐ๋ก ๋ฐ์์ ์๊ธฐํ๋ค. (์ฐธ๊ณ ๋ก ์ปดํฌ๋ํธ์ ๋ง์ดํธ์ ์๊ด์๊ฒ fetch๋ฅผ ํ๋๋ก ๋ง๋ค ์ ์๋ refetchOnMount๋ผ๋ query ์ต์ ์ด ์๋ค. ์ด๋ ๋งจ ๋ฐ์์ ๋ค๋ฃฌ๋ค.)
๐ ๋ง์ฝ A ์ปดํฌ๋ํธ๋ก ๊ฐ๋ค๊ฐ B์ปดํฌ๋ํธ๋ก ์ด๋ํ๋ฉด staleTime์ ์ด๋ป๊ฒ ๊ณ์ฐ์ด ๋ ๊น? (๋ฐ๋ก ์๋ ์ด์ด์ง๋ ๋ด์ฉ)
B์ปดํฌ๋ํธ(staleTime 10์ด)๊ฐ ๋ง์ดํธ ๋ ๋๋ A ์ปดํฌ๋ํธ(staleTime0์ด)์์ ๊ฐ์ ์ฟผ๋ฆฌํค ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฑ์ด ์์ ์ ๊ธฐ์ค์ผ๋ก staleTime์ด ๊ณ์ฐ๋๋ค. A ์ปดํฌ๋ํธ๋ staleTime์ด 0์ด์ฌ์ ๋งค๋ฒ refetch๊ฐ ์ผ์ด๋๋๋ฐ, A ์ปดํฌ๋ํธ์์ refetch ํ์ 5์ด ๋จธ๋ฌด๋ฅธ ํ์ B ์ปดํฌ๋ํธ๋ก ์ด๋ํ๋ฉด B ์ปดํฌ๋ํธ์ ์ฟผ๋ฆฌ ์ค์ ์ staleTime 10์ด์์๋ ๋ถ๊ตฌํ๊ณ A์ปดํฌ๋ํธ์์ ์ต์ ์ฟผ๋ฆฌ๋ก ์ ๋ฐ์ดํธ ํ ๋จธ๋ฌด๋ฅธ ์๊ฐ๊น์ง ๊ณ์ฐํ์ฌ 5์ด ํ์ stale ํ ์ํ๊ฐ ๋๋ค(5 + 5 = 10). ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ํค๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ ์์ ์ ์ถ์ ํ์ฌ ๊ทธ ๋๋ถํฐ ์์ํ์ฌ staleTime์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ์ดํดํ๋ค๋ฉด ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ์ ๋ง๋ฅ ์ข ์๋์ด ์์ง๋ง์ ์์ staleTIme์ด๋ผ๋ ๊ฐ๋ ์ ์๋ฒฝํ ์ดํดํ ๊ฒ์ด๋ค.
๐ ์ ๋ฆฌํ์๋ฉด
ํค๊ฐ ๊ฐ์ ๊ฒฝ์ฐ staleTime์ ๊ฐ์ฅ ์ต๊ทผ์ ๊ด์ธกํ ์ฟผ๋ฆฌ ์ค์ ์ staleTime์ผ๋ก ๋ฎ์ด์ง ์ ์๋, ์๊ฐ๊ณ์ฐ์ ๊ฐ์ฅ ์ต๊ทผ์ ์ฟผ๋ฆฌ ์บ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋ ๊ฒ์ ๊ด์ฐฐํ ์์ ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ์ด ๋๋ ๊ฒ์ด๊ณ , cacheTime(๋ฐ์์ ๋ค๋ฃธ)์ active ์ํ ์ง์ ๋๋ง๋ค ์ง๋๊ฐ ์๊ฐ์ ๋งค๋ฒ ์ด๊ธฐํ ๋ฐ inactive ์ํ ์ง์ ๋ ์๋ก์ด ์์์ผ๋ก ์๋ก ๊ณ์ฐํ๋, ์ต์ด๋ก ์์ฑํ ์ฟผ๋ฆฌ ์ธ์คํด์ค์ cacheTime ์ค์ ์ ๊ณ์ ๋ฐ๋ผ๊ฐ๋ค.์ฆ, cacheTime์ ์ฟผ๋ฆฌ ์บ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋์ด๋ ์๋ก์ด ์ฟผ๋ฆฌ cacheTime ์ค์ ์ผ๋ก ๋ฎ์ด์ง์ง ์๋๋ค. inactive ์ํ์์ ์๊ฐ์ด ์ง๋ ์บ์์์ ์ญ์ ๋์ด ์ฟผ๋ฆฌ๊ฐ ์ญ์ ๋์ด์ผ ์งํ ์์ฑ๋๋ ์ฟผ๋ฆฌ์ cacheTime ์ค์ ์ผ๋ก ์๋กญ๊ฒ ๋ณ๊ฒฝ ๋ ์ ์๋ค. UX๊ฐ์ ์ ์ํด์ ๊ฐ์ ํค๋ก ๋ฏธ๋ฆฌ fetch๋ฅผ ํ๋ prerefetch ํ ๋ ์ฐธ๊ณ ํ๋ฉด ์ข๋ค. ์บ์ ํ์์ ๋ฐ์์ ๋ ์์ธํ๊ฒ ๋ค๋ฃฌ๋ค. )
2. cacheTime
- ๋ฐ์ดํฐ๊ฐ inactive ์ํ์ผ ๋ ์บ์ฑ๋ ์ํ๋ก ๋จ์์๋ ์๊ฐ์ด๋ค.
*inactive ์ํ: ์ฟผ๋ฆฌ ์ธ์คํด์ค๊ฐ unmount[๊ด์ฐฐ ์ค๋จ] ๋๋ฉด ๋ฐ์ดํฐ๋ inactive ์ํ๋ก ๋ณ๊ฒฝ๋๋ค. ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ฌ ํ๋ฉด์ ํ์๋๋ ์ปดํฌ๋ํธ์ ์ํด ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ํด๋น ๋ฐ์ดํฐ์ ๋ํ ์์ฒญ์ด ์๋ ์ํ๋ฅผ ๋งํ๋ค. ์ฌ๋งํ๋ฉด ์ฟผ๋ฆฌ๋ฐ์ดํฐ๊ฐ ํ์ฉ๋๊ณ ์๋ค๋ฉด ํด๋น ์ฟผ๋ฆฌ ์ธ์คํด์ค๋ observing ์ํ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. observing(๊ด์ฐฐ) ์ํ ๋๋ ์บ์ ์๊ฐ์ด ์์ ํ๋ฅด์ง ์๊ณ ์๋ก refresh ๋๋ค. ์บ์์ ์ง๋ ์๊ฐ์ด ์ด๊ธฐํ ๋๋ค๋ ๋ป์ด๋ค. - cacheTime์ ๊ฐ์ ํค์ ์ฟผ๋ฆฌ ์ธ์คํด์ค๊ฐ ๋ค์ ๊ด์ฐฐ๋ ๋(active)๋ง๋ค ๋จ์์๋ ์บ์ ์๊ฐ์ด ์ด๊ธฐํ๋๋ค.(์ฒ์ ์ค์ ํ ์บ์ ์๊ฐ์ด ๋ค์ ์ฑ์์ง๋ค๋ ๋ป์ด๋ค.)
- ์ฆ, cacheTime์ ์ฟผ๋ฆฌ๊ฐ inactive ์ํ๊ฐ ๋ผ์ผ ์ค์ ํ ์๊ฐ์ด ํ๋ฅด๊ธฐ ์์ํ๋ค. stale ์๊ฐ๊ณผ๋ ๋ฌด๊ดํ๊ฒ ์บ์ฑ ์๊ฐ์ด ์ง๋๋ฉด react query devtools๋ก ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ญ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. => ์ฟผ๋ฆฌ๊ฐ ์ญ์ ๋๋ฉด fetching & loading ๊ณผ์ ์ ๋ค์ ๊ฑฐ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ staleTime์ CacheTime๋ณด๋ค ์ ๊ฒ ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค.
- default cacheTime : 5๋ถ (๋ง์ฐฌ๊ฐ์ง๋ก ms๋จ์๋ก ๋ณํํ 5 * 60 * 1000 ์ผ๋ก ์ ์ด์ค์ผ ํ๋ค. 0์ด ์๋ 5๋ถ์์ ์ ์ํ์.)
- cache processing:
1. useQuery์ ์ฒซ ๋ฒ์งธ, ์๋ก์ด ์ฟผ๋ฆฌ ์ธ์คํด์ค ์์ฑ(observer mount) => ๋ง์ฝ์ ๋ฐํ์๊ฐ ์ต์ด๋ก freshํ ํด๋น ์ฟผ๋ฆฌ๊ฐ ํธ์ถ๋์๋ค๋ฉด, ์บ์ฑํ๊ณ , ํจ์นญ์ด ๋๋๋ฉด (staleTime : 0 =๊ธฐ๋ณธ๊ฐ ์ด๋ผ๋ฉด )ํด๋น ์ฟผ๋ฆฌ๋ฅผ stale๋ก ๋ฐ๊ฟ.
2. ์ฑ ์ด๋๊ฐ์์ useQuery ๊ฐ์ ํค์ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ ์ธ์คํด์ค ์์ฑ(observer mount) => ์ด๋ฏธ ์ฟผ๋ฆฌ๊ฐ stale์ด๋ฏ๋ก ์ต๊ทผ ์์ฒญ ๋ ๋ง๋ค์ด ๋จ์๋ ์บ์๋ฅผ ๋ฐํํ๊ณ ๋ฆฌํจ์นญ์ ํจ.์ด ๋ ์บ์๋ ์ ๋ฐ์ดํธ๋๋ค.ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ ํํ ๋งํ์๋ฉด ์บ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋๊ณ cacheTime์ ์ต์ด ์ฟผ๋ฆฌ ์ธ์คํด์ค์ cacheTime ์ค์ ์ ์์ํ๋ค.
3. ์ต์ ๋ฒ๊ฐ ์ธ๋ง์ดํธ๋๊ณ ์ฟผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๋ => ๋ง์ง๋ง ์ต์ ๋ฒ๊ฐ ์ธ๋ง์ดํธ๋์ด inactive ์ํ๊ฐ ๋์์ ๋ 5๋ถ(cacheTime์ ๊ธฐ๋ณธ๊ฐ)์ด ์ง๋๋ฉด ํด๋น ์บ์ฑ ์ฟผ๋ฆฌ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ์ญ์ ๋๋ค.
์๋ ๊ทธ๋ผ staleTime์ cacheTime๋ณด๋ค ๋ ๊ธธ๊ฒ ์ค์ ํด๋๋ ๊ฒ์ ๋ง์ด ์๋๊ฒ ๋ค์?

์ํ๋ค๋ฉด, ๋ง์ด ๋ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ๊ทน๋จ์ ์ผ๋ก `staleTime: Infinify`๋ก ์ค์ ํ๊ณ , `cacheTime: 0`์ผ๋ก ์ค์ ํ๋ค๋ฉด, ์ด๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ์บ์ฑ์๋ฃํ์ผ๋ฉด ์ ๋ data๋ฅผ refetchํ์ง ๋ง๊ณ ๋ด๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ฒ ๋์๋ง์ cache์์ ๋ฐ๋ก ์ญ์ ํ๋ผ๋ ๋ป์ด๋ค. ์ฆ, ๋ณผ ์ ์๋ ๊ธฐํ๊ฐ ๋จ ํ ๋ฒ ๋ฟ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค. ํ์ฉํ ์ ์๋ ๊ฒ๋ค์ ์ ์ฐพ์๋ณด์. ํ ๋ฒ๋ง ๋ณด๊ณ ๋ง ๊ฒ๋ค์ ํ์ฉํ๋ฉด ๋๊ฒ ๋ค.
3. Browser Cache
๋ธ๋ผ์ฐ์ ์บ์์๋ ๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์๊ฐ ์กด์ฌํ๋ค.
memory cache
memory cache๋ ๋ ๋นจ๋ฆฌ ์บ์๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ์บ์ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ธ์จ๋ค. ์บ์ ๋ฉ๋ชจ๋ฆฌ์๋ L1, L2, L3๊ฐ ์๊ณ ๋ณดํต CPU์ ๋ด์ฅ๋์ด ์๋ค. CPU์ ๋ด์ฅ๋์ด ์๊ธฐ์ ์บ์๋ฅผ ๋ ๋นจ๋ฆฌ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์ผ๋ฉด ์บ์๊ฐ ์ง์์ง๋ค.
disk cache
disk cache๋ ํฐ ์ฉ๋์ ์ ์ฅํ๊ธฐ ์ํด์ ํ๋๋์คํฌ, SSD์์ ๊ฐ์ ธ์จ๋ค. ๋์คํฌ ์บ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๋๋ผ๋ ์บ์๋ ์ง์์ง์ง ์๋๋ค.
์บ์ ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ ์บ์์ ์ ์ฅ๋๋ ๊ธฐ์ค์ ๋ฆฌ์์ค ์ฉ๋์ผ๋ก ์ถ์ ๋๋ค.
์บ์ ๋ฉ๋ชจ๋ฆฌ๋ 8kb์์ 8MB๋ก ์์ ์ฉ๋์ด๋ฏ๋ก ๊ทธ ์ด์์ ๋ฆฌ์์ค์ธ ๊ฒฝ์ฐ์๋ ๋์คํฌ ์บ์์ ์ ์ฅ๋๋ค.
4. fetching ๊ณผ์
๋ฐ์ดํฐ ํ์นญ์ด ๋ค์ ์ผ์ด๋๋ ์ํ๋ Stale ์ํ๋ถํฐ ์ด๋ค. ๊ทผ๋ฐ ์ด๋์ ํ์นญ์ ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋์๋ ๋ค๋ฅธ ํ์นญ์ด๋ค. ์ด๋ ์ผ์ด๋๋ ํ์นญ์ Background re-fetching(stale + cache O์ธ ์ํ์์ ์คํ) ์ด๋ผ๊ณ ํ๋ค. ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋จผ์ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ค๋ค.
- ๋ฐ์ดํฐ๊ฐ ๊ตฌ์์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌต์ ์ผ๋ก ๋ค์ ์๋ฒ์ ์ฌ์์ฒญ์ํด์ ๋ฐ์ดํฐ๋ฅผ Freshํ๊ฒ ๋ฐ๊พผ๋ค.
- ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์์๋ค๋ฉด ์บ์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ UI๋ ๋ณ๊ฒฝ๋๋ค. (์๋๋ผ๋ฉด ๊ทธ๋๋ก ์ ์ง๋๋ค.)
Stale ์ํ์๋ ์บ์๋ ๋ฐ์ดํฐ๋ ๋ถ๋ฌ์ค๊ณ , ๋ฐ์ดํฐ ํ์นญ๋ ์ผ์ด๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ๋ฐ์ดํฐ๊ฐ Stale ์ํ๋ผ๊ณ ํ๋จํ ์๊ฐ์ QueryClient๋ฅผ ์์ฑํ๋ฉด์ ๋๋ ๊ฐ ์ปดํฌ๋ํธ ๋ด๋ถ์ useQuery ์ธ์คํด์ค๋ฅผ ๋ง์ดํธ ํ๋ฉด์ ์ค์ ํ ์ ์๋๋ฐ staletime์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค. ๊ทธ๋ฌ๋๊น ์ง๊ธ๊น์ง ๋ณ๊ฒฝ์ ์ํ๊ณ ์ฌ์ฉํ๋ค๋ฉด, ๋ฐ์ดํฐ๋ฅผ ์์ฒญํด์ ๋ถ๋ฌ์ค์๋ง์ stale ์ํ๊ฐ ๋์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๋งค๋ฒ background-refetch๋ฅผ ํ์ ๊ฒ์ด๋ค.
5. isFetching, isLoading
- isFetching: ๋ฐ์ดํฐ๊ฐ fetch ๋ ๋ true, ์บ์ฑ ๋ฐ์ดํฐ๊ฐ ์์ด์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ fetch ๋๋๋ผ๋ true
- isLoading: ์บ์ฑ๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋(์ด๊ธฐ ์ง์ ) ํน์ inactive + cacheTimeout (+ stale)์ผ ๋ fetch ์ค์ true
inactive + cacheTimeout (+ stale) ์ํ์๋ ํ๋ฒํ ๋ฐ์ดํฐ ํ์นญ์ด ์ผ์ด๋๋ค. Background re-fetching๊ณผ ์ฐจ์ด๋ isLoading ๊ฐ์ ์ฐจ์ด์ด๋ค. ์ ์๋ true ํ์๋ false์ด๋ค. Background re-fetching ๋๋ ๋ฐ๋ก ๋ก๋ฉ์ด ์ผ์ด๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด isLoaindg์ผ๋ก spinner๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํด๋จ์ ๋ ์ด๊ธฐ ์ง์ ๋๋ง ๋ก๋ฉ์ด ๊ฑธ๋ฆฌ๊ณ ์ดํ ์ฌ์ง์ ๋๋ spinner๋ฅผ ๋ณผ ์ ์๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ ๋๋ฌธ์ธ ๊ฒ์ด๋ค.
6. refetch ์กฐ๊ฑด ์ ๋ฆฌ
์ปดํฌ๋ํธ๋จ์์ ๋จ์ "๋ฆฌ"๋ ๋๋ง๋ง์ผ๋ก๋ react-query๋ ๋ค์ fetch ํ์ง ์๋๋ค. query์ ๊ธฐํ ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ state ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ฆฌ๋ ๋๋ง๊ณผ ๊ด๋ จํด์ ์ง์ ์ ์ผ๋ก fetch๋ฅผ ์ ๋ฐ์ํค๋ ค๋ฉด, state๋ฅผ react-query์ enabled๋query key์ react state๋ฅผ ํฌํจ์ํค๋ฉด ๋๋ค. ๋จ์ํ queryFn์ ์ฌ์ฉ๋๋ parameter๊ฐ ๋ฐ๋๋ ๊ฒ๋ง์ผ๋ก๋ ๋ค์ fetch๋ฅผ ํ์ง ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ parameter์ ์ฌ์ฉ๋๋ state๋ผ๋ฉด ๋ณดํต query key์๋ ๊ฐ์ด ์ ์ด์ฃผ๋ ๊ฒ์ด ๋ฐ ๊ฐ์ ์ ์ผ๋ก ํ์์ด๋ค. ๋ ์์ธํ fetch ์กฐ๊ฑด์ ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.
- query key์ react state๋ฅผ ํฌํจ์ํค๊ณ , state๊ฐ ๋ณ๊ฒฝ๋๋ฉด refetch (๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ๋ง ์ ์ง์ผ๋ refetch๋ฅผ ๊ธฐ๋ํ ์ ์๋ค.)
- refetchOnWindowFocus >> ๋ฐ์ดํฐ๊ฐ stale ์ํ์ผ ๊ฒฝ์ฐ ์๋์ฐ์ ํฌ์ปค์ฆ๊ฐ ์ด๋๋ ๋ ๋ง๋ค refetch
- refetchOnMount >> ๋ง์ดํธ ๋ ๋๋ง๋ค refetch
- refetchOnReconnect >> ์ฐ๊ฒฐ์ด ๋์ด์ก๋ค๊ฐ ์ฌ ์ฐ๊ฒฐ ๋์์ ๋ refetch
- clientQuery.invalidateQueries() >> ๊ณ ์๋ก ์ฟผ๋ฆฌ ๋ฌดํจํ๋ฅผ ํ์ ๋ refetch, ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ํ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด ๊ณ ์๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํจํ >> ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก stale ์ํ๋ก ๋ณ๊ฒฝ๋จ๊ณผ ๋์์ refetch ์คํ
- ๋ช ์์ ์ผ๋ก refetch ํจ์๋ฅผ ํธ์ถ ํ ๋
- enabled ๋ณ๊ฒฝํ ๋
์ด์ธ์ ๊ฒฝ์ฐ๋ ๋ ์๋ค.
7. ์ ์ฉํ ์ต์
7-1. refetchOnWindowFocus
refetchOnWindowFocus ๋ stale ์ํ์ผ ๊ฒฝ์ฐ window focus ๋๋ง๋ค refetch๋ฅผ ์คํํ๋ ์ต์ ์ด๋ค.
- (๐์ถ์ฒ stale ์๊ดO) ๊ธฐ๋ณธ๊ฐ์ `true` ์ด๋ค. stale ์ํ๋ฉด refetch๋ฅผ ์คํํ๋ค.
- (stale ์๊ดX) `always` ๋ก ์ค์ ํ๋ฉด window focus ๋๋ง๋ค ๋งค๋ฒ refetch ๋ฅผ ์คํํ๋ค.
- (stale ์๊ดX) `false` ๋ก ์ค์ ํ๋ฉด window focus ๋์ด๋ refetch ํ์ง ์๋๋ค.
/**
* TIL: refetchOnWindowFocus ๋ stale ์ํ์ผ ๊ฒฝ์ฐ window focus ๋๋ง๋ค refetch๋ฅผ ์คํํ๋ ์ต์
์ด๋ค.
* *(๐์ถ์ฒ stale ์๊ดO) ๊ธฐ๋ณธ๊ฐ์ `true` ์ด๋ค. stale ์ํ๋ฉด refetch๋ฅผ ์คํํ๋ค.
* !(stale ์๊ดX) `always` ๋ก ์ค์ ํ๋ฉด window focus ๋๋ง๋ค ๋งค๋ฒ refetch ๋ฅผ ์คํํ๋ค.
* !(stale ์๊ดX) `false` ๋ก ์ค์ ํ๋ฉด window focus ๋์ด๋ refetch ํ์ง ์๋๋ค.
*/
refetchOnWindowFocus: false,
7-2. refetchOnMount
refetchOnMount ๋ stale ์ํ์ผ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ mount ๋๋ง๋ค refetch๋ฅผ ์คํํ๋ ์ต์ ์ด๋ค.
- (๐์ถ์ฒ stale ์๊ดO) ๊ธฐ๋ณธ๊ฐ์ `true` ์ด๋ค. ๋ง์ดํธ ๋๋ง๋ค stale ์ํ๋ฉด refetch๋ฅผ ์คํํ๋ค.
- (stale ์๊ดX) `always` ๋ก ์ค์ ํ๋ฉด ๋ง์ดํธ ์๋ง๋ค ๋งค๋ฒ refetch ๋ฅผ ์คํํ๋ค.
- (stale ์๊ดX) `false` ๋ก ์ค์ ํ๋ฉด ์ต์ด fetch ์ดํ์๋ refetch ํ์ง ์๋๋ค.
/**
* TIL: refetchOnMount ๋ stale ์ํ์ผ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ mount ๋๋ง๋ค refetch๋ฅผ ์คํํ๋ ์ต์
์ด๋ค.
* *(๐์ถ์ฒ stale ์๊ดO) ๊ธฐ๋ณธ๊ฐ์ `true` ์ด๋ค. ๋ง์ดํธ ๋ stale ์ํ๋ฉด refetch๋ฅผ ์คํํ๋ค.
* !(stale ์๊ดX) `always` ๋ก ์ค์ ํ๋ฉด ๋ง์ดํธ ์๋ง๋ค ๋งค๋ฒ refetch ๋ฅผ ์คํํ๋ค.
* !(stale ์๊ดX) `false` ๋ก ์ค์ ํ๋ฉด ์ต์ด fetch ์ดํ์๋ refetch ํ์ง ์๋๋ค.
*/
refetchOnMount: false,
7-3. refetchInterval
`refetchInterval` ๋ stale ์ํ์ผ ๊ฒฝ์ฐ ์ผ์ ์๊ฐ๋ง๋ค refetch๋ฅผ ์คํํ๋ ์ต์ ์ด๋ค.(๋จ์ ms)
`refetchIntervalInBackground` ์ ์ฐฝ์์ ๋ฒ์ด๋ ์๋ ์ํ์ฌ๋ refetch๋ฅผ ์คํํด์ฃผ๋ ์ต์ ์ด๋ค.
- ์ค์ํ ์ ์ ๋ธ๋ผ์ฐ์ ์ focus ๋์ด ์์ด์ผ๋ง ์ผ์ ์๊ฐ๋ง๋ค ์๋์ผ๋ก refetch๊ฐ ์คํ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ `false` ์ด๋ค.
- ํ์ง๋ง focus ์ ๋์ด ์์ ๋๋ ์๋ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- `refetchIntervalInBackground` ์ true ๋ก ๊ฐ์ ์ฃผ๋ฉด ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ `false` ์ด๋ค.
/**
* TIL: refetchInterval ๋ stale ์ํ์ผ ๊ฒฝ์ฐ ์ผ์ ์๊ฐ๋ง๋ค refetch๋ฅผ ์คํํ๋ ์ต์
์ด๋ค.(๋จ์ ms)
* ! ์ค์ํ ์ ์ ๋ธ๋ผ์ฐ์ ์ focus ๋์ด ์์ด์ผ๋ง ์ผ์ ์๊ฐ๋ง๋ค ์๋์ผ๋ก refetch๊ฐ ์คํ๋๋ค.
* * ๊ธฐ๋ณธ๊ฐ์ `false` ์ด๋ค.
* * ํ์ง๋ง focus ์ ๋์ด ์์ ๋๋ ์๋ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
* ! `refetchIntervalInBackground` ์ true ๋ก ๊ฐ์ ์ฃผ๋ฉด ๋๋ค.
* * ๊ธฐ๋ณธ๊ฐ์ `false` ์ด๋ค.
*/
refetchInterval: 2000,
refetchIntervalInBackground: true,