auth.users 를 보강하기위해 public.users 생성
supabase auth 를 사용할 경우, auth.users 스키마만으로는
프로젝트 필요한 정보들을 모두 컨트롤 할 수 없습니다.
그래서 보통 users 같은 테이블을 하나 만들어서 쓰는 것이 보통이라고 합니다.
그래서 저희도 이에 해당하는 buddies 테이블을 만들었습니다.
하지만 문제는 유저가 회원가입 혹은 소셜로그인을 하여
auth.users 에 로우가 추가되어도, 직접 만든 buddies 테이블(public.buddies) 에는
로우가 자동으로 추가되지 않는다는 점입니다.
그래서 이를 해결하기 위해 간단한 SQL 사용해보기로 했습니다.
auth.users 변경시 자동으로 users 테이블에 로우를 추가
처음에는 아래 정도의 로직을 생각했습니다.
-- 새로운 트리거 함수 생성
CREATE OR REPLACE FUNCTION public.handle_new_user_custom()
RETURNS TRIGGER AS $$ BEGIN INSERT
INTO public.users (id, email, nickname)
VALUES (NEW.id, NEW.email, NEW.raw_user_meta_data->>'user_name');
RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER;
-- 새로운 트리거 생성
CREATE TRIGGER on_auth_user_created_custom
AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user_custom();
auth.users 에 insert 가 발생하면 여기에서 id, email, raw_user.meta_data 컬럼을 가져다가
public.users 의 id, email, nickname에 쓰는 것입니다.
여기서 문제가 생겼습니다.
nickname은 unique 하고 nullable 하지 않아야 한다?
우리의 테이블에서 nickname은 nullable 하지 않고
unique 하여야 합니다.
그런데 위 SQL 대로라면 raw_user_meta_data-->'user_name'이
만약 null 일 경우에 대처할 수 없습니다.
거기다 우리는 사용자의 개별 페이지를도메인.com/닉네임or고유아이디(텍스트)
같은 구조로 만들고 싶었습니다.
그래서 nickname 은 꼭 고유한 값이 필요했습니다.
고민끝에 생각해낸 해결책은
만일 raw_user_meta_data-->'user_name' 이 null 등으로 참조할 값이 없을 경우,
'user_12314125' 같은 랜덤하고 고유한 nickname이 자동 부여되도록 하는 것이었습니다.
최종 SQL
CREATE OR REPLACE FUNCTION public.handle_new_user_custom()
RETURNS TRIGGER AS $$
DECLARE
new_nickname TEXT;
BEGIN
-- 기본 닉네임 생성
new_nickname := 'user_' || substring(md5(random()::text), 1, 8);
-- nickname이 이미 존재하는지 검사
WHILE EXISTS
(SELECT 1 FROM public.buddies WHERE buddy_nickname = new_nickname) LOOP
-- 중복 발생 시 다른 유니크한 닉네임 생성
new_nickname := 'user_' || substring(md5(random()::text), 1, 8);
END LOOP;
INSERT INTO public.buddies (buddy_id, buddy_email, buddy_nickname, buddy_profile_pic)
VALUES (
NEW.id,
NEW.email,
new_nickname,
CASE
WHEN NEW.raw_user_meta_data->>'avatar_url' IS NOT NULL
THEN NEW.raw_user_meta_data->>'avatar_url'
ELSE NULL
END
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- 새로운 트리거 생성
CREATE TRIGGER on_auth_user_created_custom
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION public.handle_new_user_custom();
이렇게 함으로써 nickname은 항상 unique 한 값을 갖게 됩니다.
'supabase' 카테고리의 다른 글
[240727 TIL] naver 로그인 편법 구현 with Supabase 1편 (0) | 2024.07.28 |
---|---|
[240723 TIL] SQL 팔로잉 수 측정 (0) | 2024.07.24 |
[240721 TIL] 수파베이스 SQL로 테이블 생성하기 (0) | 2024.07.21 |
[240720 TIL] Supabase 유저테이블 자동입력 SQL (0) | 2024.07.20 |
[240718 TIL] 다중조건 supabase 쿼리 (2) | 2024.07.19 |