yarn add @supabase/supabase-js
앞서 생성한 프로젝트에서 Setting - API에서 Project URL과 API keys를 가져온다.
(내가 필요한 프로젝트 이름에 맞는 지 확인!)
key가 노출되지 않도록 .env 파일에 저장해준다.
이렇게 URL과 API key를 변수로 만들어 준 뒤
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = process.env.REACT_APP_SUPABASE_URL as string
const supabaseKey = process.env.REACT_APP_SUPABASE_KEY as string
// Supabase client
const supabase = createClient(supabaseUrl, supabaseKey);
export {supabase}
import { supabase } from '../../../utils/SupabaseClient';
type ProductsPost = {
id:string,
post_user: string,
nickname: string,
created_at: string,
title: string,
contents: string,
price: number,
count: number,
tags: string[],
location: string,
dealType: string,
like_user: {uid:string, }[],
likes: number,
quality: string,
changable: boolean,
shipping_cost: boolean,
agreement: boolean,
};
가져오는 로직은 친절하게도 Supabase 홈페이지 내에서 찾을 수 있다.
설정 위에 API Docs를 누르고 Tables and Views의 products를 눌러주면 아래와 같이 원하는 로직을 가져올 수 있다. 나는 모든 행을 다 가져올 수 있도록 첫 번째 로직 선택!
useEffet를 사용하여 getProducts 함수를 마구잡이로 호출하지 않도록 빈 배열을 넣어주고
async/await를 사용하여 데이터를 불러온다. (data에 이름은 굳이 따로 붙여주지 않았다.)
if (data != null)을 넣어 null이 아닐 경우에만 변경하도록 해준다.
const ProductList = () => {
const [products, setProducts] = useState<ProductsPost[]>([]);
useEffect(() => {
getProducts();
}, [])
const getProducts = async () => {
try {
const { data, error } = await supabase
.from('products')
.select('*')
if (error) throw error;
if (data != null) {
setProducts(data);
}
} catch (error) {
alert('예상치 못한 문제가 발생하였습니다. 다시 시도하여 주십시오.')
}
}
return (
<div style={{display: 'flex', flexDirection: 'row', gap: '10px'}}>
{products.map((product) => {
return <ProductsCard product={product}/>
})}
</div>
)
type Product = {
id:string,
post_user: string,
nickname: string,
created_at: string,
title: string,
contents: string,
price: number,
count: number,
tags: string[],
location: string,
dealType: string,
like_user: {uid:string, }[],
likes: number,
quality: string,
changable: boolean,
shipping_cost: boolean,
agreement: boolean,
};
const ProductsCard = (product: Product) => {
const { title, price, tags } = product
return (
<div>
<div>
<image>
</image>
</div>
<div>
<li>{tags}</li>
</div>
<h2>{title}</h2>
<h3>{price}원</h3>
</div>
)
}
TS2322: Type '{ product: ProductsPost; }' is not assignable to type 'IntrinsicAttributes & Product'.
Property 'product' does not exist on type 'IntrinsicAttributes & Product'.
'{ product: ProductsPost; }' 형식은 'IntrinsicAttributes & Product' 형식에 할당할 수 없습니다.
'IntrinsicAttributes & Product' 형식에 'product' 속성이 없습니다.ts(2322)
* React component에서 props를 넘길 때 인수 객체 자체가 전달이 되는데,
{ title: "붓", price: 10000 }
const ProductsCard = (product: Product) => { }
{ product : { title: "붓", price: 10000 } }
※ 객체 디스트럭처링의 경우 ProductsCard({product}: {product: Product})와 같이 작성해야 한다.
const ProductsCard = ({product}: {product: Product}) => {
const { title, price, tags } = product
return (
<div>
<div>
<image>
</image>
</div>
<div>
<li>{tags}</li>
</div>
<h2>{title}</h2>
<h3>{price}원</h3>
</div>
)
}