오늘의 트러블슈팅은 두 가지.
하나는 좋아요 버튼에서 발생한 콘솔에러와 supabase 소셜로그인 시 데이터를 받지 못하는 이슈에 대해서 짧게 적어보려고 한다.
팀프로젝트 트러블 슈팅 - browserClient, maybeSingle
구글, 깃허브, 카카오 세 가지로 소셜로그인을 만들었는데 일반회원일 때는 그 user의 데이터가 잘 받아와지지만 소셜로그인 일 때만 사진처럼 데이터를 받지 못했다.
import { supabase } from "@/supabase/supabase";
// 유저 정보를 불러오는 함수
export const fetchUserProfile = async (): Promise<{
user_id: string;
user_nickname: string;
user_img: string;
user_email: string;
user_exp: number;
user_rank: number;
user_introduce: string;
} | null> => {
const {
data: { user },
error: userError
} = await supabase.auth.getUser(); // 🚨 문제가 된 부분
if (userError || !user) {
console.error("사용자 정보를 가져올 수 없거나 로그인 상태가 아닙니다:", userError?.message);
return null;
}
const userId = user.id;
const { data, error } = await supabase.from("USER_TABLE").select("*").eq("user_id", userId).single(); // 🚨 문제가 된 부분
if (error) {
console.log("user 프로필 불러오기 실패:", error.message);
return null;
}
return data;
};
user의 데이터는 browserClient
를 사용해줘야하는데 supabase
로 불러오니까 에러가 발생했던 것이다.
이렇게 수정해주고 다시 실행시키면 소셜로그인 유저의 데이터도 잘 받아올 수 있게 된다...ㅎㅎ
망충망충 실수...ㅎㅎ 앞으로 클라이언트 / 서버 어디에서 보여주고 사용할 함수인지 똑!바!로! 생각하고 쓰기!!
PR을 받고 체크할 겸 콘솔을 열었는데 이런 에러가 좌악 나오고 있었다.
4로 시작하는 에러는 === 내 잘못 이니까 콘솔에 나온 컴포넌트로 가서 코드를 살펴보았다.
이 쪽에서 발생한 문제였는데 이렇게 봤을 때 문제를 바로 알기 어려워서 구글에 에러 메시지를 그대로 검색해보았다 (ㅋㅋㅋ_)
RLS 권한 관련이거나 .single()
대신에 .maybeSingle()
을 쓰면 해결이 된다는 글을 찾게 되었다.
일단 로그인 쪽이 완벽하게 작업이 끝난게 아니라 코드 상으로 수정할 수 있는 후자를 먼저 해보기로 했다.
const fetchLikeStatus = async (userId: string | null) => {
// 로그인 시 내 좋아요 상태 가져오기
if (userId) {
const { data: likeStatusData, error: likeStatusError } = await supabase
.from("LIKE_TABLE")
.select("like_id")
.eq("post_id", postId)
.eq("user_id", userId)
.limit(1)
.maybeSingle(); // ✅ 수정한 부분
if (likeStatusError) {
console.error("좋아요 상태 오류:", likeStatusError.message);
}
if (likeStatusData?.like_id) {
setLikeStatusDb(likeStatusData.like_id);
setIsLike(true);
} else {
setLikeStatusDb(null);
setIsLike(false);
}
}
우리는 좋아요 개수를 딱 하나만 가져오는 것도 아니고, 사용자 당 좋아요 개수를 하나만 가져오는 것도 아니기 때문에 single()
을 사용했을 때 에러가 났던 것이다.
이렇게 하면 콘솔에 났던 에러도 사라졌다!
조금 찝찝한 건 데이터가 하나도 없는 경우에도 오류를 발생시키지 않는다는 것이다. 지금은 다른 부분도 작업해야하는게 많아서 반창고 붙이듯이 해결하긴 했지만 그냥 single()
이든 maybeSingle()
이든 아무것도 쓰지 않았을 때는 어떻게 되는지도 확인해봐야겠다! 리펙토링할 때 꼭 해보자
참고자료