
이 글은 2026년 03월 24일 작성된 글입니다.
오늘은 Supabase를 활용한 게시글/댓글 CRUD와 RLS 권한 제어를 학습했고,
팀 프로젝트 기획 단계에서 여행지 추천 플랫폼 주제와 요구사항 명세서 작성을 진행했다.
게시글 작성자를 연결하기 위해 posts.user_id를
Supabase 인증 테이블인 auth.users.id와 연결했다.
posts.user_id → auth.users.id (FK)
초기에는 데이터 입력을 위해 Nullable 허용으로 설정했다.
Is Nullable : 체크
향후 실제 user_id가 저장되기 시작하면 Nullable 해제 예정.
const { error } = await supabase
.from('posts')
.insert([{ title, content }])
const { error } = await supabase
.from('posts')
.delete()
.eq('id', id)
const { error } = await supabase
.from('posts')
.update({ title, content })
.eq('id', id)
const { data, error } = await supabase
.from('comments')
.insert([
{ some_column: 'someValue', other_column: 'otherValue' },
])
.select()
const { error } = await supabase
.from('comments')
.delete()
.eq('some_column', 'someValue')
RLS 설정 후 권한이 없는 경우 데이터를 가져오지 못한다.
권한 검증 예시
if (!data || data.length === 0) {
// RLS 차단 or 해당 행이 없음
throw new Error('수정 권한이 없거나 대상이 존재하지 않습니다.')
}
또한 사용자 권한에 따라 UI 토글 노출을 구현할 수 있다.
예
작성자 → 수정 / 삭제 버튼 노출
비작성자 → 버튼 숨김
Supabase에서 인증 정보를 가져오는 방법은 두 가지가 있다.
| 항목 | getSession() | getUser() |
|---|---|---|
| 데이터 출처 | 로컬 저장소 (JWT) | Supabase 서버 |
| 속도 | 빠름 | 느림 (네트워크 요청) |
| 신뢰도 | 위조 가능성 있음 | 서버 검증 완료 |
| 반환값 | session (토큰 + 유저) | user (유저 정보만) |
| 용도 | UI 분기, 버튼 표시/숨기기 | 서버 권한 체크, 보안 로직 |
| 권장 환경 | 클라이언트 컴포넌트 | 서버 컴포넌트 / API |
오늘은 팀 프로젝트 기획서와 요구사항 명세서를 작성했다.
프로젝트 주제는 다음과 같다.
태그 기반 여행지 추천 웹 서비스
사용자가 원하는 여행 테마 태그를 선택하면 해당 테마에 맞는 여행지를 추천받는 플랫폼이다.
예시 태그
프로젝트 역할 분배 결과
나는 회원 시스템 파트를 맡게 되었다.
구현 예정 기능
회원가입
로그인
이메일 인증
SSO 로그인
SSO는 소셜 로그인을 의미하며 다음과 같은 방식으로 구현할 예정이다.
Google 로그인
Kakao 로그인
이후 프로젝트 진행 상황에 따라
다른 기능 파트도 추가로 맡아 구현할 가능성이 있다.
오늘은 Supabase CRUD와 RLS 권한 제어 방식을 학습했다.
특히 인증 정보 조회 방식인 getSession()과 getUser()의 차이를 이해할 수 있었다.
또한 팀 프로젝트 기획을 진행하며 태그 기반 여행지 추천 플랫폼을 주제로 선정했고,
나는 회원가입 / 로그인 (이메일 + SSO) 파트를 담당하게 되었다.
앞으로는 회원 시스템 구현을 시작으로 프로젝트 기능을 단계적으로 개발해 나갈 예정이다.