#TIL 4 모바일 청첩장 빌더 - pl/pgsql

김병훈·2024년 2월 26일
0

bora-n-maria

목록 보기
4/7
post-thumbnail

작업 내용

  1. 유저가 회원가입했을 때, template를 생성하기
  2. template가 추가되었을 때, metadata를 생성하기

supabase.database의 function과 trigger

supabase는 postgreSQL DB를 제공하고 있어, 테이블 외에 functiontrigger를 제공한다.
이번 작업은 function/trigger를 이용하여, 테이블에 row가 insert 되었을 때 기본으로 있어야 하는 데이터를 자동으로 추가하도록 했다.

1. 유저가 회원가입했을 때, template를 생성하기

처음에는 회원가입을 할 때, 회원가입 요청을 보낸 후 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;
  • create_template_on_user_insert 라는 함수를 생성/대체한다.
  • trigger를 반환한다.
  • 실행할 함수 본문을 $$ 사인으로 감싼다.
  • plpgsql 언어로 작성했으며, 함수 생성자가 호출할 수 있도록 한다.

이 함수를 호출할 trigger를 정의해보자

create trigger create_template_trigger
after insert on auth.users for each row
execute procedure create_template_on_user_insert();
  • create_template_trigger 라는 trigger를 생성한다.
  • auth.user 테이블의 각각의 row가 insert 이후에 수행되며,
  • create_template_on_user_insert 라는 procedure를 실행한다.

이젠, 회원가입이 이루어졌을 때 template 템플릿을 생성할 수 있다!

2. template가 추가되었을 때, metadata를 생성하기

회원가입 후 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가 추가된다!

profile
재밌는 걸 만드는 것을 좋아하는 메이커

0개의 댓글