24.09.22

๊ฐ•์—ฐ์ฃผยท2024๋…„ 9์›” 22์ผ

๐Ÿ“š TIL

๋ชฉ๋ก ๋ณด๊ธฐ
43/186

๐Ÿฅน ํ• ์ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ์“ฐ๋Š” ๊ฒƒ โ‰  ์‹ค์ œ๋กœ ๊ทธ ์ผ์„ ํ•˜๋Š” ๊ฒƒ

  • โ˜‘๏ธ useQuery vs useEffect ์ฝ”๋“œ ๋น„๊ต
  • useQuery ๊ณต๋ถ€

useQuery๋Š” React Query์˜ ํ•ต์‹ฌ ํ›…์œผ๋กœ, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์นญํ•˜๊ณ  ์บ์‹ฑ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ›…์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌํŽ˜์นญํ•˜๊ฑฐ๋‚˜ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

useQuery์˜ ์ฃผ์š” ๋ฌธ๋ฒ•๊ณผ ์‚ฌ์šฉ ๋ฐฉ์‹:
1. ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•: useQuery(queryKey, queryFn, options)
queryKey: ์ฟผ๋ฆฌ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์บ์‹œ์—์„œ ์ด ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
queryFn: ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์นญํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ฃผ๋กœ ์„œ๋ฒ„๋‚˜ API๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
options: ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์ œ์–ดํ•˜๋Š” ๋‹ค์–‘ํ•œ ์„ค์ •์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ: ๋กœ๋”ฉ ์ค‘์ธ ์ƒํƒœ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ์„ฑ๊ณต ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ๋“ฑ)
2. data, error, isLoading
useQuery๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

data: ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
error: ์ฟผ๋ฆฌ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
isLoading: ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด false๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๋ช…:
์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ปค์Šคํ…€ ํ›… (useUserData) ์˜ˆ์‹œ:

const {
  data: user, // ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ user ๋ณ€์ˆ˜์— ์ €์žฅ
  error: userError, // ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€
  isLoading: userLoading // ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ true, ๋กœ๋”ฉ ์™„๋ฃŒ ์‹œ false
} = useQuery('user', fetchUserAuth, { // 'user'๋ผ๋Š” ํ‚ค๋กœ ์ฟผ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, fetchUserAuth ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์น˜
  onSuccess: (user) => {
    if (user) {
      setUserId(user.id); // ์ฟผ๋ฆฌ ์„ฑ๊ณต ์‹œ ์ „์—ญ ์ƒํƒœ๋กœ userId๋ฅผ ์ €์žฅ
      setEmail(user.email ?? null); // ์ฟผ๋ฆฌ ์„ฑ๊ณต ์‹œ ์ด๋ฉ”์ผ ์ €์žฅ
    }
  }
});

์„ค๋ช…:
'user': ์ฟผ๋ฆฌ์˜ ๊ณ ์œ  ํ‚ค์ž…๋‹ˆ๋‹ค. useQuery๋Š” ์ด ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ 'user'๋ผ๋Š” ํ‚ค๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์„œ๋ฒ„์— ๋‹ค์‹œ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

fetchUserAuth: ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. supabase.auth.getUser๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ธ์ฆ๋œ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

onSuccess ์˜ต์…˜:

์„ฑ๊ณต ์‹œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ›„, ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด setUserId์™€ setEmail์„ ํ˜ธ์ถœํ•˜์—ฌ ์œ ์ €์˜ ID์™€ ์ด๋ฉ”์ผ์„ ์ „์—ญ ์ƒํƒœ(Zustand)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๋‹‰๋„ค์ž„์„ ๊ฐ€์ ธ์˜ค๋Š” ์ปค์Šคํ…€ ํ›… (useUserNickname) ์˜ˆ์‹œ:

const {
  data: nickname, // ํŽ˜์นญ๋œ ๋‹‰๋„ค์ž„
  error: nicknameError, // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€
  isLoading: nicknameLoading // ๋‹‰๋„ค์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ true, ๋กœ๋”ฉ ์™„๋ฃŒ ์‹œ false
} = useQuery(['nickname', userId], fetchNickname, {
  enabled: !!userId, // userId๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰
  onSuccess: (nickname) => {
    setNickname(nickname ?? ''); // ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ๋‹‰๋„ค์ž„์„ ์ „์—ญ ์ƒํƒœ์— ์ €์žฅ
  }
});

์„ค๋ช…:
['nickname', userId]: ์ฟผ๋ฆฌ ํ‚ค๋กœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์€ ์œ ์ €์˜ userId์™€ ์—ฐ๊ฒฐ๋œ ๋‹‰๋„ค์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์ผํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ๋‹‰๋„ค์ž„์„ ์š”์ฒญํ•˜๋ฉด, ์ด๋ฏธ ํŽ˜์นญ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
fetchNickname: ๋‹‰๋„ค์ž„์„ ํŽ˜์นญํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Supabase์˜ users ํ…Œ์ด๋ธ”์—์„œ nickname ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

enabled ์˜ต์…˜:

!!userId: userId๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, userId๊ฐ€ null ๋˜๋Š” undefined์ผ ๋•Œ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
onSuccess ์˜ต์…˜:

์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด setNickname์„ ํ†ตํ•ด ๋‹‰๋„ค์ž„์„ ์ „์—ญ ์ƒํƒœ(Zustand)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๋ ˆ๋ฒจ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” ์ปค์Šคํ…€ ํ›… (useUserLevel) ์˜ˆ์‹œ:

const {
  data: levelName,
  error: levelNameError,
  isLoading: levelLoading
} = useQuery(['levelName', userId], fetchLevelName, {
  enabled: !!userId, // userId๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰
  onSuccess: (levelName) => {
    setLevelName(levelName ?? ''); // ์„ฑ๊ณต ์‹œ ๋ ˆ๋ฒจ ์ด๋ฆ„์„ ์ „์—ญ ์ƒํƒœ์— ์ €์žฅ
  }
});

์„ค๋ช…:
['levelName', userId]: ์ฟผ๋ฆฌ ํ‚ค๋กœ userId์™€ ์—ฐ๊ฒฐ๋œ ๋ ˆ๋ฒจ ์ด๋ฆ„์„ ์บ์‹ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ๋ ˆ๋ฒจ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ userId์— ๋Œ€ํ•œ ์บ์‹œ๊ฐ€ ๋”ฐ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
fetchLevelName: ์œ ์ €์˜ ๋ ˆ๋ฒจ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

users ํ…Œ์ด๋ธ”์—์„œ level_id๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ level ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ๋ฒจ ์ด๋ฆ„์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
enabled:

userId๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
์ถœ์„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ปค์Šคํ…€ ํ›… (useUserAttendance) ์˜ˆ์‹œ:

const {
  data: attendance,
  error: attendanceError,
  isLoading: attendanceLoading
} = useQuery(['attendance', userId], fetchAttendance, {
  enabled: !!userId, // userId๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ฟผ๋ฆฌ ์‹คํ–‰
  onSuccess: (attendance) => {
    setAttendance(attendance ?? 0); // ์„ฑ๊ณต ์‹œ ์ถœ์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ ์ƒํƒœ์— ์ €์žฅ
  }
});

์„ค๋ช…:
['attendance', userId]: ์ฟผ๋ฆฌ ํ‚ค๋กœ ์œ ์ €์˜ ์ถœ์„ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. userId๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ๊ฐ์˜ ์บ์‹œ๊ฐ€ ๋ณ„๋„๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

fetchAttendance: users ํ…Œ์ด๋ธ”์—์„œ attendance ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

enabled:

userId๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ œ์–ดํ•˜์—ฌ ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
onSuccess:

์ถœ์„ ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”์„ ๋•Œ ์ „์—ญ ์ƒํƒœ์— ์ถœ์„ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ฒฐ๋ก :
useQuery๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ์บ์‹ฑ, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ ๊ด€๋ฆฌ, ์„ฑ๊ณต ์‹œ ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ useQuery๋Š” ๊ฐ์ข… ์œ ์ € ๋ฐ์ดํ„ฐ(๋‹‰๋„ค์ž„, ๋ ˆ๋ฒจ, ์ถœ์„ ํšŸ์ˆ˜ ๋“ฑ)๋ฅผ ๊ฐ€์ ธ์™€ ์บ์‹ฑํ•˜๊ณ , zustand๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ๋ฆ„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ ๊ทผ๋ฐ ์œ„ ์ฝ”๋“œ ์—๋Ÿฌ๋‚œ๋‹ค๊ณ ์š”ใ… ใ… ใ… ใ… ใ… ใ… 
1. zustand ์‚ฌ์šฉ โžก๏ธ useQuery๋กœ ์ˆ˜์ • ํ•„์š”
2. ์ธ์ž๋ฅผ 3๊ฐœ ๋ฐ›๊ณ  ์žˆ๋‹ค, overload ๋งค์นญ์ด ์•ˆ ๋œ๋‹ค โžก๏ธ useQuery()์˜ ์ธ์ž๊ฐ€ ๊ฐ์ฒด ํ˜•ํƒœ์ธ ๋ถ€๋ถ„์„ ์ธ์‹ํ•˜๋Š” ๋ฐ์„œ ์ƒ๊ธด ๋ฌธ์ œ์ด๋ฏ€๋กœ
queryKey, queryFn์„ ๋ช…์‹œ์ ์œผ๋กœ ์จ์„œ ์ˆ˜์ • ํ•„์š”

profile
์•„๋ฌดํŠผ, ๊ฐœ๋ฐœ์ž

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