[Meal Mate] 트러블 슈팅

장현빈·2025년 2월 18일

문제 상황

Supabase 댓글 추가 실패

  • 에러 발생 로그
POST https://akqkaonphmdqozkinveg.supabase.co/rest/v1/comments 401 (Unauthorized)
[CommentSection] 댓글 추가 실패: new row violates row-level security policy for table "comments"
  • 에러 발생 시점
    : CommentSection.jsx에서 댓글을 작성하고 추가하려는 시도 시 발생

원인 분석

  1. Supabase RLS(Row-Level Security) 정책 활성화
  • comments 테이블에 Row-Level Security가 적용되어 있었음.
  1. INSERT 권한 정책 미설정
  • comments 테이블에 정책이 설정 돼어 있지 않았음.
  1. supabase 클라이언트에서 인증 정보 누락 가능성
  • 요청 시 인증 토큰이 포함되지 않으면 401 (Unauthorized) 에러 발생.

해결 과정

1. Supabase RLS 정책 수정 (로그인된 사용자만 댓글 작성 허용)

  • SQL Editor에서 로그인된 사용자만 댓글 추가 가능하도록 정책 설정:
BEGIN;
-- 로그인된 사용자만 댓글을 추가할 수 있도록 정책 추가
CREATE POLICY "Allow authenticated users to insert comments"
ON comments
FOR INSERT
TO authenticated
WITH CHECK (auth.uid() IS NOT NULL);
COMMIT;

  • authenticated 사용자만 INSERT 권한을 가짐.
  • auth.id()를 통해 로그인된 사용자만 데이터 추가 가능.

2. 컴포넌트 내 supabase 클라이언트 코드 점검

  • 로그인 상태 확인 후 댓글 추가하도록 수정
// 로그인된 사용자 여부 확인
const { data: user } = await supabase.auth.getUser();
if (!user) {
  alert('로그인이 필요합니다.');
  return;
}
// 댓글 추가
const { data, error } = await supabase
  .from('comments')
  .insert([
    {
      post_id: postId,
      user_id: user.id,
      content: comment,
    }
  ]);
if (error) {
  console.error('댓글 추가 실패:', error.message);
} else {
  console.log('댓글 추가 성공:', data);
}
  • 댓글 추가 전에 supabase.auth.getUser()를 사용해 로그인 여부 확인.
  • user.id를 user_id 필드에 삽입.
  • +게시물 접근 시 로그인 여부 확인(비로그인시 경고창 표시)
 useEffect(() => {
    if (!isLogin) {
      errorAlert({
        type: ALERT_TYPE.ERROR,
        content: '로그인이 필요합니다. 로그인 페이지로 이동합니다.',
      }).then((res) => {
        if (res.isConfirmed) navigate('/login', { replace: true });
      });
    }
  }, [isLogin, navigate, errorAlert]);
  // 로그인되지 않았으면 페이지 안보여주기
  if (!isLogin) {
    return null;
  }

테스트 및 결과

로그인 상태: 댓글 정상 추가 확인 ✅

로그아웃 상태: “로그인이 필요합니다” 경고창 (SWAL) 표시 ✅

profile
안녕하세요

0개의 댓글