지난 심화 프로젝트에 이어서 이번에도 firebase
가 아닌 supabase
를 이용하게 되었다. 우선 docs
가 상당히 잘 정리되어 있다고 느꼈고, 관계형 데이터베이스를 사용할 수 있다는 점이 매력적으로 느껴졌다.
firebase
의 경우 회원 가입이 완료된 후 users
라는 별도의 컬렉션에 유저의 정보를 따로 저장하는 과정이 필요하지만, supabase
는 그렇지 않다.
supabase
에서 제공하는 trigger
와 function
을 활용해 회원가입이 이루어지면, 저장되어있는 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
에서는 posts
와 users
라는 테이블이 있을 때 두 테이블의 정보를 모두 가져와 병합해야 했기 때문에 많은 api 호출이 필요했다. 그러나 supabase
는 관계형 데이터베이스 이기에 join
기능을 지원한다!
이를 사용하려면 먼저 테이블에서 foreign key
를 등록해야 한다.
위와 같이 관계를 맺어주면 사용할 준비가 끝났으며, select
함수를 통해 테이블을 join
할 수 있다.
// ex
const response = await supabase.from(posts).select(`*, profiles (*)`)
여전히 기획을 하고.. ERD를 설계했다.! 담주부터는 프로젝트 세팅을 하고, 본격적으로 시작해보자!