supabase는 postgreSQL DB를 제공하고 있어, 테이블 외에 function과 trigger를 제공한다.
이번 작업은 function/trigger를 이용하여, 테이블에 row가 insert 되었을 때 기본으로 있어야 하는 데이터를 자동으로 추가하도록 했다.
처음에는 회원가입을 할 때, 회원가입 요청을 보낸 후 template를 생성하는 요청도 포함하도록 하려고 했었다.
// /api/auth/signup/route.ts
export const POST = (req: NextRequest) => {
// ...
await supabase.auth.signup(user);
await supabase.from('template').insert(template);
// ...
};
그런데, signup 함수에 template를 생성하는 로직도 같이 있는 것이 맞을까? 하는 생각이 들면서 다른 방식을 찾아보게 되었다.
supabase의 function/trigger를 알게 되었고, 이를 적용해보기로 했다.
내가 원하는 동작은
1. auth.users 테이블에 insert가 되었을 때
2. 생성된 새로운 row(users)에서 userId를 가지고,
3. public.templates 테이블에 insert를 하는 것
1번은 trigger의 역할이 되고, 2/3번은 function의 역할이 된다.
function을 먼저 정의해보자
function은 postgreSQL의 프로시저 언어인 PL/pgSQL
을 사용하여 작성했다.
create or replace function create_template_on_user_insert()
returns trigger as $$
begin
insert into templates(user_id, code)
values (new.id, new.raw_user_meta_data->>'code');
return new;
end;
$$ language plpgsql security definer;
이 함수를 호출할 trigger를 정의해보자
create trigger create_template_trigger
after insert on auth.users for each row
execute procedure create_template_on_user_insert();
이젠, 회원가입이 이루어졌을 때 template 템플릿을 생성할 수 있다!
회원가입 후 template를 생성하는 것과 동일한 방법(function/trigger)으로 metadata를 생성해보자.
// 함수 정의
create or replace function create_metadata_on_template_insert()
returns trigger as $$
begin
insert into metadata(template_id)
values (new.id)
return new;
end;
$$ language plpgsql security definer;
// trigger 정의
create trigger create_metadata_trigger
after insert on templates for each row
execute procedure create_metadata_on_template_insert();
이젠, template가 추가되었을 때, metadata가 추가된다!