증상
디스코드 로그인을 시도하면 에러페이지로 이동되며 로그인에 실패했다.
Supabase에서 Auth 로그를 확인해보니 아래와 같은 에러 로그가 찍혀 있었다.
500: Database error saving new user
ERROR: new row for relation \"profiles\" violates check constraint \"username_length\"
원인
새 유저를 저장하려는 과정에서 profiles테이블의 username_length 체크 제약조건을 위반해서 생긴 에러였다.
그래서 사용자 메타데이터를 확인해 보니 디스코드 별명이 설정되어 있지 않으면 빈 문자열로 되어있는걸 알았다.
{
...
user_metadata: {
custom_claims: { global_name: '' },
full_name: 'stopbrother',
...
}
}
트리거 로직은 아래처럼 사용하고 있었다.
coalesce(new.raw_user_meta_data->'custom_claims'->>'global_name',
new.raw_user_meta_data->>'full_name')
의도한건 global_name이 없을 경우 full_name을 사용하도록 했지만 빈 문자열이 들어오게 되면서 체크 제약조건이 에러를 발생시킨것이였다.
해결
nullif를 추가해서 빈 문자열은 null로 취급하도록 하였다.
coalesce(
nullif(new.raw_user_meta_data->'custom_claims'->>'global_name',''),
new.raw_user_meta_data->>'full_name'
)
);
nullif(A, '')는 A가 빈 문자열이면 null을 반환하는 함수이다.
이를 사용해서 global_name이 있으면 그대로 username으로 사용하고
빈문자열이면 full_name으로 사용하도록 하여 에러를 해결하였다.
회고
처음에는 단순히 global_name이 없으면 full_name을 사용하면 되겠다 라고만 생각했는데 null과 빈문자열은 완전히 다르다는걸 다시 한번 느꼈다.
이 문제를 통해 nullif라는 함수를 알게되었고 DB 에러 메시지까지 보는 방법을 알게 되면서 문제가 생겼을 때 앱 코드 + Supabase Logs를 함께 보며 원인을 찾는 방법을 알게 되었다.
'트러블슈팅' 카테고리의 다른 글
| shadcn/ui 모달 사용 시 스크롤 여백으로 인한 레이아웃 깨짐 (0) | 2025.12.29 |
|---|---|
| [MeranGo] 무한스크롤 구현 중 queryKey로 인한 데이터 누락 (0) | 2025.12.11 |
| [MeranGo] 폼 제출 시 초기값만 전송되는 문제 (0) | 2025.12.09 |
| Error: UNKNOWN: unknown error 오류 (0) | 2025.03.20 |