트러블슈팅

[MeranGo] 디스코드 OAuth 로그인 시 Database error saving new user 에러

stopbrother 2025. 12. 8. 14:28

증상

디스코드 로그인을 시도하면 에러페이지로 이동되며 로그인에 실패했다.
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를 함께 보며 원인을 찾는 방법을 알게 되었다.