적용
아래 코드는 디테일 페이지에서 특정 상품의 데이터를 가져오는 부분이다. 원래는 상세 정보와 리뷰 탭이 없었는데 UT를 진행하면서 리뷰가 있었으면 좋을 것 같다는 피드백이 많아서 구현하게 되었다. UT를 해볼 기회는 없었는데 이번에 해보게 되어서 너무 좋았다(?) 피드백을 받고 수정하는데 테스트 전보다 완성도 높은 작업물이 나올 것 같다.
const {
data: food,
isPending,
error
} = useQuery({
queryKey: ['localfood', id],
queryFn: async () => {
const { data, error } = await supabase
.from('local_food')
.select('*')
.eq('product_id', id)
.single();
if (error) throw new Error(error.message);
return data;
}
});
그런데 여기서 문제. 저 리뷰 탭에 리뷰의 개수가 보여야하는데 저 개수만 보여주려고 리뷰 데이터를 패치해야하는 상황이 생겼다. 라우터 핸들러로 만들어놓긴 했지만 저 개수를 띄우려고 코드를 몇줄 이상 써야하는게 비효율적이라고 생각이 들었다. 구글링하다가 supabase join 기능이 있다고해서 참고했다. supabase 초반에 사용할 때 들었던 기능 같은데, 프로젝트에서 써먹어본건 최종까지와서다.. 막상 기억이 잘 안나서 사용하지 못했다,, 이제라도 알아서 다행이다^.~
수정코드
리뷰 테이블의 모든 데이터를 가져왔다.
const {
data: food,
isPending,
error
} = useQuery({
queryKey: ['localfood', id],
queryFn: async () => {
const { data, error } = await supabase
.from('local_food')
.select('*, reviews(*)')
.eq('product_id', id)
.single();
if (error) throw new Error(error.message);
return data;
}
});
사용할 땐 두개의 테이블 이름을 같이 써서 아래와 같이 사용하면 된다.
<li
className="flex-1 cursor-pointer"
onClick={() => setActiveTab('리뷰')}
>
<p
className={`pb-2 w-[140px] mx-auto ${
activeTab === '리뷰'
? 'text-primary-20 border-b-4 border-primary-20'
: 'text-label-assistive'
}`}
>
{`리뷰(${food.reviews.length})`}
</p>
</li>
'프로젝트' 카테고리의 다른 글
[프로젝트] Nexj.js 리뷰 페이지네이션 구현하기 (0) | 2024.08.16 |
---|---|
[프로젝트] 선택삭제 forEach ? map ? (0) | 2024.08.09 |
[프로젝트] Next.js로 장바구니 구현하기 - (5) (0) | 2024.08.05 |
[프로젝트] Next.js에서 Swiper 적용하기 (0) | 2024.07.31 |
[프로젝트] Next.js 장바구니 구현하기 - (4) (0) | 2024.07.30 |