[사이드 프로젝트] Supabase 들어가기

이언덕·2025년 10월 12일
post-thumbnail

데일리 플래너 프로젝트를 진행 중인데 이제 백엔드를 처음 해보려고 한다.
백엔드에서는 어렵게 생각할 필요 없다. 그냥 내 데이터를 안전하게 저장하고 불러오는 창고라고 보면 된다.


📌 백엔드에서 하게 될 일

🔑 1. 로그인/회원가입 + 프로필

  • ✉️ 이메일로 가입하고 로그인할 수 있게 만든다. (& 간편로그인 기능도 추가)
  • 🙋 가입하면 자동으로 내 프로필 카드(이름, 아이디)가 하나 생긴다.

📂 2. 플래너 데이터 저장

  • 📝 내가 적은 투두, 일정(일간/주간/월간), 습관, 메모를 전부 보관한다.
  • 🗂️ 화면 배치(대시보드 레이아웃)도 같이 저장해서, 다시 들어오면 똑같이 보이게 한다.

🔒 3. 권한 관리

  • 🔐 기본은 나만 내 데이터 접근 가능.
  • 🔗 필요하면 공유 링크를 만들어서, 다른 사람이 내 플래너를 읽기만 가능하게 할 수 있다.

⚙️ 4. 간단한 서버 기능

  • 🪄 공유 링크 기능 같은 간단한 도구들을 제공한다.

⏱️ 5. 실시간 반영

  • 📱 같은 계정으로 다른 기기에서 접속했을 때, 내가 체크하거나 수정한 내용이 바로 반영되도록 할 수 있다.

🔨 벡엔드 기능 로드맵

벡엔드 기능 로드맵


🪜 백엔드 세팅 트리

세팅에서는 보통 간결하게 최소한의 세팅만 해놓고 기능개발을 하면서 점차 확장시키면 된다.

📦 Supabase 백엔드 세팅

1) Supabase 프로젝트 만들기
   ├─ Supabase 계정 만들기
   ├─ Supabase에서 새 프로젝트 생성
   ├─ 프로젝트 주소(URL)와 공개 키(anon key) 복사
   └─ 나중에 쓸 수 있게 메모/노션에 저장

2) 로그인 기능 켜기
   ├─ 이메일/비밀번호 로그인 ON
   └─ 리다이렉트 주소 등록(로그인 후 돌아올 곳)
      ├─ http://localhost:3000/auth/callback   (개발용)
      └─ https://내-배포-도메인/auth/callback   (배포용)

3) 프론트와 연결(환경변수)
   ├─ .env.local 파일에 아래 2개 넣기
   │   ├─ NEXT_PUBLIC_SUPABASE_URL       = (프로젝트 주소)
   │   └─ NEXT_PUBLIC_SUPABASE_ANON_KEY  = (공개 키)
   └─ 앱 실행해서 에러 없는지 확인

4) 공통 준비(자동 시간/아이디)
   ├─ 랜덤 아이디 만들기 기능 켜기(pgcrypto)  ← “id” 자동생성용
   └─ updated_at 자동으로 바꿔주는 함수 만들기 ← 수정시간 자동 기록

5) 데이터 표(테이블) 만들기
   ├─ profiles           : 내 정보(닉네임, 사진 등)
   ├─ todos              : 할 일
   ├─ events_daily       : 일정(일간)
   ├─ events_weekly      : 일정(주간)
   ├─ events_monthly     : 일정(월간)
   ├─ habits             : 습관
   ├─ notes              : 메모
   └─ dashboard_layouts  : 대시보드 배치(화면 구성)
   ※ 각 표에는 공통으로 넣기: id, user_id, created_at, updated_at

6) 회원가입하면 프로필 자동 생성
   ├─ 새로 가입한 유저의 정보를 profiles에 자동으로 1줄 넣는 함수
   └─ “회원가입 발생”에 맞춰 위 함수를 실행하는 트리거

7) 접근 권한 잠그기(진짜 중요!)
   ├─ 모든 표에 “내 것만 보이게” 잠금(RLS) 켜기
   ├─ 규칙(간단 버전)
   │   ├─ 보기(SELECT)  : user_id == 로그인한 나
   │   ├─ 추가(INSERT)  : 저장하는 user_id == 로그인한 나
   │   ├─ 수정(UPDATE)  : 위와 동일
   │   └─ 삭제(DELETE)  : 위와 동일
   └─ 예외: profiles 표는 id == 로그인한 나만 보기/수정

8) 빨라지게 하기(기본 인덱스)
   ├─ todos          : (user_id), (due_date)
   ├─ events_daily   : (user_id, start_ts)
   ├─ events_weekly  : (user_id, week_start, day_of_week)
   ├─ events_monthly : (user_id, year, month, day)
   ├─ habits         : (user_id), (user_id, frequency)
   ├─ notes          : (user_id)  (태그 쓰면 GIN 인덱스 추가)
   └─ dashboard_layouts : (user_id, is_active)
      └─ “활성 레이아웃은 유저당 1개만” 제한(부분 유니크)

9) 빠른 점검(내가 제대로 했는지)
   ├─ 회원가입 해보기 → profiles에 1줄 자동으로 생기는지
   ├─ 각 표에 내 데이터 1~2줄 넣고 목록 불러오기
   ├─ 다른 계정으로 로그인해 내 데이터가 안 보이는지
   ├─ 어떤 데이터 수정했을 때 updated_at이 자동으로 바뀌는지
   └─ 목록이 빠르게 뜨는지(특히 일정/할 일)

10) (선택) 공유 링크 기능(읽기 전용)
    ├─ shares 표 만들기: owner_id, resource, resource_id, slug, is_public_read, expires_at
    ├─ slug는 링크 코드(12~16자 랜덤 문자/숫자)
    └─ 로그인 없이 보기만 가능하게 규칙 추가(만료되면 접근 불가)

🚂 벡엔드 세팅

벡엔드 세팅 들어가기 1
벡엔드 세팅 들어가기 2


🛠️ 백엔드 기능 개발 트리

┌─ 🛠️ 기능 개발
├─ 1) 🔑 인증·프로필
│ ├─ 로그인/회원가입, 세션 유지/로그아웃
│ ├─ profiles 읽기·수정(닉네임 등), 최초 로그인 시 기본값 생성
│ └─ 계정 탈퇴(내 데이터 정리 후 auth 사용자 삭제)
│
├─ 2) 📝 투두
│ ├─ 목록/추가/수정/삭제, 완료 토글
│ ├─ 정렬/필터(완료여부, 마감 임박), 페이지네이션
│ └─ RLS로 A/B 교차 접근 차단, 기본 인덱스(user_id, created_at)
│
├─ 3) 📅 일정(일간/주간/월간)
│ ├─ 기간 조회(시작/끝), 생성/수정/삭제
│ ├─ 겹침 허용 정책 정의, note(메모) 필드 옵션
│ └─ 조회 성능 확보(user_id, start_at 인덱스)
│
├─ 4) 📊 습관 & ✅ 체크
│ ├─ 습관 생성/수정/삭제, 날짜별 체크 ON/OFF
│ ├─ 주/월 합계는 우선 프론트 계산(추후 RPC 집계 가능)
│ └─ 체크 중복 방지(같은 날 한 번만)
│
├─ 5) 🗒️ 메모
│ ├─ 메모 작성/수정/삭제, 최신순 조회
│ ├─ 간단 키워드 검색(선택)
│ └─ 길이 제한 등 기본 유효성
│
├─ 6) 🖼️ 대시보드 레이아웃
│ ├─ 최초 1건 생성 규칙, layout_json 저장/불러오기
│ ├─ 버전 필드로 스키마 변경 대비(version)
│ └─ 새로고침/재로그인 시 복원 확인
│
├─ 7) 🔗 공유(읽기 전용)
│ ├─ 공유 링크 발급(slug 난수), 만료/폐기(선택)
│ ├─ /share/[slug] 읽기 전용 페이지(민감 필드 제외)
│ └─ 수정 API 차단(보기만 가능)
│
└─ 8) 🛡️ 안정화
├─ RLS 스모크 테스트(A/B 교차 차단), 에러 포맷 통일(JSON)
├─ 기본 인덱스 점검 및 쿼리 확인
└─ Postman/Insomnia로 전 기능 시연 가능 상태

0개의 댓글