supabase 데이터를 효율적으로 불러오기 위해 rpc를 고민
chatGPT와 몇시간 씨름.. 😣
장소에 달린 리뷰 카드를 보여주기 위해
서버 통신하는 문제로 팀원들과 계속 고민했다
각 테이블마다 흩어져 있는 데이터를 모아서 요청해서
딱 한 번만 통신하는 게 좋을 것 같고
서버통신 횟수가 늘어나더라도
최대한 Props로 넘겨줄 데이터를 간소화해서 사용하는 게 좋을 것 같고.. 😶
백엔드가 있었으면 쉽게 해결될 일인데
supabase를 사용해서 받아올 데이터까지 직접 관리하다보니 여러모로 어려웠다
튜터님께 질문한 결과 서버통신을 줄이는 게 제일 좋다고 하셔서
최대한 깔끔하게 해결하려고 rpc를 시도했지만.. 일단 나는 실패했고 😏
팀원분이 gpt와 함께 멋지게 성공하셔서 그 코드를 알아보려 한다!
🔽 코드 🔽
BEGIN
RETURN QUERY -- 쿼리 결과 반환을 위한 지시문
SELECT -- 쿼리 선택
reviews.id AS unique_review_id,
reviews.content,
reviews.created_at,
reviews.user_id,
reviews.images_url,
reviews.place_id,
users.avatar_url AS user_avatar_url,
users.user_name,
places.place_name,
COALESCE(comment_counts.comments_count, 0) AS comments_count, // 댓글 수
COALESCE(like_counts.likes_count, 0) AS likes_count // 좋아요 수
FROM -- 좋아요 테이블을 기준으로 테이블들을 조인하여 데이터를 선택
likes
JOIN -- INNER JOIN을 사용하여 테이블을 결합
reviews ON likes.review_id = reviews.id // 리뷰 아이디와 좋아요 아이디가 일치하는 경우 좋아요와 리뷰 결합
JOIN
users ON reviews.user_id = users.id
JOIN
places ON reviews.place_id = places.id
LEFT JOIN ( -- 좌측 외부 조인을 사용하여 테이블을 결합
SELECT review_id, COUNT(*) AS comments_count -- 리뷰별로 댓글수 계산
FROM comments -- 댓글 테이블을 기준으로
GROUP BY review_id -- 리뷰 ID로 그룹화
) AS comment_counts ON reviews.id = comment_counts.review_id -- 리뷰와 댓글 수 테이블을 리뷰 ID로 결합
LEFT JOIN (
SELECT review_id, COUNT(*) AS likes_count -- 리뷰별로 좋아요의 수 계산
FROM likes -- 좋아요 테이블을 기준으로
GROUP BY review_id -- 리뷰 ID로 그룹화
) AS like_counts ON reviews.id = like_counts.review_id
WHERE -- 조건을 설정하여 결과 필터링
likes.user_id = p_user_id; -- 좋아요를 한 사용자의 ID가 주어진 사용자 ID와 일치하는 경우 선택
RETURN; -- 쿼리 실행 결과 반환
END;
이제 쓰는 곳에서 이렇게 함수처럼 쓰면 됨!
//'좋아요' 한 장소 조회
export const getLikedReviews = async (userId: string) => {
const { data, error } = await supabase.rpc('get_liked_reviews', {
p_user_id: userId,
});
if (error) {
throw error;
}
return data as ReviewsFromRPC[];
};
프로젝트가 진행될수록 어려운 부분만 남아서
매일매일이 고통의 연속이다 ㅎㅎ;
구현의 기쁨이 줄어드니 재미도 함께 줄어듬.. 😑
그래도 오늘 기술멘토링 시간에 튜터님께 칭찬을 많이 들어서 엄청 뿌듯하다!
MVP는 어느정도 구현했으니 완성도 높이는 데 힘써야지!