데일리 플래너 프로젝트를 진행 중인데 이제 백엔드를 처음 해보려고 한다.
백엔드에서는 어렵게 생각할 필요 없다. 그냥 내 데이터를 안전하게 저장하고 불러오는 창고라고 보면 된다.
- ✉️ 이메일로 가입하고 로그인할 수 있게 만든다. (& 간편로그인 기능도 추가)
- 🙋 가입하면 자동으로 내 프로필 카드(이름, 아이디)가 하나 생긴다.
- 📝 내가 적은 투두, 일정(일간/주간/월간), 습관, 메모를 전부 보관한다.
- 🗂️ 화면 배치(대시보드 레이아웃)도 같이 저장해서, 다시 들어오면 똑같이 보이게 한다.
- 🔐 기본은 나만 내 데이터 접근 가능.
- 🔗 필요하면 공유 링크를 만들어서, 다른 사람이 내 플래너를 읽기만 가능하게 할 수 있다.
- 🪄 공유 링크 기능 같은 간단한 도구들을 제공한다.
- 📱 같은 계정으로 다른 기기에서 접속했을 때, 내가 체크하거나 수정한 내용이 바로 반영되도록 할 수 있다.
세팅에서는 보통 간결하게 최소한의 세팅만 해놓고 기능개발을 하면서 점차 확장시키면 된다.
📦 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) 🔑 인증·프로필
│ ├─ 로그인/회원가입, 세션 유지/로그아웃
│ ├─ 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로 전 기능 시연 가능 상태