WEB/React

[ React ] useQuery ์™€ useMuataion๋ฅผ ํ™œ์šฉํ•œ ๊ธฐ๋Šฅ๊ฐœ์„ 

Happhee.dev 2023. 11. 30. 13:56

 

๐Ÿ’ก ๋“ค์–ด๊ฐ€๊ธฐ

์–ด๋–ค ๊ฒฝ์šฐ์— useQuery์™€ useMutation ์‚ฌ์šฉํ•˜๋Š”์ง€,

๋˜ ํƒ€์ž… ์ง€์ •์˜ ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์‚ดํŽด๋ณด๋ฉด์„œ ๊ธฐ๋Šฅ๊ฐœ์„ ์„ ํ•œ ์ž‘์—…์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๋ ค ํ•œ๋‹ค.


 

โœ… useQuery

react ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ชจ๋‘๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” fetching, caching, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ์™€์˜ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ผ ๊ฒƒ์ด๋‹ค.

useQuery์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

export declare function useQuery<
	TQueryFnData = unknown, 
    TError = unknown, 
    TData = TQueryFnData, 
    TQueryKey extends QueryKey = QueryKey>
    (queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, 
    options?: Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 
    'queryKey' | 'queryFn' | 'initialData'> & {
    initialData?: () => undefined;
}): UseQueryResult<TData, TError>;

 

  • TQueryFnData ๐Ÿ‘‰  useQuery ๋กœ ์‹คํ–‰ํ•˜๋Š” query function์˜ return ๊ฐ’์„ ์ •ํ•˜๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…
  • TError ๐Ÿ‘‰ query์˜ error ํ˜•์‹์„ ์ •ํ•˜๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…
  • TData ๐Ÿ‘‰ data์— ๋‹ด๊ธฐ๋Š” ์‹ค์งˆ์  type, query function์˜ ๋ฐ์ดํ„ฐ๋ฅผ 2์ฐจ ๊ฐ€๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…
  • TQueryKey ๐Ÿ‘‰ useQuery์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ๋Š” queryKey์˜ ํƒ€์ž…

 

 

์ฟผ๋ฆฌํ‚ค์˜ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํƒ€์ž… ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

type QueryKey = string | readonly unknown[];
// queryKey๋Š” string ํ˜น์€ array ํ˜•์‹
// ํ•˜์ง€๋งŒ query function์— ์ „๋‹ฌ ๋ฐฉ์‹์€ ํ•ญ์ƒ array ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ
// string => [string]

 

๊ทธ๋ž˜์„œ querykey์˜ ํƒ€์ž…์„ ๊ฐ ๋ฐฐ์—ด๋งˆ๋‹ค ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐˆ์ง€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  function์— ๋„˜๊ฒจ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

useQuery<
    unknown,
    ErrorType,
    void,
    // โœ… query key ์ˆœ์„œ๋Œ€๋กœ ํƒ€์ž… ์ง€์ •ํ•˜๊ธฐ
    [string, string, number | undefined]
  >

 

 

๋ณต์ˆ˜์˜ ์ฟผ๋ฆฌํ‚ค์— ๋Œ€์‘ํ•ด์„œ query key์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.


 

โœ… useMuataion

useMutation์„ ํ†ตํ•ด data๋ฅผ POST, PUT, UPDATE, DELETE ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, useQuery์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ , ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ƒํ™ฉ ๋ณ„ ๋ถ„๊ธฐ ์„ค์ •์ด ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ฒƒ์ด ์ฐจ์ด์ ์ด๋‹ค.

 

useMutation์˜ ํƒ€์ž…์„ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

export declare function useMutation<
  TData = unknown,
  TError = unknown,
  TVariables = void,
  TContext = unknown,
>(
  options: UseMutationOptions<TData, TError, TVariables, TContext>,
): UseMutationResult<TData, TError, TVariables, TContext>;

 

  • TData ๐Ÿ‘‰ mutation ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ํƒ€์ž…, onSuccess, data๋กœ ํ™œ์šฉ
  • TError ๐Ÿ‘‰ mutation ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์—๋Ÿฌ ๊ฒฐ๊ณผ ํƒ€์ž…, onError, error๋กœ ํ™œ์šฉ
  • TVariabales  ๐Ÿ‘‰ mutate ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ์ธ์ž๋ฅผ ์ง€์ •ํ•˜๋Š” generic ํƒ€์ž…
  • TContext  ๐Ÿ‘‰ mutate ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰ ์ „์— ์ˆ˜ํ–‰๋˜๋Š” onMutate callback์˜ ๋ฆฌํ„ด ํƒ€์ž…

 

์ด๋ ‡๊ฒŒ query์™€ mutation ๋‚ด๋ถ€์˜ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜๋ฉด, onSuccess / onError / mutate ๋“ฑ๋“ฑ ๋ถ„๊ธฐ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ 

๋ช…ํ™•ํ•œ ํƒ€์ž…์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ฆ‰, ๋น„๋™๊ธฐ ์ƒํƒœ๋“ค์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ž์„ธํ•œ ํƒ€์ž… ์˜ˆ์ œ๋“ค์€ React query - ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.


 

๐ŸŒŸ ์ƒˆ๋กœ์šด ์›น ํ™˜๊ฒฝ ๋กœ๊ทธ์ธ ์•Œ๋ฆผ ๊ฐœ์„  ์ž‘์—…

์ค‘๊ณ ๋‚˜๋ผ ์›น๋กœ๊ทธ์ธ ์•Œ๋ฆผํ†ก ๊ฐœ์„ ์‚ฌํ•ญ ์ž‘์—…์œผ๋กœ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ํŽ˜์ด์ง€๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด์„œ useQuery์™€ useMutation์˜ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์ž‘์—…ํ•˜์˜€๋‹ค. 

๐Ÿ“๋ฌธ์ œ ์ƒํ™ฉ

์ค‘๊ณ ๋‚˜๋ผ ์›น ๊ฑฐ๋ž˜ ๊ธฐ๋Šฅ ์˜คํ”ˆ ๋‹น์‹œ, ์ค‘๊ณ ๋‚˜๋ผ ์›น ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด ์นด์นด์˜คํ†ก์œผ๋กœ ์•Œ๋ฆผํ†ก์ด ๋ฐœ์†ก๋˜๋Š” ๊ธฐ๋Šฅ์„ ์˜คํ”ˆํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„ ๋‹จ์ˆœํžˆ ์›น ๋กœ๊ทธ์ธ๋งŒ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ์•Œ๋ฆผํ†ก์ด ๋ฐœ์†ก๋˜์—ˆ๊ธฐ์— ํ•˜๋ฃจ ์•ฝ 1300๊ฑด ์ „์†ก๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถˆํŽธํ•จ์„ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์— ๊ณผ๋น„์šฉ๊นŒ์ง€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ–ˆ๋‹ค.

 โณ ํ”Œ๋กœ์šฐ

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์•ฑ ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์•ฑ ํ‘ธ์‹œ๋กœ ์›น ๋กœ๊ทธ์ธ ์•Œ๋ฆผ ์ „์†ก ์ง„ํ–‰
  2. ์•ฑ ํ‘ธ์‹œ ์š”์ฒญ์— ์„ฑ๊ณต์‹œ, ํ•ด๋‹น ๋กœ๊ทธ์ธ ์‹œ๊ฐ„ ํ‘œ์‹œ ํ›„ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ๋กœ ๋กœ๊ทธ์•„์›ƒ ์š”์ฒญ ์ฒ˜๋ฆฌ
  3. ์•ฑ ํ‘ธ์‹œ ์š”์ฒญ์— ์‹คํŒจ
    1. ์ตœ๊ทผ ์ ‘์† ๊ธฐ๋ก 5๊ฑด ์ฒดํฌ
    2. ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์ ‘์† ์ •๋ณด์™€ ์ด๋ ฅ์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ์•Œ๋ฆผํ†ก ์ „์†ก 
    3. ๊ฐ™๋‹ค๋ฉด, ์•Œ๋ฆผํ†ก ๋ฏธ์ „์†ก

๋”ฐ๋ผ์„œ ์ƒํ™ฉ์€ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. 

์•Œ๋ฆผํ†ก / ์•ฑํ‘ธ์‹œ ๋ถ„๊ธฐ์ฒ˜

 

  1. ์•Œ๋ฆผํ†ก์œผ๋กœ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ์‹œํ‚ค๊ธฐ  ๐Ÿ‘‰ user seq๋งŒ params์œผ๋กœ ๋“ค์–ด์˜ด
    • ์•Œ๋ฆผํ†ก ๋‚ด๋ถ€์˜ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ํด๋ฆญ
    • ์ค‘๊ณ ๋‚˜๋ผ ์›น์‚ฌ์ดํŠธ๋กœ ์ด๋™๋˜๋ฉด์„œ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ์ง„ํ–‰ or ๋กœ๊ทธ์ธ ๋งŒ๋ฃŒ ์•ˆ๋‚ด
    • ํ™ˆ์œผ๋กœ ์ด๋™
  2. ์•ฑํ‘ธ์‹œ๋กœ ๋กœ๊ทธ์ธ ์‹œ๊ฐ„ ํ™•์ธ ํ›„ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ์‹œํ‚ค๊ธฐ ๐Ÿ‘‰ user seq, date๊ฐ€ params์œผ๋กœ ๋“ค์–ด์˜ด
    • ์•ฑํ‘ธ์‹œ ์•Œ๋ฆผ ํด๋ฆญ 
    • ์™ธ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๋กœ ์›น์ด ์—ด๋ฆฌ๋ฉด์„œ ๋กœ๊ทธ์ธํ•œ ์‹œ๊ฐ„ ์•ˆ๋‚ด ๋ฐ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ๋…ธ์ถœ
    • ํ•ด๋‹น ๋ฒ„ํŠผ ํด๋ฆญ์‹œ, ๋กœ๊ทธ์•„์›ƒ or ๋กœ๊ทธ์ธ ๋งŒ๋ฃŒ ์ง„ํ–‰
    • ํ™ˆ์œผ๋กœ ์ด๋™

 

์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์•„์›ƒ์„ ์ง„ํ–‰ํ•˜๋Š” api ํ˜ธ์ถœ ๊ฒฝ๋กœ๋Š” ๋™์ผํ•˜๋‹ค.

๋‹ค๋งŒ, 1๋ฒˆ์˜ ๊ฒฝ์šฐ ์›นํŽ˜์ด์ง€๋กœ ๋“ค์–ด์˜ค์ž๋งˆ์ž ํ†ต์‹  ์š”์ฒญ์ด ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๊ณ  2๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ํ†ต์‹  ์š”์ฒญ์ด ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ฐจ์ด์ ์ด์—ˆ๋‹ค.

 

๐Ÿ”ฅ  ์‹œํ–‰ ์ฐฉ์˜ค /  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€

๊ฐ™์€ ํŽ˜์ด์ง€ ๋‚ด์—์„œ params์˜ date์˜ ์กด์žฌ ์—ฌ๋ถ€๋กœ ํ•ด๋‹น api์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•

 

๋กœ๊ทธ์•„์›ƒ์„ ์ง„ํ–‰ํ•˜๋Š” api๋ฅผ ํ˜ธ์ถœํ• ๋•Œ, useQuery๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ธฐ์— ํ•ด๋‹น ์กฐ๊ฑด์œผ๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ๋ชจ๋‹ฌ์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๊ธด ํ–ˆ๋‹ค.

 

โ—๏ธ ๋‹ค๋งŒ, useQuery์•ˆ์—์„œ์˜ ์กฐ๊ฑด ๋ถ„๊ธฐ & onSuccess์— ๋Œ€ํ•œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ & ๋กœ๊ทธ์ธ ๋งŒ๋ฃŒ ๋ชจ๋‹ฌ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ๋“ฑ๋“ฑ โ—๏ธ

ํ•œ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์กฐ๊ฑด ๋ถ„๊ธฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ถˆํŽธํ•จ๊ณผ ์ฟผ๋ฆฌ ์•ˆ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ์˜ ๊นŒ๋‹ค๋กœ์›€์œผ๋กœ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ์ž˜๋ชป๋จ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์Œ์ด ๋„์ถœ๋˜์—ˆ๋‹ค.

ํŽ˜์ด์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ 1๋ฒˆ์€ useQuery๋กœ, 2๋ฒˆ์€ useMutation์„ ํ™œ์šฉํ•˜์—ฌ api ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1๋ฒˆ์˜ ๊ฒฝ์šฐ, ํŽ˜์ด์ง€ ์ง„์ž…์‹œ ์ž๋™์œผ๋กœ useQuery๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ๊ฒฐ๊ณผ ๊ฐ’์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.

2๋ฒˆ์˜ ๊ฒฝ์šฐ, params์œผ๋กœ๋ถ€ํ„ฐ date๋ฅผ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ๋กœ๊ทธ์ธ ์‹œ๊ฐ„์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ , button์˜ ์ด๋ฒคํŠธ๋กœ mutate๋ฅผ ์ž‘๋™์‹œํ‚ฌ๋•Œ

๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ์„ ์‹œํ‚จํ›„ ๋ฉ”์ธ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

 

์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์›น ๋กœ๊ทธ์ธ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜์˜€๋‹ค.

๐Ÿ–ฅ๏ธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง

์ด์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ useQuery, useMutation์˜ ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด ์•ˆ์ •์„ฑ์„ ๊ฐ•ํ™”์‹œ์ผฐ๋‹ค.

 

๋จผ์ €, ํƒ€์ž… ์ง€์ •์˜ ์ „ useMutation์„ ์‚ดํŽด๋ณด์ž.

export const useLogoutAppPushMutaion = (
  key: string,
) => {

  return useMutation(
    ['app-push-logout', userKey],
    () => {
      return postLogOut(userKey);
    },
    {
      onSuccess: () => {
      	...
      },
      onError: (err) => {
      			// โ—๏ธ err๋Š” unknownํ˜•์‹์ž…๋‹ˆ๋‹ค.
        const errorMeta = err.response.data.meta;
        ...
      },
    },
  );
};

 

์•ž์„œ ํฌ์ŠคํŒ…ํ•œ [ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์—์„œ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผํ•˜๋Š” JS - Typescript ] ์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด unknownํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํƒ€์ž… ์ขํžˆ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ err์— ๋Œ€ํ•œ ํƒ€์ž… ์ขํžˆ๊ธฐ ์ด์ „์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํƒ€์ž…์ง€์ •์„ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์Œ์„ ์‚ดํŽด๋ณด์ž.

export const useLogoutAppPushMutaion = (
  key: string,
  			// โœ… ErrorType์„ ์ง€์ •
): UseMutationResult<unknown, ErrorType, void>  => {

  return useMutation(
    ['app-push-logout', userKey],
    () => {
      return postLogOut(userKey);
    },
    {
      onSuccess: () => {
      	...
      },
      onError: (err) => {
      	// โœ… err์˜ type ๐Ÿ‘‰ ErrorType
        const errorMeta = err.response.data.meta;
        ...
      },
    },
  );
};

 

mutation์˜ ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•ด์คŒ์œผ๋กœ์จ onError๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” err ๊ฐ์ฒด์— ํƒ€์ž… ์ขํžˆ๊ธฐ ์—†์ด ๋ฐ”๋กœ ErrorType์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

 

๐ŸŒˆ ์ •๋ฆฌํ•˜๊ธฐ

๊ทธ๋™์•ˆ react query์˜ ๊ธฐ๋Šฅ๋งŒ์„ ์‚ฌ์šฉํ•  ๋ฟ, ์ •ํ™•ํ•œ ํƒ€์ž…์ง€์ • ์—†์ด ๊ฐœ๋ฐœํ–ˆ๋˜ ๊ฒƒ์ด ์•ˆ์ •์„ฑ์— ์ทจ์•ฝํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•ด๋‹น ํŠน์ง•์„ ์›น์‚ฌ์ดํŠธ์— ์ ์šฉ์‹œ์ผœ ์บ์‹ฑ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ˆ์ •์„ฑ์„ ๋†’์ธ ์‚ฌ์ดํŠธ๋กœ ๋งŒ๋“ค์–ด๊ฐ€๋ณด๋ ค๊ณ  ํ•œ๋‹ค.