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 }; ์ฝ๋๊ฐ ๋ฌธ์ ๊ฐ ๋๋ ์ด์ ๋ ์ด์ค ๋ํ(double wrapping) ๋๋ฌธ์ด๋ค:
{ data, error } ํํ๋ก ๋ฐํํจreturn { data, error };๋ก ํ ๋ฒ ๋ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ฐ์ธ์ค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; // ๋ฐ์ดํฐ๋ง ๋ฐํ
};
Tanstack Query์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ์ ์ดํด:
data ์์ฑ์ ์๋์ผ๋ก ๋ฃ์{ data, error } ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๊ฐ์ ๋ฐํํ๋ฉด ์ค์ฒฉ ๋ฐ์API ์๋ต ์ฒ๋ฆฌ์ ์ฌ๋ฐ๋ฅธ ํจํด:
return data;)throw error;)Supabase๋ฅผ ์ฌ์ฉํ ๋๋ ๋ค์ ํจํด์ด ๊ฐ์ฅ ํจ์จ์ ์ด๋ค:
const someApiFunction = async () => {
const { data, error } = await supabase.from('table').select('*');
if (error) throw error; // Tanstack Query์ ์๋ฌ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ ํ์ฉ
return data; // ๋ฐ์ดํฐ๋ง ๊น๋ํ๊ฒ ๋ฐํ
};
์ด ํจํด์ ์ฌ์ฉํ๋ฉด Tanstack Query์ ์ ์ด์ธ๋ฆฌ๋ ๊น๋ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ป์ ์ ์๋ค!