ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

 

TodoList์˜ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€์™€ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์˜ค๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธํ•œ staleTime ๊ณผ gcTime


Home


Detail

 

 

invalidateQuerise - ์ฟผ๋ฆฌ ๋ฌดํšจํ™”

// Detail.jsx
  
  const { id } = useParams();
  
const fetchDetail = async () => {
    const response = await todoApi(`/todos/${id}`);
    return response.data;
  };

  const { data, isLoading, error } = useQuery({
    queryKey: ["todos", id],
    queryFn: fetchDetail,
  });

 

ํ™ˆ -> ๋””ํ…Œ์ผ ํŽ˜์ด์ง€๋กœ ๋“ค์–ด๊ฐ€๋ฉด params๋กœ id๋ฅผ ์š”์ฒญํ•˜์—ฌ ํ•ด๋‹น todo์˜ ์ƒ์„ธ ๋‚ด์šฉ์ด ๋œฌ๋‹ค.

๋กœ๋”ฉ ์ค‘์ž„์„ ์ž˜ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด 3G ํ™˜๊ฒฝ์„ ์ฃผ์—ˆ๋‹ค.


๋งจ ์ฒ˜์Œ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ๊ฐ’์„ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— '๋กœ๋”ฉ ์ค‘' ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ Network ํƒญ์—๋„ ์ƒˆ๋กœ์šด ๊ฐ’์ด ์ž˜ ๋ถˆ๋Ÿฌ์™€์ง„๋‹ค.

์ดํ›„ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋”ฉ๋œ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด ๋ฐ”๋กœ ํŽ˜์ด์ง€๊ฐ€ ๊ทธ๋ ค์ง„๋‹ค.

 

 

โ“์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

// TodoForm.jsx
const { mutate } = useMutation({
    mutationFn: addTodo,
    onSuccess: () => {
      queryClient.invalidateQueries(["todos"]);
    },
  });

mutate๋กœ addTodo๋ฅผ ์‹คํ–‰ํ•˜๊ณ  invalidate๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•œ๋‹ค.

'์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”' ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์•„์™€์„œ ํŽ˜์ด์ง€์— ์ƒˆ๋กœ ๊ทธ๋ ค์ค€๋‹ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์™”๋‹ค.

 

 

์•„๋ž˜๋Š” 3G ํ™˜๊ฒฝ์—์„œ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ ๋’ค, todo๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์‹œ ๊ทธ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ณด๋Š” ์ƒํ™ฉ์ด๋‹ค.

todo๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด๋ฉฐ, '๋กœ๋”ฉ ์ค‘...'์ด ๋‹ค์‹œ ๋œฐ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ todo ์ถ”๊ฐ€ ์ „๊ณผ ํ›„์˜ ํŽ˜์ด์ง€ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.

์ด ํ˜„์ƒ์€ ๊ณง ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์˜ ํŽ˜์นญ์ด ์•„๋‹Œ ๊ธฐ์กด์— ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ ์˜จ๋‹ค๋Š” ์˜๋ฏธ์ผํ…๋ฐ...

๊ทธ๋ ‡๋‹ค๋ฉด '์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”' ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ฒƒ์ผ๊นŒ?

 

์ฐพ์•„๋ณด๋‹ˆ invalidate๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์€ stale ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์ฆ‰, ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  staleํ•œ ์ƒํƒœ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒƒ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ๋ฌดํšจํ™” ํ›„์—๋„ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ๋Ÿฌ์™€์ง€๋Š” ๊ฒƒ์ด๋‹ค.

 

 

staleTime & gcTime

staleํ•œ ์ƒํƒœ๋Š” ๋ฐ›์•„ ์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ ์„ ํ•œ(fresh) ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ฉ์€(stale) ์ƒํƒœ์ธ ๊ฒƒ์ด๋ฉฐ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ staleํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํŽ˜์นญํ•œ๋‹ค.

 

๐Ÿ‘‡๐Ÿปstale๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌํŽ˜์นญ๋˜๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋”๋ณด๊ธฐ

1. staleTime์ด ์ง€๋‚˜์„œ stale์ด ๋œ ๊ฒฝ์šฐ

  • staleTime์ด ๋งŒ๋ฃŒ๋˜๋ฉด, ๋ฐ์ดํ„ฐ๋Š” stale ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฐ”๋กœ refetch๋Š” ํ•˜์ง€ ์•Š๊ณ , ์•„๋ž˜ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ถฉ์กฑ๋  ๋•Œ ๋‹ค์‹œ ๊ฐ€์ ธ์˜จ๋‹ค.

2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋งˆ์šดํŠธ๋  ๋•Œ (refetchOnMount)

  • stale ์ƒํƒœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋งˆ์šดํŠธ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’: true  stale ์ƒํƒœ๋ฉด ์ž๋™์œผ๋กœ refetch
useQuery({
  queryKey: ["todos"],
  queryFn: fetchTodos,
  staleTime: 1000 * 60 * 5, // 5๋ถ„ ๋™์•ˆ fresh ์œ ์ง€
  refetchOnMount: true, // stale ์ƒํƒœ๋ฉด ๋งˆ์šดํŠธ๋  ๋•Œ ์ž๋™ refetch
});

staleTime์ด ๋งŒ๋ฃŒ๋œ ํ›„, ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ฑฐ๋‚˜, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ํ›„ ์žฌ๋งˆ์šดํŠธ๋˜๋ฉด ์ž๋™์œผ๋กœ refetch.

 

3. ๋ธŒ๋ผ์šฐ์ € ํฌ์ปค์Šค๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”๋  ๋•Œ (refetchOnWindowFocus)

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ํƒญ์„ ๋ณด๊ณ  ์žˆ๋‹ค๊ฐ€ ํ˜„์žฌ ํƒญ์œผ๋กœ ๋Œ์•„์˜ค๋ฉด ์ž๋™์œผ๋กœ refetch.
  • ๊ธฐ๋ณธ๊ฐ’: true  stale ์ƒํƒœ์ผ ๋•Œ ํฌ์ปค์Šค ์ด๋™ ์‹œ refetch
useQuery({
  queryKey: ["todos"],
  queryFn: fetchTodos,
  staleTime: 1000 * 60 * 5, // 5๋ถ„ ๋™์•ˆ fresh ์œ ์ง€
  refetchOnWindowFocus: true, // stale ์ƒํƒœ์ผ ๋•Œ ์ฐฝ ํฌ์ปค์Šค ์ด๋™ ์‹œ ์ž๋™ refetch
});

false๋กœ ์„ค์ •ํ•˜๋ฉด ํฌ์ปค์Šค ์ด๋™ํ•ด๋„ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Œ.

 

4. ๋„คํŠธ์›Œํฌ๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋  ๋•Œ (refetchOnReconnect)

  • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ฒผ๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด ์ž๋™์œผ๋กœ refetch.
  • ๊ธฐ๋ณธ๊ฐ’: true
useQuery({
  queryKey: ["todos"],
  queryFn: fetchTodos,
  refetchOnReconnect: true, // ๋„คํŠธ์›Œํฌ ์žฌ์—ฐ๊ฒฐ ์‹œ ์ž๋™ refetch
});

๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š์–ด์ ธ ์žˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด, stale ์ƒํƒœ์ธ ์ฟผ๋ฆฌ๋Š” ์ž๋™์œผ๋กœ refetch.

 

5. ์‚ฌ์šฉ์ž ์•ก์…˜์œผ๋กœ ๊ฐ•์ œ refetch (refetch() ๋˜๋Š” invalidateQueries())

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋„๋ก ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
const { data, refetch } = useQuery({
  queryKey: ["todos"],
  queryFn: fetchTodos,
  staleTime: 1000 * 60 * 5, // 5๋ถ„ ๋™์•ˆ fresh ์œ ์ง€
});

<button onClick={() => refetch()}>๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ</button>

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ด.

queryClient.invalidateQueries({ queryKey: ["todos"] });

 

6. ํŠน์ • ์‹œ๊ฐ„๋งˆ๋‹ค ์ž๋™์œผ๋กœ refetch (refetchInterval)

  • ์ผ์ • ์ฃผ๊ธฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
useQuery({
  queryKey: ["todos"],
  queryFn: fetchTodos,
  refetchInterval: 1000 * 60 * 5, // 5๋ถ„๋งˆ๋‹ค ์ž๋™ refetch
});

 

stale ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ๊ฐ€๋Šฅ.

 

๋ฆฌํŽ˜์นญ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์ง€๋งŒ

์›๋ž˜ ์˜ˆ์ƒํ–ˆ๋˜ ๋ฐ˜์‘์ธ '๋กœ๋”ฉ ์ค‘...' ์ด ๋œจ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด gcTime์„ ํ™œ์šฉํ•ด๋ณด์•˜๋‹ค.

gcTime์ด ์ง€๋‚˜๋ฉด ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

gcTime์„ 0์œผ๋กœ ์ฃผ์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋˜์ž๋งˆ์ž ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ์‹œํ‚จ๋‹ค.

staleTime์ด ๋” ๊ธธ์ง€๋งŒ gcTime์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค.

// Detail.jsx

const { data, isLoading, error } = useQuery({
    queryKey: ["todos", id],
    queryFn: fetchDetail,
    gcTime: 0,
    staleTime: 1000 * 60,
  });

Home์—๋Š” staleTime์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐ’, ๋ฐ”๋กœ ์ฉ์–ด๋ฒ„๋ฆฐ๋‹ค.

  • staleTime์ด ๋” ๊ธธ์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™”(Home์œผ๋กœ ์ด๋™) ๋˜์ž๋งˆ์ž gcTime์ด ๋ฐœํ˜„๋จ
  • Devtools์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ์‚ญ์ œ๋จ

 

staleTime์€ ๋ฐ์ดํ„ฐ๊ฐ€ freshํ•œ ์ƒํƒœ์˜ ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜๋ฉฐ

gcTime์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™”(์–ธ๋งˆ์šดํŠธ) ๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. (๊ธฐ๋ณธ 5๋ถ„)

โœจ staleTime ๊ณผ gcTime ์กฐํ•ฉ

(๊ธฐ๋ณธ ์กฐ๊ฑด : staleTime๋ณด๋‹ค gcTime์ด ๋” ๊น€)

const { data, isLoading, error } = useQuery({
    queryKey: ["todos", id],
    queryFn: fetchDetail,
    gcTime: 1000 * 60 * 5,
    staleTime: 1000 * 60,
  });

 

๊ฒฝ์šฐ 1. data๋Š” fresh, ์บ์‹œ์— data๊ฐ€ ์žˆ์„ ๋•Œ(staleTime๊ณผ gcTime ๋ชจ๋‘ ์•ˆ ์ง€๋‚จ)

  • staleTime ๋‚ด์— ํ™ˆ <-> ๋””ํ…Œ์ผ์„ ์˜ค๊ฐ€๋„ ์บ์‹œ๋œ data๋ฅผ ํ‘œ์‹œ 
  • ๋ฐ์ดํ„ฐ refetch ์•ˆํ•จ (data๊ฐ€ stale ํ•˜์ง€ ์•Š์Œ)

 

๊ฒฝ์šฐ 2. data๊ฐ€ stale, ์บ์‹œ์— data๊ฐ€ ์žˆ์„ ๋•Œ(staleTime๋งŒ ์ง€๋‚˜๊ณ  gcTime์€ ์•ˆ ์ง€๋‚จ)

  • ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „๊นŒ์ง€ ์บ์‹ฑ๋œ data๋ฅผ ๋ณด์—ฌ์คŒ
  • ์œ„์˜ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ๋ฆฌํŽ˜์นญ์ด ์ง„ํ–‰๋จ

 

๊ฒฝ์šฐ 3. staleTime๋ณด๋‹ค gcTime์ด ์งง์„ ๋•Œ

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜์—ˆ์„ ๋•Œ๋Š” gcTime์— ๊ด€๊ณ„์—†์ด ์บ์‹ฑ๋œ data๋ฅผ ํ‘œ์‹œ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋œ ์ดํ›„๋กœ gcTime์ด ์ ์šฉ ๋จ.

 

๊ฒฝ์šฐ 4. gcTime์ด ์ง€๋‚˜ ์บ์‹ฑ๋œ data๊ฐ€ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ

  • ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๊นŒ์ง€(refetch ๋  ๋•Œ๊นŒ์ง€) ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ