๐Ÿ“ก 03. Query Lifecycle๊ณผ ๋ Œ๋”๋ง ์ตœ์ ํ™”

2026๋…„ 3์›” 4์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

staleTime๊ณผ gcTime์˜ ์ฐจ์ด๋ฅผ ์™„๋ฒฝํžˆ ํ†ต๋‹ฌํ•˜๊ณ , Structural Sharing์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„๋‚ด๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ

"์˜์ฒ  ๋‹˜, staleTime๊ณผ gcTime ๊ฐ’์ด ๋˜‘๊ฐ™์€ ๊ฒŒ ๋ง์ด ๋˜๋‚˜์š”? ์บ์‹œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์žˆ๋Š”๋ฐ ์™œ ์ƒํ•œ ๋นต์„ ๋“ค๊ณ  ์žˆ์ฃ ?"

โ˜•๏ธ ์˜์ฒ ์ด์˜ ๊ณ ๋ฏผ: "์™œ ์ž๊พธ ๋’ค์—์„œ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋˜๋Š” ๊ฑธ๊นŒ์š”?"

(๋ชฉ์š”์ผ ์˜คํ›„, ํฌ๋กฌ ๋””๋ฒ„๊ฑฐ ๋„คํŠธ์›Œํฌ ์ฐฝ์„ ์œ ์‹ฌํžˆ ๋“ค์—ฌ๋‹ค๋ณด๋ฉฐ ๋‹นํ™ฉํ•˜๋Š” ์˜์ฒ )

๐Ÿฃ ์˜์ฒ : ์•„๋‹ˆ, ๋ฆฌ๋“œ ๋‹˜! ๋ฐฉ๊ธˆ ์ œ๊ฐ€ React Query ๋„์ž…ํ•˜๋ฉด์„œ staleTime์„ ์•„์˜ˆ 1์‹œ๊ฐ„์œผ๋กœ ์™•์ฐฝ ๋Š˜๋ ค๋†จ๊ฑฐ๋“ ์š”? ์„œ๋ฒ„์— 1์‹œ๊ฐ„ ๋™์•ˆ ๋ฌด์กฐ๊ฑด ์•ˆ ์น˜๊ณ  ์บ์‹œ ์“ฐ๊ฒ ๋‹ค๊ณ ์š”. ๊ทผ๋ฐ ์ œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ํƒญ์„ ์ž ๊น ๋‹ค๋ฅธ ๋ฐ ๊ฐ”๋‹ค ์™”๋”๋‹ˆ ๋’ค์—์„œ ๋˜ ๋„คํŠธ์›Œํฌ API fetch ๊ฐ€ ํŒํŒ ์ฐํžˆ๊ณ  ์žˆ์–ด์š” ใ… ใ… ! ๋„๋Œ€์ฒด ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”? ์ œ ์„ค์ •์ด ๋ฌด์‹œ๋‹นํ•˜๋Š” ๊ธฐ๋ถ„์ด์—์š”.

๐Ÿฆ ์˜ํ˜ธ: ์„ค์ •์ด ๋ฌด์‹œ๋‹นํ•˜๋Š” ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ์˜์ฒ  ๋‹˜์ด ์ง€๊ธˆ "์‹ ์„ ๋„(staleTime)" ์™€ "์œ ํ†ต๊ธฐํ•œ(gcTime)" ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์™„๋ฒฝํžˆ ํ˜ผ๋™ํ•˜๊ณ  ๊ณ„์‹  ๊ฑฐ๋„ค์š”.

๊ฒŒ๋‹ค๊ฐ€ ์˜์ฒ  ๋‹˜์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜๋„ ์•ˆ ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ ์“ธ๋ฐ์—†์ด ์ „์ฒด ๋ชฉ๋ก์ด ๋ฆฌ๋ Œ๋”๋ง(Re-render) ๋˜๊ณ  ์žˆ์–ด์š”. React Query๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋ฌด์„œ์šด ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋Œ๋ ค์ฃผ๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ์“ฐ๊ณ  ๊ณ„์‹  ๊ฒŒ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€: ์บ์‹œ ์„œ๋ฒ„์˜ ์ œ์™• ํŒŒ์•…ํ•˜๊ธฐ

์šฐ๋ฆฌ๊ฐ€ React Query๋ฅผ ์“ฐ๋Š” ๊ฑด, ๋„คํŠธ์›Œํฌ ํŽ˜์นญ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๋ง‰๊ณ , ์œ ์ €์—๊ฒŒ๋Š” 0์ดˆ ๋กœ๋”ฉ ๊ฒฝํ—˜์„ ์ฃผ๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด(Lifecycle)์„ ๋ชจ๋ฅด๋ฉด,

  • "๋‚œ ๋ถ„๋ช…ํžˆ ์บ์‹œ๋ฅผ ์“ฐ๋ ค๊ณ  ๋’€๋Š”๋ฐ ์™œ ์ž๊พธ API ์ฝœ์ด ๋‚ ์•„๊ฐˆ๊นŒ?" (๋ถˆํ•„์š”ํ•œ ๊ณผ๊ธˆ ๋ฐœ์ƒ)
  • "์™œ ๋ชจ๋‹ฌ ์ฐฝ๋งŒ ์—ด์—ˆ๋‹ค ๋‹ซ์•˜๋Š”๋ฐ ๋ฆฌ์ŠคํŠธ 100๊ฐœ๊ฐ€ ๋‹ค ๋ฆฌ๋ Œ๋”๋ง ์น˜์ง€?" (์„ฑ๋Šฅ ํ•˜๋ฝ)
    ๊ฐ™์€ ์•…์ˆœํ™˜์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ์›์—์„œ๋Š” 5๋…„ ์ฐจ ์‹ค๋ฌด์ž๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋ฌผ์–ด๋ณด๋Š” ๊ธฐ์ˆ  ๋ฉด์ ‘ 1์ˆœ์œ„ ์งˆ๋ฌธ์ธ staleTime๊ณผ gcTime์„ ๋‹น์‹ ์˜ ๋จธ๋ฆฟ์†์— ์™„๋ฒฝํžˆ ์ƒˆ๊ฒจ ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค.


1. staleTime vs gcTime: ์ ˆ๋Œ€ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋Š” ๋น„์œ 

React Query์˜ ๋””ํดํŠธ(๊ธฐ๋ณธ๊ฐ’)๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋ณด์ˆ˜์ ์ด๊ณ  ์˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋จผ์ € ์ด๊ฑธ ์™ธ์šฐ๊ณ  ์‹œ์ž‘ํ•˜์„ธ์š”. "๋””ํดํŠธ staleTime = 0", "๋””ํดํŠธ gcTime = 5๋ถ„"

๐Ÿž staleTime : ์‹๋นต์˜ ์‹ ์„ ๋„ (Data Freshness)

stale์€ '์ƒํ•œ, ํ€ดํ€ดํ•œ' ์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค์ž๋งˆ์ž ์ด ์‹๋นต์€ ์–ผ๋งˆ๋‚˜ ์‹ ์„ ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ• ๊นŒ์š”?
React Query์˜ ๊ธฐ๋ณธ๊ฐ’์€ 0, ์ฆ‰ ๋ฐ›์•„์˜จ ์ฆ‰์‹œ ๋ฐ”๋กœ ์ƒํ•œ(Stale) ์‹๋นต ์ทจ๊ธ‰์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ staleTime: 5 * 60 * 1000 (5๋ถ„) ์ด๋ผ๋ฉด?
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ณ  5๋ถ„ ๋™์•ˆ์€ ์™„์ „ ์‹ ์„ (Fresh)ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ์œ ์ €๊ฐ€ ๋‹ค๋ฅธ ํƒญ์„ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ์˜ค๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ด์–ด๋„ ์ ˆ๋Œ€๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์‹œ ๋„คํŠธ์›Œํฌ(Fetch) ์š”์ฒญ์„ ์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
    • ์˜์ฒ ์ด๊ฐ€ ๊ฒช์—ˆ๋˜ "ํƒญ ๋ฐ”๊ฟจ๋Š”๋ฐ ์ž๊พธ ํŽ˜์น˜ํ•ด์š”!" ๋Š” ์ด ์‹ ์„ ๋„ ์‹œ๊ฐ„์„ ์ œ๋Œ€๋กœ ์•ˆ ์คฌ๊ฑฐ๋‚˜, 0์œผ๋กœ ๋‘์—ˆ๊ธฐ์— ๋ฐœ์ƒํ•œ ๊ฒ๋‹ˆ๋‹ค. (Stale ์ƒํƒœ์ผ ๋•, ํฌ์ปค์Šค๊ฐ€ ๋Œ์•„์˜ค๋ฉด ๋ฌด์กฐ๊ฑด ๋‹ค์‹œ ์  ์ค€๋น„๋ฅผ ํ•˜๋‹ˆ๊นŒ์š”)

๐Ÿ—‘๏ธ gcTime : ๋ƒ‰์žฅ๊ณ  ์œ ํ†ต๊ธฐํ•œ (Garbage Collection Time)

์ด๊ฑด cacheTime์ด๋ผ๋Š” ์ด์ „ v4 ์‹œ์ ˆ์˜ ์ด๋ฆ„์—์„œ gcTime์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. (์˜คํ•ด ๋ฐฉ์ง€)
์ด Query๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ์˜ต์ €๋ฒ„(์ปดํฌ๋„ŒํŠธ)๊ฐ€ ํ™”๋ฉด์—์„œ ํ•œ ๋ช…๋„ ์•ˆ ๋‚จ๊ณ  ๋ชจ๋‘ ์–ธ๋งˆ์šดํŠธ(Unmount) ๋˜์—ˆ์„ ๋•Œ๋ถ€ํ„ฐ ์นด์šดํŠธ๋‹ค์šด ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

  • 5๋ถ„ ๋’ค, (๊ธฐ๋ณธ๊ฐ’) "์•„๋ฌด๋„ ์ด ์‹ ์„ ๋„ ํ™•์ธ ์•ˆ ํ•œ ์ง€ 5๋ถ„์ด๋‚˜ ๋๋„ค? ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋‹ค, ์ด ๋นต์€ ์“ฐ๋ ˆ๊ธฐํ†ต(Garbage)์œผ๋กœ!" ํ•˜๊ณ  ํ•˜๋“œ๋””์Šคํฌ(๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ)์—์„œ ์‹น ๋‚ ๋ ค๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  • ๊ทธ ์ดํ›„ ๋‹ค์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„์šฐ๋ฉด ์™„์ „ ๊ทน์ดˆ๊ธฐ ํ•˜๋“œ ๋กœ๋”ฉ(isLoading === true) ์ƒํ™ฉ์œผ๋กœ ํšŒ๊ท€ํ•ฉ๋‹ˆ๋‹ค.

โ€ผ๏ธ ์‹œ๋‹ˆ์–ด์˜ ์กฐ์–ธ:
์‹ค๋ฌด์—์„œ staleTime์„ gcTime๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ•์ œ๋กœ ๋” ๊ธธ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํŒŒ๋ฉธ์„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
"๋ฐ์ดํ„ฐ ์‹ ์„ ๋„๊ฐ€ 1์‹œ๊ฐ„ ๋‚จ์•˜๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ 5๋ถ„ ๋งŒ์— ์ง€์›Œ๋ฒ„๋ ค๋ผ" ๋ผ๋Š” ๊ธฐ๊ดดํ•œ ์ •์ฑ…์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•ญ์ƒ gcTime ์ด staleTime ๋ณด๋‹ค ํฌ๊ฒŒ ์„ค์ •ํ•ด์•ผ ์บ์‹œ ์‹œ์Šคํ…œ์ด ์˜จ์ „ํžˆ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


2. ์—„์ฒญ๋‚œ ๋งˆ๋ฒ•: Structural Sharing๊ณผ ๋ฆฌ๋ Œ๋”๋ง ๊ฐ•์–ด

์˜์ฒ (์‹ ์ž…): "๋ฆฌ๋“œ ๋‹˜! ์•„๊นŒ ๋ฐ์ดํ„ฐ ์•ˆ ๋ฐ”๋€Œ๋ฉด ๋ฆฌ๋ Œ๋”๋ง ์•ˆ ์ผ์–ด๋‚œ๋‹ค ํ•˜์…จ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋ฌด์Šจ ์›๋ฆฌ์ธ๊ฐ€์š”? API ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์˜๋ฉด ๋ฌด์กฐ๊ฑด ์ƒˆ ๊ฐ์ฒด ๋ฐ›์œผ๋‹ˆ๊นŒ ๋ฆฌ์•กํŠธ๋Š” ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•ด์„œ ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ๊ณ ์นจ ์น˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?"

๐Ÿฆ ์˜ํ˜ธ: "React Query ๋‚ด๋ถ€์˜ ์ตœ๊ณ  ๋งˆ๋ฒ• ๊ตฌ์กฐ์ธ Structural Sharing (๊ตฌ์กฐ์  ๊ณต์œ ) ์„ ์ „ํ˜€ ๋ชจ๋ฅด์‹œ๋Š”๊ตฐ์š”."

๋งŒ์•ฝ 100๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์—์„œ ๋‹ค๋ฅธ ํƒญ ๊ฐ”๋‹ค ์™€์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํด๋ง(isFetching)์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํ†ต์งธ๋กœ 100๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒˆ๋กœ ๋‚ด๋ ค๋ณด๋ƒˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ์ด ์ค‘, 1๋ฒˆ์งธ ๊ธ€์˜ ์ œ๋ชฉ ๋”ฑ ํ•˜๋‚˜๋งŒ ๋ฐ”๋€Œ๊ณ  ๋‚˜๋จธ์ง€ 99๊ฐœ๋Š” ์™„๋ฒฝํžˆ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค.

// ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํŽ˜์นญ ์ด์ „ ์บ์‹œ
{ "data": [{ "id": 1, "title": "ํ† ๋ผ" }, { "id": 2, "title": "๊ฑฐ๋ถ์ด" }] }
 
// ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํŽ˜์นญ ๊ฒฐ๊ณผ (์ƒˆ๋กœ์šด ๊ฐ์ฒด ๋ฉ์–ด๋ฆฌ)
{ "data": [{ "id": 1, "title": "๋ฌด์  ํ† ๋ผ" }, { "id": 2, "title": "๊ฑฐ๋ถ์ด" }] }

๋ณดํ†ต์˜ useEffect + setState ๋ผ๋ฉด ์ด ๊ฑฐ๋Œ€ํ•œ ๋ญ‰ํ……์ด๋ฅผ ํ†ต์งธ๋กœ ๋ฎ์–ด์”Œ์›Œ์„œ 100๊ฐœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ „๋ถ€ ๋ฏธ์นœ๋“ฏ์ด ๋ฒˆ์ฉ๊ฑฐ๋ฆฌ๋ฉฐ ๋ฆฌ๋ Œ๋”๋ง ๋˜์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค (Redux๋„ ๋งˆ์ฐฌ๊ฐ€์ง€).

ํ•˜์ง€๋งŒ React Query๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์„œ๋ฒ„์—์„œ ์ƒˆ ์‘๋‹ต์ด ์˜ด.
  2. React Query๊ฐ€ ์•„์ฃผ ๊นŠ์€ ๊ณณ์—์„œ ๋ฐฉ๊ธˆ ์˜จ ์ƒˆ ๋ฐ์ดํ„ฐ ๋ญ‰์น˜์™€ ๊ธฐ์กด ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ๋นจ๋ฆฌ ํ•œ ๊ฒน ํ•œ ๊ฒน ์ˆœํšŒํ•˜๋ฉฐ Deep Equal (๊นŠ์€ ๋น„๊ต) ์„ ์ˆ˜ํ–‰ํ•จ.
  3. ์–ด๋ผ? 2๋ฒˆ ๊ฑฐ๋ถ์ด ๊ฐ์ฒด๋Š” ์•ˆ์˜ ๋‚ด์šฉ์ด ์ž๋ฆฟ์ˆ˜ ํ•˜๋‚˜ ์•ˆ ํ‹€๋ฆฌ๊ณ  ๋˜‘๊ฐ™๋„ค? -> ์ƒˆ๋กœ ์˜จ 2๋ฒˆ ๊ฐ์ฒด๋ฅผ ๊ณผ๊ฐํžˆ ๋ฒ„๋ฆฌ๊ณ , ์ด์ „ 2๋ฒˆ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฐธ์กฐ(Reference) ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. ์–ด? 1๋ฒˆ ํ† ๋ผ ๊ฐ์ฒด๋งŒ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ๋„ค? -> ์–˜๋Š” ์ƒˆ ์ฃผ์†Œ๋กœ ๊ฐˆ์•„๋ผ์›€.
  5. ๊ฒฐ๊ณผ: React๋Š” ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ์•ˆ ๋ฐ”๋€ 99๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ ˆ๋Œ€๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ตœ์ ํ™” ์„ฑ๋Šฅ ํญ๋ฐœ ๐ŸŒ‹)

์ด๊ฒƒ์ด React Query๋ฅผ ์ผ์„ ๋•Œ, ์•„๋ฌด ์ตœ์ ํ™” ์•ˆ ํ–ˆ๋Š”๋ฐ๋„ ์•ฑ์ด ์Šค๋ฌด์Šคํ•˜๊ณ  ๊ฒฝ์ด๋กญ๊ฒŒ ๊ตฌ๋™๋˜๋Š” ์ง„์งœ ์ด์œ (์„ฑ๋Šฅ ์ด์ ) ์ž…๋‹ˆ๋‹ค.


๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

ํ—... ๋‚œ ๊ทธ๋ƒฅ ํŽธํ•˜๋ ค๊ณ  React Query ์ผ๋Š”๋ฐ, ์•ˆ์—์„œ Deep Equal ๋น„๊ตํ•ด์„œ ์ฐธ์กฐ ์ฃผ์†Œ๋ฅผ ๊ฐˆ์•„์ฃผ๋ฉฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”๊นŒ์ง€ ํ•ด์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค๋‹ˆ ์†Œ๋ฆ„ ๋‹๋„ค;;

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "stale(์ƒํ•œ ๋นต ์—ฌ๋ถ€ ํŒ๋‹จ)๊ณผ gc(์“ฐ๋ ˆ๊ธฐํ†ต ์งํ–‰ ์—ฌ๋ถ€) ์‹œ๊ฐ„์„ ํ™•์‹คํžˆ ๊ตฌ๋ถ„! ๊ทธ๋ฆฌ๊ณ  100๊ฐœ ๋ฐ์ดํ„ฐ ํŽ˜์น˜ ์ค‘ 1๊ฐœ๋งŒ ๋ฐ”๋€Œ๋ฉด 1๊ฐœ๋งŒ ๊ทธ๋ ค์ค€๋‹ค! React Query ๋ฏธ์นœ ํšจ์œจ์„ฑ ์ตœ๊ณ ์กด์—„."

์˜ํ˜ธ ๋‹˜์ด ๋ฌด์‹ฌํ•˜๊ฒŒ ํˆญ ๋˜์ง„ ๋ง ์ค‘์— **"staleTime์ด๋ž‘ gcTime์„ ์„ธํŠธ๋กœ ๋งž์ถœ ๋• ํ•ญ์ƒ gcTime์„ ๋” ๋„‰๋„‰ํ•˜๊ฒŒ ์žก๋Š” ๊ฑธ ๋ช…์‹ฌํ•ด๋ผ"**๋ผ๋Š” ๊ฒŒ ์˜ค๋Š˜ ์ ค ํฌ๊ฒŒ ์™€๋‹ฟ์•˜๋‹ค. ์ง‘์— ๊ฐ€์„œ ๋‚ด ํ”Œ๋ž˜๋„ˆ ์•ฑ ์บ์‹œ ํด๋ง ๊ธฐ๋Šฅ๋“ค ๋‹ค์‹œ ์‹น ๋‹ค ์žก์•„๋ด์•ผ๊ฒ ๋‹ค. ์‹ ๋‚œ๋‹ค! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ


๐Ÿ“ ๋ฐฐ์šด ๋‚ด์šฉ ์ ๊ฒ€ํ•˜๊ธฐ (Quiz)

Q. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์˜์ฒ ์ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์งฐ์Šต๋‹ˆ๋‹ค.

const { data } = useQuery({
  queryKey: ['profiles'],
  queryFn: fetchProfiles,
  staleTime: Infinity,           // "์•ฑ์„ ์‚ด์•„์ˆจ์‰ฌ๋Š” ํ•œ ์ ˆ๋Œ€ ์บ์‹œ ์•ˆ ์ƒํ•˜๊ฒŒ!"
  gcTime: 5 * 60 * 1000,         // 5๋ถ„ ํ›„ ์บ์‹œ ๋‚ ๋ ค๋ฒ„๋ฆผ
});

์ด ์ฝ”๋“œ๋กœ 'profiles' ํŽ˜์ด์ง€๋ฅผ ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ๋ฒ—์–ด๋‚œ ์ง€ 10๋ถ„์ด ์ง€๋‚˜์„œ ๋‹ค์‹œ 'profiles' ํŽ˜์ด์ง€๋กœ ๋Œ์•„์™”์„ ๋•Œ, ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ์š”?

โœ… ์ •๋‹ต: ์ง€๋…ํ•œ ํ•˜๋“œ ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๊ฐ€ ๋Œ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์™•์ฐฝ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ฒŒ(Fetch) ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: staleTime์„ ์˜์›(Infinity)์œผ๋กœ ๊ฑธ์–ด ๋†จ์œผ๋‹ˆ ์ ˆ๋Œ€๋กœ ๋‹ค์‹œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์•ˆ ์  ๊ฒƒ ๊ฐ™์ฃ ? ์•„๋‹™๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ ์‹ ์„ ๋„๋ฅผ ์˜์›์œผ๋กœ ๋ช…๋ช…ํ•ด ๋†จ์–ด๋„, ์˜์ฒ ์ด๊ฐ€ ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚œ(์–ธ๋งˆ์šดํŠธ) ํ›„ gcTime ์ธ 5๋ถ„์ด ๋„˜์–ด์„œ๋Š” ์ˆœ๊ฐ„, ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ฒญ์†Œ๋ถ€๋Š” ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๊ฐ€์šด ์“ฐ๋ ˆ๊ธฐํ†ต์œผ๋กœ ๊ฐˆ์•„๋ฒ„๋ฆฝ๋‹ˆ๋‹ค(Garbage collected). ์บ์‹œ ํ†ต ์ž์ฒด๊ฐ€ ํ……ํ…… ๋น„์–ด๋ฒ„๋ ธ๋Š”๋ฐ staleTime์ด ๋ฌด์Šจ ์†Œ์šฉ์ด ์žˆ๊ฒ ์Šต๋‹ˆ๊นŒ?
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ๋ช…์‹ฌํ•˜์„ธ์š”. staleTime์ด gcTime์„ ๋›ฐ์–ด๋„˜์œผ๋ฉด ์•„๋ฌด ์†Œ์šฉ์ด ์—†์–ด์š”! ๋ƒ‰์žฅ๊ณ  ์œ ํ†ต๊ธฐํ•œ์ด 5๋ถ„์ธ๋ฐ ์‹๋นต ์ œ์กฐ์ผ์ž ์œ ํšจ๊ธฐ๊ฐ„ 10๋…„ ์ฐํžŒ ์Šคํ‹ฐ์ปค ๋ถ™์—ฌ๋ด์•ผ, ๊ฒฐ๊ตญ ๋ƒ‰์žฅ๊ณ ์—์„œ 5๋ถ„ ๋’ค์— ๋‹ค ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: staleTime (์‹ ์„ ๋„) < gcTime (๋ƒ‰์žฅ๊ณ ๋ณด๊ด€์ผ์ž). ์ด ์ ˆ๋Œ€ ๊ณต์‹์„ ๋ฐ˜๋“œ์‹œ ์•”๊ธฐํ•˜์„ธ์š”!