14. userinfo 테이블
소요시간
2025년 2월 13일 - 4시간
느낀 점
확실히 쿼리문에 대한 개념이 너무 없다는 생각이 든다. 기초가 없으니 ai한테 물어보는 시간이 좀 아까운 거 같다.
데이터베이스 공부를 해도 평소 nosql을 써서 조금 헷갈린다는 생각이 든다.
그래서 확실히 디비 관련 지식은 블로그에 자세하게 써야 되겠다.
테이블작성하기
CREATE TABLE userInfo (
id UUID REFERENCES auth.users ON DELETE CASCADE NOT NULL PRIMARY KEY,
email TEXT,
username TEXT,
birthdate DATE, -- 생년월일은 DATE 타입이 적합합니다.
gender BOOLEAN, -- 성별은 BOOLEAN 타입으로 사용할 수 있지만, ENUM 타입을 고려해볼 수도 있습니다.
category TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
자기한테 필요한 거 쿼리문으로 작성하면 됩니다~~
나는 회원가입하고 나서 바로 정보입력을 받아야 되기 때문에
auth관리하는 테이블 말고 userinfo 테이블을 따로 만들어줬다. (밑에서 자세하게 설명함)
function 작성하기
-- 1. RLS 정책 설정 (예시)
create policy "public profiles are viewed by everyone."
on public.userInfo
for select
using (true);
create policy "Users can insert their own profile."
on public.userInfo
for insert
with check (auth.uid() = id);
public profiles are viewed by everyone.
이 조건은 항상 참이므로, 모든 사용자가 userInfo 테이블의 데이터를 조회할 수 있음을 의미합니다. 즉, 이 정책이 활성화되면, 인증된 사용자뿐만 아니라 비인증 사용자도 userInfo 테이블의 모든 프로필을 조회할 수 있습니다.
"Users can insert their own profile."
이 조건은 사용자가 자신의 프로필만 삽입할 수 있도록 제한합니다. auth.uid()는 현재 인증된 사용자의 ID를 반환하며, id는 userInfo 테이블의 ID 필드입니다. 따라서, 사용자가 삽입하려는 프로필의 ID가 현재 인증된 사용자의 ID와 일치해야만 삽입이 허용됩니다.
supabase 설명
supabase auth 모듈에 저장된걸 따로 userinfo 테이블로 이동하는 과정
( 공식문서도 따라 유저 테이블을 관리하라고 적혀있음 )
-- 2. 신규 사용자를 userInfo 테이블에 등록하는 함수 작성
create function public.handle_new_user()
returns trigger as $$
begin
insert into public.userInfo (
id,
email,
username,
birthdate,
gender,
category
)
values (
new.id,
new.email,
new.raw_user_meta_data->>'name', -- auth 데이터에서 이름 가져옴
null, -- birthdate는 auth에 없으므로 NULL
null, -- gender는 auth에 없으므로 NULL
null -- category도 auth에 없으므로 NULL
);
return new;
end;
$$ language plpgsql security definer;
trigger 작성하기
-- 3. 트리거 생성: auth.users 테이블에 새로운 row가 생성되면 위 함수를 실행
create trigger on_auth_user_created
after insert on auth.users
for each row
execute procedure public.handle_new_user();
이 트리거를 사용하면 auth.users 테이블에 새로운 사용자가 추가될 때마다 자동으로 특정 작업을 수행합니다.
결과
이렇게 쿼리문에 다 붙여 넣으면 auth 사용자가 가입할떄마다 userinfo 테이블에 자동으로 정보가 추가된다