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

김병훈·2024년 2월 26일

bora-n-maria

목록 보기
4/7
post-thumbnail

작업 내용

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

supabase.database의 function과 trigger

supabase는 postgreSQL DB를 제공하고 있어, 테이블 외에 function과 trigger를 제공한다.
이번 작업은 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개의 댓글