하루 기록

[supabase] 여러 개 테이블 select하기 (table join) 본문

Today I Learned/in dev

[supabase] 여러 개 테이블 select하기 (table join)

떼굴펜 2024. 7. 10. 12:29

워낙에 쓰기 간편하게!에 중점을 뒀던건지, 역시 커스텀하려고 하니 직접 짜는 쿼리만큼의 자유도는 없다.

 

table join 필수 조건

: 조인하려는 테이블 간에 FK가 걸려있을 것

 

Query (in Next/React/ts)

구문

const { data } = await supabase
    .from("테이블이름")
    .select("컬럼명나열 or 와일드카드, 조인하려는테이블명(조인테이블의컬럼))

 

 

사용 예시

const { data } = await supabase
    .from("posts")
    .select(`*, comments (content)`)
const { data } = await supabase
    .from("posts")
    .select("*, users: author_id(*)")

 

 

 

 

만약 위처럼 했는데 에러가 나면 아래 내용을 참고


내가 원했던 것

1. TABLE.posts  + TABLE. user.profile 조인하기

2. TABLE.comments  + TABLE.user.pfile 조회하기

 

문제 상황

요약

1. table join은 조인하려는 테이블 간에 FK가 걸려있어야 한다.

2. Auth.user.id 와 TABLE.users.id 는 같은 uuid + FK가 걸려있는 상태이지만, 실제 내부데이터는 다른 것인지 FK 단순 변경은 불가하다.

 

부가 설명

문제 1. table join은 조인하려는 테이블 간에 FK가 걸려있어야 한다.

 supabase에서 제공하는 Auth, 사용자 정보는 table 제공되지 않아, 프로필 이미지를 저장하기 위해 user 테이블을 생성해  Auth.userId만 조인해서 사용중이였다. 다만, 다른 테이블(posts, comments)에 걸려있는 사용자 아이디도 Auth의 userId를 조인해서 사용 중이였는데 이것이 문제였다.

 

따라서, FK 연결을 각 테이블 끼리 하도록 변경하자

FK 연결 변경 전후의 연결을 다이어그램으로 나타내면 아래와 같다.

변경 전  변경 후
posts, users 사이의 직접적으로 연결된 FK가 없다.
-> supabase join 불가
변경전) posts, users 테이블 두개는 join 할수없다. FK가 없기 때문이다.


 auth.user이 아닌 table.user와 FK 연결로 변경
변경후) auth.user이 아닌 table.user와 FK 연결로 변경


 

 

문제 2.  Auth.user.id 와 TABLE.users.id 는 같은 uuid + FK가 걸려있는 상태이지만, 실제 내부데이터는 다른 것인지 FK 단순 변경은 불가하다.

에러 메세지 : insert or update on table "comments" violates foreign key constraint "comments_author_id_fkey"

 

 FK를 변경하려고 하면 위와 같은 에러가 발생했다. 분명 Auth.user.id 와 TABLE.users.id 는 FK가 걸려있으니 같은 값이 들어있을 거라고 당연하게 생각했다. 하지만 에러 내용을 봤을 때는 FK 제약조건 위반이라니!

 

해결을 위해 시도해본 것

1) 이후 교체할 nullable 한 컬럼 author_id2을 생성 > FK를 걸기 > 데이터 마이그레이션 [실패] > author_id 컬럼 삭제 > author_id2 이름을 author_id로 변경

데이터 마이그레이션에서 실패했다. author_id에 들어가 있는 값을 넣으니 위와 같은 에러가 다시 뜨면서 업데이트가 되지 않았다.

 

2) 테스트용 신규 테이블을 만들어 빈 테이블에 FK를 걸어보고 데이터를 넣어보자 [성공]

그래서 기존에 있던 데이터를 모두 삭제 한 후 시도하니 정상적으로 들어가는 것을 확인했다.
(개발 단계이기에 테스트 데이터라 가능했던 것이고, 프로덕션이였으면 불가능)

 

위와 같은 시도를 통해, auth.user.id 와 table.user.id 는 FK 도 걸려있고 보기엔 두 컬럼이 같은 값을 가지고 있는 것처럼 보이지만, 실제 내부 데이터는 다르며 똑같이 보이도록 supabase 자체적으로 처리한 것이 아닐까 하는 의심했다.

 

우선 2번으로 해결이 가능하니.. auth와의 FK 연결은 최대한 하지말자