TIL (240108)

Jtiiin:K·2024년 1월 18일
0

내일배움캠프

목록 보기
73/85
post-thumbnail

오늘 한 일

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는 어느정도 구현했으니 완성도 높이는 데 힘써야지!

profile
호기심 많은 귀차니즘의 공부 일기

0개의 댓글