Supabase 우당탕탕 적응기 - Team-HGD/SniffMEET GitHub Wiki
문제 상황
우리 서비스는 Supabase를 사용하고 있다. 또한 Xcode에서 별도의 패키지를 설치하지 않고 REST API 방식으로 네트워킹 작업을 진행하고 있다.
특정 DB 하나에서 원하는 데이터를 가져오거나 추가하는건 상관없지만 어떤 DB의 특정 컬럼 값을 참조하여 다른 테이블의 데이터를 가져와야 하는 상황이 있었다.
SQL를 기준으로 JOIN 작업이 포함되는 경우에 어려움이 발생한 것이다.
☘️ 해결 방식
1️⃣ 핵심 아이디어
Supabase는 PostgreSQL에 기반해 만들어진 오픈소스이다. PostgreSQL의 rpc(remote procedure call)이라는 함수 기능이 있다. 또한 url을 통해 특정 rpc를 호출하고 결과 값을 받을 수도 있었다.
따라서 이 기능을 활용하여 JOIN 작업을 실행하기로 결정하였다.
내가 활용하고 싶었던 작업은 mate_list 테이블에서 자신의 메이트 관계인 user의 key값을 가지고 user_info 테이블에서 메이트들의 정보를 가져오는 것이었다.
2️⃣ 해결 과정
먼저 rpc를 만들어준다.
-- PostgreSQL 문법이다.
CREATE
OR REPLACE FUNCTION public.get_user_info_from_mate_list (user_id UUID) RETURNS SETOF public.user_info AS $$
BEGIN
RETURN QUERY
SELECT
ui.*
FROM
public.mate_list ml
JOIN LATERAL UNNEST(ml.mates) AS uid ON TRUE
JOIN public.user_info ui ON ui.id = uid
WHERE
ml.id = user_id; -- Filter by the provided user_id
END;
$$ LANGUAGE plpgsql;
- 이때
get_user_info_from_mate_list
가 url에 포함된다. - 요청을 보낼 때 ‘user_id’를 Body에 포함하여 요청을 보내야한다.
아래 화면은 PostMan으로 확인한 결과이다.