db trigger를 활용해 supabase signUp 후에 users table에 데이터 추가하기

배경

supabase를 활용해 사이드 프로젝트를 하다가 겪었던 문제를 해결한 경험이다. supabase auth를 활용해 google signUp을 했는데, data는 auth schema의 users table에 저장되는데, 보안상의 목적으로 외부에서 접근할 수 없도록 설정되어 있다.

내용

그래서 user data로 다른 table의 data와 상호작용하기 위해 public schema에 table을 만들어야 했다.

이와 관련한 supabase docs가 아래 있었고 나는 이렇게 학부생 때 배웠던 db trigger를 사이드 프로젝트 하면서 처음 쓰게 되었다.

supabase-auth/managing-user-data

-- 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.users table에 insert가 일어나면 handle_new_user function이 실행되고, public.profiles table에 id를 넣는다.

나는 사용자가 회원가입을 하면 public.users table에 id, email, name(email에서 @앞)을 넣고 싶었다.

email에서 name을 추출하기 위해서 postgre split_part function을 활용할 수 있었다.

create or replace function public.handle_new_user()
    returns trigger
    language plpgsql
security definer set search_path = public
as $$
begin
    insert into public.users (id, name, email)
    values (new.id, split_part(new.email, '@', 1), new.email);
return new;
end;
$$;

피드백

생활코딩에 글을 공유하니까 지나가던 개발자님께서 왜 트리거를 썼는지 물어봐주셨다. 글을 본 내 친구와 지인분도 현업에서 트리거는 거의 쓰지 않는다고 알려줬다. 가장 큰 이유는 유지보수가 힘들다는 것이다. 데이터베이스에 달려 있다 보니 파악하기가 어렵고, 예상치 못한 오류가 발생할 수도 있다. 그래서 로직은 모두 코드단에서 구현하고 관리한다고 한다. 그리고 또 다른 이유는 성능인데, 아무래도 디비 CPU를 사용하다 보니까 성능이 저하될 수 있다.

아무래도 프론트엔드 개발자이다보니까, trigger는 현업에서도 쓸 일이 없어서 이런 실무지식은 아예 모르고 있었는데 이번 일을 계기로 알 수 있어서 좋았다. 지식이 늘었다.


Written by@Donghoon Song
사람들의 꿈을 이어주는 코멘토에서 일하고 있습니다.

InstagramGitHubTwitterLinkedIn