June 09, 2023
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는 현업에서도 쓸 일이 없어서 이런 실무지식은 아예 모르고 있었는데 이번 일을 계기로 알 수 있어서 좋았다. 지식이 늘었다.