๐Ÿฆ” React-Query ์ ์šฉํ•˜๊ธฐ

hyeryeonยท2024๋…„ 6์›” 16์ผ
post-thumbnail

โœ’๏ธ Server State

โœ๏ธ state (์ƒํƒœ)

  • React์—์„œ๋Š” ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Object ๋ผ๊ณ  ์ •์˜.
  • Global State (์ „์—ญ ์ƒํƒœ) ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ด๋””์—์„œ๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ.
  • ๋˜ํ•œ ์ „์—ญ ์ƒํƒœ์˜ ๋ณ€ํ™”๋Š” ๊ณง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง์— ์ „๋ฐ˜์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์นจ.

โœ๏ธ Client State

  • UI ํ…Œ๋งˆ, ์‚ฌ์ด๋“œ๋ฐ”, ํผ ์ž…๋ ฅ ๋“ฑ๊ณผ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธ.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•ญ์ƒ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ์— ํ•ญ์ƒ ๋™๊ธฐ์ ์ธ ์ƒํƒœ๋ฅผ ๊ฐ€์ง.
  • local client state : ํผ ์ž…๋ ฅ, ์‚ฌ์ด๋“œ๋ฐ” ๊ฐ™์ด ํ•˜๋‚˜ ๋˜๋Š” ์ธ์ ‘ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” state.
  • global client state : ์–ธ์–ด, UI ํ…Œ๋งˆ (๋‹คํฌ ๋ชจ๋“œ) ์™€ ๊ฐ™์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” state.

โœ๏ธ Server State

  • ์œ ์ € DB ์ •๋ณด ๋“ฑ๊ณผ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ฅผ ์˜๋ฏธํ•จ.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ์— ํŠน์ • ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ. ์ด๋กœ ์ธํ•ด ๋น„๋™๊ธฐ์ ์ธ ์ƒํƒœ๋ฅผ ๊ฐ€์ง.
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ state๊ฐ€ ํ•ญ์ƒ ์ผ์น˜ํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์—์„œ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ.

๐Ÿชถ React-Query๋ž€?

react-query๋Š” ์„œ๋ฒ„ ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ, ์บ์‹ฑ, ๋™๊ธฐํ™” ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์นด์นด์˜คํŽ˜์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด react query๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ 

๐Ÿ™Œ ใ€Œif(kakao)2021 - ์นด์นด์˜คํŽ˜์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด React Query๋ฅผ ์„ ํƒํ•œ ์ด์œ ใ€ ์„ธ์ค„์š”์•ฝ ๐ŸคŸ
1. React Query๋Š” React Application์—์„œ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์บ์‹ฑํ•˜๋ฉฐ, ์ง€์†์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
2. ๋ณต์žกํ•˜๊ณ  ์žฅํ™ฉํ•œ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ React Component ๋‚ด๋ถ€์—์„œ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ๋” ๋‚˜์•„๊ฐ€ React Query์—์„œ ์ œ๊ณตํ•˜๋Š” ์บ์‹ฑ, Window Focus Refetching ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ API ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ๋ฒˆ์žกํ•œ ์ž‘์—… ์—†์ด โ€œํ•ต์‹ฌ ๋กœ์งโ€์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ๏ธ ์ด๊ฑธ ์™œ ์จ์•ผ ํ•˜๋Š”๊ฐ€?

1. React ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ fetching ํ•˜๊ฑฐ๋‚˜ update ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฐ์ž์˜ ๋ฐฉ์‹๋Œ€๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ fetching ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๊ณ„ํ•˜์˜€๋‹ค.
  • ๋ณดํ†ต์€ Custom Hook์„ ํ™œ์šฉํ•˜์—ฌ state์— ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, Redux ๊ฐ™์€ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธ๊ณ„๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

2. Client state์™€ Server state์˜ ์™„์ „ํ•œ ๋ถ„๋ฆฌ ๋ฅผ ์œ„ํ•จ์ด๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ server state์˜ ๊ฒฝ์šฐ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด state๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ API ํ˜ธ์ถœ์„ ํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋น„์šฉ ๋‚ญ๋น„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ๊ณต์œ ํ•˜๋ ค props drilling ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ์—, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ์—์„œ ์ธ๊ณ„๋ฐ›์€ server state๋ฅผ ๋งˆ์น˜ cache ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ์ ‘๊ทผ์ด ์šฉ์ดํ•ด์ง„๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ Redux ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์ž‘์—… (Redux-Saga) ์ด ํ•„์š”ํ•˜๊ณ , ์ด๋กœ ์ธํ•ด ๊ด€๋ จ ๋กœ์ง ๋ฐ ๋ชจ๋“ˆ์ด ๋น„๋Œ€ํ•ด์ง„๋‹ค.
  • react-query์˜ ๊ฒฝ์šฐ Server State์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์™„๋ฒฝํžˆ ๊ตฌ๋ถ„์ง€์–ด ์ œ๊ณตํ•˜๊ธฐ์—, Client State ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ด๋ฅผ ๋ถ„๋ฆฌํ•ด์ค€๋‹ค.

3. Server State ๋Š” ํ•ญ์ƒ ์ตœ์‹ ์˜ ์ƒํƒœ์ž„์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ, ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณด์œ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ์— ๋Œ€ํ•œ ์ด์œ ๋Š” ์•ž์„œ ๋งํ•œ server state์˜ ๋น„๋™๊ธฐ์ ์ธ ํŠน์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•œ ์‹œ๊ฐ„์˜ "์Šค๋ƒ…์ƒท" ์— ๋ถˆ๊ณผํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…์‹œ์ ์œผ๋กœ fetching์„ ํ•ด์ค˜์•ผ ์ตœ์‹ ์˜ ๋ฐ์ดํ„ฐ๋กœ ์ „ํ™˜๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ธฐ์—๋Š” ๋น„์šฉ์ด ํฌ๋‹ค.
  • react-query์˜ ๊ฒฝ์šฐ state์˜ ์ƒํƒœ๋ฅผ fresh, stale, inactive๋กœ ๊ตฌ๋ถ„์ง€์œผ๋ฉฐ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹จ์œ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ refetching ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

4. react-query๋ฅผ ํ†ตํ•ด Server state๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • react query์˜ ๊ฒฝ์šฐ ์•„๋ž˜์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ, ๋กœ์ง ๋˜ํ•œ ๋‹จ์ˆœํ•œ ์ถ•์— ์†ํ•œ๋‹ค.
  • ํ˜„์žฌ ๋ฐ์ดํ„ฐ๊ฐ€ fetching ๋˜์—ˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑ
  2. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋‹จ์ผ ์š”์ฒญ์œผ๋กœ ๋ณ€ํ™˜
  3. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹จ์—์„œ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ
  4. ๋ฐ์ดํ„ฐ๊ฐ€ ํ˜„์žฌ ์˜ค๋ž˜๋œ (stale) ์ƒํƒœ๋กœ ๋ณ€ํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธ.
  5. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , GC์— ์˜ํ•ด ์†Œ๊ฑฐ๋˜๋Š” ๊ณผ์ •๋„ ๊ด€์ฐฐ.

โœ’๏ธ What is Query?

โœ๏ธ React Query ์—์„œ ์ฟผ๋ฆฌ๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€?

  • Query๋Š” Server state๋ฅผ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜ (QueryFn) ๊ณผ ํ•จ๊ป˜ ๊ณ ์œ ํ•œ ํ‚ค (QueryKey) ๋กœ ๋งคํ•‘๋œ๋‹ค.
  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ์šฐ์—๋Š” useQuery, useInfiniteQuery Hook์„ ์“ด๋‹ค.
  • ๋‹จ, ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ์—๋Š” useMutation Hook์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

โœ๏ธ queryKey์™€ queryFn์— ๋Œ€ํ•˜์—ฌ.

  • queryKey ๋Š” refetch, caching ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ• ๋•Œ ์“ฐ์ด๋Š” ๊ณ ์œ ํ•œ ํ‚ค๋‹ค. v4 ๋ถ€ํ„ฐ๋Š” ๋ฐฐ์—ด๋กœ๋งŒ key๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.
  • queryFn ์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์“ฐ์ด๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๋ฐ˜๋“œ์‹œ Promise๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ ํ•œ๋‹ค.

๋‚ด ์ฝ”๋“œ์—์„œ ๋ณด๋Š” ๋ฆฌ์•กํŠธ์ฟผ๋ฆฌ ์ ์šฉ

const postQuery = useQuery({
  queryKey: ['postData', postId],
  queryFn: fetchPostData,
  enabled: !!postId, // postId๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
});
  • queryKey: ์ฟผ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ  ํ‚ค์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • queryFn: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • enabled: ํŠน์ • ์กฐ๊ฑด์—์„œ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š”/์ข‹์•„์š” ์ทจ์†Œ ๊ตฌํ˜„

์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด useMutation ํ›…์„ ์‚ฌ
์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌ

likeMutation๊ณผ dislikeMutation
์ข‹์•„์š” ์ถ”๊ฐ€ ๋ฐ ์ทจ์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฎคํ…Œ์ด์…˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
์„ฑ๊ณต ์‹œ ๊ด€๋ จ๋œ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•˜์—ฌ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

const likeMutation = useMutation({
  mutationFn: async () => {
    const response = await axios.post(
      `${IP_ADDRESS}/board/like`,
      { email: myEmail, postId: postId },
      {
        headers: {
          'Content-Type': 'application/json;charset=UTF-8',
          Accept: 'application/json',
          'Authorization-Access': accessToken,
        },
      }
    );
    return response.data;
  },
  onSuccess: () => {
    queryClient.invalidateQueries(['postData', postId]);
    queryClient.invalidateQueries(['likedPosts']);
  },
  onError: handleError,
});

const dislikeMutation = useMutation({
  mutationFn: async () => {
    const response = await axios.post(
      `${IP_ADDRESS}/board/dislike`,
      { email: myEmail, postId: postId },
      {
        headers: {
          'Content-Type': 'application/json;charset=UTF-8',
          Accept: 'application/json',
          'Authorization-Access': accessToken,
        },
      }
    );
    return response.data;
  },
  onSuccess: () => {
    queryClient.invalidateQueries(['postData', postId]);
    queryClient.invalidateQueries(['likedPosts']);
  },
  onError: handleError,
});

onSuccess ์˜ต์…˜์€ ๋ฎคํ…Œ์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋œ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” queryClient.invalidateQueries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”(invalidate)

  • ๋ฌดํšจํ™”๋œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ ๋ฒˆ์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋‚˜ ์ฟผ๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ํŽ˜์นญ๋ฉ๋‹ˆ๋‹ค.
onSuccess: () => {
  queryClient.invalidateQueries(['postData', postId]);
  queryClient.invalidateQueries(['likedPosts']);
}

queryClient.invalidateQueries
์ด ํ•จ์ˆ˜๋Š” ์ง€์ •๋œ ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌดํšจํ™”๋œ ์ฟผ๋ฆฌ๋Š” ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋‹ค์‹œ ํŽ˜์นญ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

queryClient.invalidateQueries(['postData', postId])

  • ['postData', postId] ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ฒฝ์šฐ, ๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€์— ์ข‹์•„์š”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ทจ์†Œํ•˜๋ฉด, ๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธ ์ •๋ณด๋„ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

queryClient.invalidateQueries(['likedPosts'])

  • ['likedPosts'] ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ข‹์•„์š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ์ด ๋ชฉ๋ก๋„ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฌดํšจํ™”์˜ ํšจ๊ณผ

๋ฌดํšจํ™”๋œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ ๋ฒˆ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ํŽ˜์นญ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๊ธ€์— ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ:

  1. postData ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•˜๋ฉด, ๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ํŽ˜์นญ๋˜์–ด ๊ฐฑ์‹ ๋œ ์ข‹์•„์š” ์ˆ˜๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

2.likedPosts ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•˜๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์ด ๋‹ค์‹œ ํŽ˜์นญ๋˜์–ด ๊ฐฑ์‹ ๋œ ๋ชฉ๋ก์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

mutate

mutate๋Š” ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ์˜ useMutation ํ›…์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜
์ •์˜๋œ ๋ฎคํ…Œ์ด์…˜(๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ) ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐ(์‹คํ–‰)ํ•ฉ๋‹ˆ๋‹ค. mutate ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•  ๋•Œ ํŠน์ • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

toggleLike ํ•จ์ˆ˜์—์„œ์˜ mutate ์‚ฌ์šฉ

  • toggleLike ํ•จ์ˆ˜๋Š” ์ข‹์•„์š” ์ƒํƒœ๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” Liked ์ƒํƒœ์— ๋”ฐ๋ผ ์ข‹์•„์š”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ทจ์†Œํ•˜๋Š” ๋ฎคํ…Œ์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  1. Liked๊ฐ€ true์ธ ๊ฒฝ์šฐ, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ๋ผ๋ฉด, dislikeMutation.mutate()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ข‹์•„์š”๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
  2. Liked๊ฐ€ false์ธ ๊ฒฝ์šฐ, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ง ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด, likeMutation.mutate()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ข‹์•„์š”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
const toggleLike = () => {
  if (Liked) {
    dislikeMutation.mutate(); // ์ข‹์•„์š” ์ทจ์†Œ ๋ฎคํ…Œ์ด์…˜ ์‹คํ–‰
  } else {
    likeMutation.mutate(); // ์ข‹์•„์š” ์ถ”๊ฐ€ ๋ฎคํ…Œ์ด์…˜ ์‹คํ–‰
  }
};

useMutation์˜ ๋ฐ˜ํ™˜ ๊ฐ’

  • mutate: ๋ฎคํ…Œ์ด์…˜์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • mutateAsync: ๋ฎคํ…Œ์ด์…˜์„ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜๋กœ, Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • isLoading: ๋ฎคํ…Œ์ด์…˜์ด ์‹คํ–‰ ์ค‘์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • isError: ๋ฎคํ…Œ์ด์…˜์ด ์‹คํŒจํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • isSuccess: ๋ฎคํ…Œ์ด์…˜์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • error: ๋ฎคํ…Œ์ด์…˜์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • data: ๋ฎคํ…Œ์ด์…˜์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

(์•„์ง... ๋” ๋‚ด์šฉ ์ถ”๊ฐ€ํ•ด์•ผํ•จ..

0๊ฐœ์˜ ๋Œ“๊ธ€