⚛️ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…: CRA vs Vite

โš›๏ธ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…: CRA vs Vite

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๋น„๋ฐ€: React Query ์บ์‹œ ํƒ€์ž„ vs Stale Time

"์™œ ๋‚ด ์•ฑ์€ ์ž๊พธ ๋กœ๋”ฉ๋งŒ ๋Œ๊นŒ?"
๊ทธ ๋‹ต์€ ๋ฐ์ดํ„ฐ์˜ ์œ ํ†ต๊ธฐํ•œ๊ณผ ๋ณด๊ด€๊ธฐํ•œ์— ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿค” ๋งค๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ํ™”๋ฉด, ์ง€๊ฒน์ง€ ์•Š์œผ์‹ ๊ฐ€์š”?

์›น ์‚ฌ์ดํŠธ๋‚˜ ์•ฑ์„ ์ด์šฉํ•˜๋‹ค ๋ณด๋ฉด, ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ ๋˜‘๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š”๋ฐ๋„ '๋กœ๋”ฉ ์ค‘...' ํ‘œ์‹œ๊ฐ€ ๋œจ๋Š” ๊ฒฝํ—˜์„ ํ•ด๋ณด์…จ์„ ๊ฒ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” "์•„๊นŒ ๋ถˆ๋Ÿฌ์˜จ ๊ฑด๋ฐ ์™œ ๋˜ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜์ง€?"๋ผ๋Š” ๋‹ต๋‹ตํ•จ์ด ์ƒ๊ธฐ๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋„ ์„œ๋ฒ„์— ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ๊ณ„์† ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„์ด์ž ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ๋ฒ”์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์—ฌ๊ธฐ์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ตฌ์„ธ์ฃผ, React Query!

React Query๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋งŽ์€ ๋ถ„๋“ค์ด ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ค ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์ด ๋ฐ”๋กœ Stale Time(์ƒํ•œ ์‹œ๊ฐ„)๊ณผ Cache Time(์บ์‹œ ์‹œ๊ฐ„)์ž…๋‹ˆ๋‹ค.
์ด ๋‘ ๊ฐ€์ง€๋งŒ ์ œ๋Œ€๋กœ ์ดํ•ดํ•ด๋„ ์•ฑ์˜ ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ๋ณต์žกํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, ์ผ์ƒ์ƒํ™œ์˜ ์‰ฌ์šด ๋น„์œ ๋ฅผ ํ†ตํ•ด ์ด ๋‘ ๊ฐœ๋…์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


Illustration of a bored user looking at a loading spinner on a website, with the React Query logo appearing like a superhero to solve the problem.


๐Ÿ… Stale Time: ๋ฐ์ดํ„ฐ์˜ '์‹ ์„ ๋„' ์œ ํ†ต๊ธฐํ•œ

๋จผ์ € Stale Time์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
'Stale'์€ ์˜์–ด๋กœ '์‹ ์„ ํ•˜์ง€ ์•Š์€', '์˜ค๋ž˜๋œ'์ด๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ ์‹ ์„ ํ•œ ์ƒํƒœ(Fresh)๋กœ ๊ฐ„์ฃผ๋  ๊ฒƒ์ธ๊ฐ€๋ฅผ ์„ค์ •ํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

๐Ÿ›’ ๋งˆํŠธ ์žฅ๋ณด๊ธฐ ๋น„์œ 

  • 1. Fresh ์ƒํƒœ: ๊ฐ“ ๊ตฌ์šด ๋นต์„ ์ƒ€์Šต๋‹ˆ๋‹ค. 1๋ถ„ ๋’ค์— ๋ˆ„๊ฐ€ "๋นต ์ค„๊นŒ?"๋ผ๊ณ  ํ•˜๋ฉด, ๊ตณ์ด ๋นต์ง‘์— ๋‹ค์‹œ ๊ฐˆ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์‚ฐ ๋นต์ด ์—ฌ์ „ํžˆ ๋”ฐ๋œปํ•˜๊ณ  ์‹ ์„ ํ•˜๋‹ˆ๊นŒ์š”.
    ๐Ÿ‘‰ ์„œ๋ฒ„ ์š”์ฒญ ์—†์ด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 2. Stale ์ƒํƒœ: ๋นต์„ ์‚ฐ ์ง€ 3์ผ์ด ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค. "๋นต ์ค„๊นŒ?"๋ผ๊ณ  ํ•˜๋ฉด ๊ณ ๋ฏผ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ณฐํŒก์ด๊ฐ€ ํˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ๋นต์ง‘์— ๊ฐ€์„œ ์ƒˆ ๋นต์„ ์‚ฌ์˜ค๋Š” ๊ฒŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒํ–ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , ์„œ๋ฒ„์— ๋‹ค์‹œ ์š”์ฒญ(Refetch)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
⚠️ ์ฃผ์˜ํ•  ์ !
React Query์—์„œ staleTime์˜ ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ž๋งˆ์ž "์ด๊ฑด ์ƒํ•œ ๋ฐ์ดํ„ฐ์•ผ!"๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ , ๋‹ค์Œ ๋ฒˆ์— ํ•„์š”ํ•  ๋•Œ ๋ฐ”๋กœ ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ผ๋ฉด ์ด ์‹œ๊ฐ„์„ ์ ์ ˆํžˆ ๋Š˜๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.

A comparison illustration between fresh bread (Fresh state) and moldy bread (Stale state). Fresh bread is ready to eat (cache hit), while moldy bread has an arrow pointing to a bakery (server request).


๐Ÿ—‘️ Cache Time: ์“ฐ๋ ˆ๊ธฐํ†ต ๋น„์šฐ๋Š” ์‹œ๊ฐ„

๋‹ค์Œ์€ Cache Time(gcTime)์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ ๋‚จ์•„์žˆ์„์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚˜์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ์ด์ƒ ์“ฐ์ด์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์„ ๋•Œ(Inactive ์ƒํƒœ), ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ์ง€์šธ์ง€ ์•„๋‹ˆ๋ฉด ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ ์ž ๊น ๋†”๋‘˜์ง€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ  ์ง‘ ์ฒญ์†Œ ๋น„์œ 

์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐฉ๊ธˆ ๋จน์€ ๊ณผ์ž ๋ด‰์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.

  1. ๋‹ค ๋จน์€ ๊ณผ์ž ๋ด‰์ง€(Inactive Data)๋ฅผ ์ฑ…์ƒ ์œ„์— ์˜ฌ๋ ค๋‘ก๋‹ˆ๋‹ค.
  2. Cache Time ๋‚ด: 5๋ถ„ ๋’ค์— ๋‹ค์‹œ ๊ณผ์ž ๋ด‰์ง€์˜ ์„ฑ๋ถ„ํ‘œ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ์“ฐ๋ ˆ๊ธฐํ†ต์„ ๋’ค์งˆ ํ•„์š” ์—†์ด ์ฑ…์ƒ ์œ„์˜ ๋ด‰์ง€๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  3. Cache Time ๊ฒฝ๊ณผ: 30๋ถ„์ด ์ง€๋‚˜ ์ฒญ์†Œ๋ฅผ ํ•˜๋ฉด์„œ ๋ด‰์ง€๋ฅผ ์“ฐ๋ ˆ๊ธฐํ†ต์— ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ). ์ด์ œ ์„ฑ๋ถ„ํ‘œ๋ฅผ ๋ณด๋ ค๋ฉด ๋งˆํŠธ์— ๊ฐ€์„œ ๊ณผ์ž๋ฅผ ๋‹ค์‹œ ์‚ฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ํ•ต์‹ฌ ์š”์•ฝ
๋ฐ์ดํ„ฐ๊ฐ€ Stale(์ƒํ•œ) ์ƒํƒœ๋ผ๋„ Cache Time(๋ณด๊ด€ ๊ธฐ๊ฐ„)์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด, ์ผ๋‹จ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ๋’ค์—์„œ ๋ชฐ๋ž˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฐ”๋กœ ์‚ฌ์šฉ์ž๊ฐ€ "๋กœ๋”ฉ ์—†์ด ๋น ๋ฅด๋‹ค"๊ณ  ๋А๋ผ๊ฒŒ ๋งŒ๋“œ๋Š” ๋น„๊ฒฐ์ž…๋‹ˆ๋‹ค.


๐Ÿ“Š ํ•œ๋ˆˆ์— ๋น„๊ตํ•˜๋Š” ์ฐจ์ด์ 

๋‘ ๊ฐœ๋…์ด ์•„์ง ํ—ท๊ฐˆ๋ฆฌ์‹ ๋‹ค๋ฉด ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ตฌ๋ถ„ Stale Time Cache Time (gcTime)
ํ•ต์‹ฌ ์งˆ๋ฌธ "์ด ๋ฐ์ดํ„ฐ, ๋‹ค์‹œ ๋ฐ›์•„์™€์•ผ ํ•ด?" "์ด ๋ฐ์ดํ„ฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง€์›Œ์•ผ ํ•ด?"
๊ธฐ๋ณธ๊ฐ’ 0์ดˆ (์ฆ‰์‹œ ์ƒํ•จ) 5๋ถ„
๋™์ž‘ ์‹œ์  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•  ๋•Œ (Refetch ์—ฌ๋ถ€ ๊ฒฐ์ •) ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ (Inactive ์ƒํƒœ ์ง„์ž… ์‹œ)

A diagram showing the lifecycle of data in React Query. Flowchart from Fetching -> Fresh -> Stale -> Inactive -> Deleted. Labels indicating StaleTime and CacheTime durations at relevant stages.


๐ŸŽ“ ๋งˆ์น˜๋ฉฐ: ์ตœ์ ์˜ ์„ค์ •๊ฐ’ ์ฐพ๊ธฐ

React Query๋Š” ๋ณต์žกํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋†€๋ผ์šธ ์ •๋„๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’(staleTime: 0)์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด, React Query์˜ ์ง„์ •ํ•œ ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ๋ˆ„๋ฆฌ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

✅ ์‹ค์ „ ์ ์šฉ ๊ฐ€์ด๋“œ

  • ์ž์ฃผ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ(์˜ˆ: ์ฃผ์‹ ๊ฐ€๊ฒฉ, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…): staleTime์„ ์งง๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.
  • ๊ฑฐ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ(์˜ˆ: ๋งˆ์ดํŽ˜์ด์ง€ ํ”„๋กœํ•„, ๊ณต์ง€์‚ฌํ•ญ): staleTime์„ Infinity๋‚˜ 5๋ถ„ ์ด์ƒ์œผ๋กœ ๊ธธ๊ฒŒ ์„ค์ •ํ•˜์„ธ์š”. ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์บ์‹œ ํƒ€์ž„: ๊ธฐ๋ณธ๊ฐ’ 5๋ถ„์ด๋ฉด ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์กฐ์ ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ์—ด์–ด๋ณด์„ธ์š”.
๋ฌด์‹ฌ์ฝ” ์ง€๋‚˜์ณค๋˜ useQuery ์˜ต์…˜์— ์ž‘์€ ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›จ์”ฌ ์พŒ์ ํ•œ ๊ฒฝํ—˜์„ ์„ ๋ฌผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์—๋Š” ๋” ํฅ๋ฏธ๋กœ์šด ์ตœ์ ํ™” ํŒ์œผ๋กœ ์ฐพ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค!

๋Œ“๊ธ€ ์“ฐ๊ธฐ