๐Ÿ”ฅ Trouble Shooting - Tanstack Query์—์„œ data.data ์ค‘์ฒฉ ๋ฌธ์ œ

์Š˜ยท2025๋…„ 3์›” 3์ผ

๐Ÿ”ฅ Trouble Shooting

๋ชฉ๋ก ๋ณด๊ธฐ
9/23

๐Ÿšจ ๋ฌธ์ œ ์ƒํ™ฉ

Tanstack Query์˜ useQuery๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๊ฐ€ data.data์™€ ๊ฐ™์ด ์ค‘์ฒฉ๋˜์–ด ์žˆ์—ˆ๋‹ค.

๐Ÿ’ป ๋ฌธ์ œ ๋ฐœ์ƒ ์ฝ”๋“œ

// getProductDetail ํ•จ์ˆ˜
const getProductDetail = async (productId) => {
  const { data, error } = await supabase
    .from('products')
    .select('*')
    .eq('id', productId)
    .single();

  if (error) throw error;
  return { data, error }; // ๋ฌธ์ œ์˜ ์›์ธ!
};

๐Ÿค” ์›์ธ ๋ถ„์„ - "return { data, error };"๊ฐ€ ์•ˆ ๋˜๋Š” ์ด์œ 

return { data, error }; ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ๋Š” ์ด์ค‘ ๋ž˜ํ•‘(double wrapping) ๋•Œ๋ฌธ์ด๋‹ค:

  1. Supabase ์‘๋‹ต ๊ตฌ์กฐ: Supabase๋Š” ์ด๋ฏธ ์‘๋‹ต์„ { data, error } ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•จ
  2. ์ˆ˜๋™ ๋ž˜ํ•‘: return { data, error };๋กœ ํ•œ ๋ฒˆ ๋” ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ฐ์‹ธ์คŒ
  3. React Query ๋ž˜ํ•‘: React Query๋Š” ์ฟผ๋ฆฌ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ž๋™์œผ๋กœ data ์†์„ฑ์— ๋„ฃ์Œ

์ด ์„ธ ๋‹จ๊ณ„๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์ฒฉ ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋จ:

// ์ตœ์ข… ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
{
  data: {        // ์ž๋™ ์ƒ์„ฑ
    data: {      // getProductDetail์—์„œ ์ˆ˜๋™์œผ๋กœ ๊ฐ์‹ผ ๋ถ€๋ถ„
      id: 1,     // ์‹ค์ œ Supabase ๋ฐ์ดํ„ฐ
      title: "์ƒํ’ˆ๋ช…"
      // ...
    },
    error: null  // getProductDetail์—์„œ ์ˆ˜๋™์œผ๋กœ ๊ฐ์‹ผ ๋ถ€๋ถ„
  }
}

์ด ๊ตฌ์กฐ์—์„œ ์ƒํ’ˆ๋ช…์— ์ ‘๊ทผํ•˜๋ ค๋ฉด data.data.title์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ด์•ผ ํ•จ

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

getProductDetail ํ•จ์ˆ˜์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ž˜ํ•‘์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •:

export const getProductDetail = async (productId) => {
  const { data, error } = await supabase
    .from('products')
    .select('*')
    .eq('id', productId)
    .single();

  if (error) throw error;
  return data; // ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜
};

๐Ÿ“ ๋ฐฐ์šด ์ 

  1. Tanstack Query์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ดํ•ด:

    • Tanstack Query๋Š” ์ฟผ๋ฆฌ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ data ์†์„ฑ์— ์ž๋™์œผ๋กœ ๋„ฃ์Œ
    • ์ด๋ฏธ { data, error } ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ค‘์ฒฉ ๋ฐœ์ƒ
  2. API ์‘๋‹ต ์ฒ˜๋ฆฌ์˜ ์˜ฌ๋ฐ”๋ฅธ ํŒจํ„ด:

    • ์„ฑ๊ณต ์‹œ: ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜ (return data;)
    • ์‹คํŒจ ์‹œ: ์—๋Ÿฌ๋ฅผ throw (throw error;)

๐Ÿ’ก ์ถ”๊ฐ€ TIP

Supabase๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‹ค์Œ ํŒจํ„ด์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋‹ค:

const someApiFunction = async () => {
  const { data, error } = await supabase.from('table').select('*');
  
  if (error) throw error; // Tanstack Query์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ™œ์šฉ
  return data;            // ๋ฐ์ดํ„ฐ๋งŒ ๊น”๋”ํ•˜๊ฒŒ ๋ฐ˜ํ™˜
};

์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด Tanstack Query์™€ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๊น”๋”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค!

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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