[TIL] supabase

·2024년 1월 7일
0

TIL

목록 보기
67/85
post-thumbnail

지난 심화 프로젝트에 이어서 이번에도 firebase가 아닌 supabase 를 이용하게 되었다. 우선 docs 가 상당히 잘 정리되어 있다고 느꼈고, 관계형 데이터베이스를 사용할 수 있다는 점이 매력적으로 느껴졌다.

firebase의 경우 회원 가입이 완료된 후 users라는 별도의 컬렉션에 유저의 정보를 따로 저장하는 과정이 필요하지만, supabase는 그렇지 않다.

supabase에서 제공하는 triggerfunction을 활용해 회원가입이 이루어지면, 저장되어있는 function을 실행시켜 자동으로 유저의 입력 정보를 public table에 저장할 수 있다.

로그인 회원가입

const { data, error } = await supabase.auth.signUp({
  email: 'example@email.com',
  password: 'example-password',
  options: {
    data: {
      first_name: 'John',
      age: 27,
    },
  },
})

회원가입이 실행된 후 자동 저장 되도록 다음과 같이 trigger를 등록하자.

-- inserts a row into public.profiles
create function public.handle_new_user()
returns trigger
language plpgsql
security definer set search_path = public
as $$
begin
  insert into public.profiles (id)
  values (new.id);
  return new;
end;
$$;

-- trigger the function every time a user is created
create trigger on_auth_user_created
  after insert on auth.users
  for each row execute procedure public.handle_new_user();

auth의 user테이블에 유저가 등록되었을 때 handle_new_user()의 sql이 실행되도록 trigger를 등록할 수 있다.

기본 데이터인 id 뿐만 아니라 유저가 입력한 데이터 (meta_data 에 저장됨) 의 경우

begin
  insert into public.profiles(id, email, first_name)
  values(new.id, new.email, new.raw_user_meta_data->>'first_name');
  return new;
end;

이렇게 meta_data에 접근할 수 있다.

👉 참고 : https://supabase.com/docs/guides/auth/managing-user-data

관계형 데이터 베이스

NoSQL의 firebase와 달리 PostgreSQL 기반의 supabase관계형 데이터 베이스를 지원한다. firebase에서는 postsusers 라는 테이블이 있을 때 두 테이블의 정보를 모두 가져와 병합해야 했기 때문에 많은 api 호출이 필요했다. 그러나 supabase는 관계형 데이터베이스 이기에 join 기능을 지원한다!
이를 사용하려면 먼저 테이블에서 foreign key를 등록해야 한다.

위와 같이 관계를 맺어주면 사용할 준비가 끝났으며, select 함수를 통해 테이블을 join할 수 있다.

// ex
const response = await supabase.from(posts).select(`*, profiles (*)`)

ERD

여전히 기획을 하고.. ERD를 설계했다.! 담주부터는 프로젝트 세팅을 하고, 본격적으로 시작해보자!

profile
느리더라도 조금씩, 꾸준히

0개의 댓글