백엔드 없이 빠르게 서비스를 만들고 싶을 때, Firebase가 오랫동안 대안이었다. 하지만 NoSQL의 한계, 벤더 종속, 복잡한 쿼리 문제로 이탈하는 팀이 늘어나고 있다. Supabase는 PostgreSQL을 기반으로 이 공백을 정면으로 파고든 오픈소스 BaaS다.
BaaS(Backend as a Service): 인증·데이터베이스·파일 저장소 등 백엔드 기능을 API로 제공하는 클라우드 서비스.
| 항목 | Firebase | Supabase |
|---|---|---|
| 데이터베이스 | Firestore (NoSQL) | PostgreSQL (관계형) |
| 쿼리 | 제한적 | 완전한 SQL |
| 오픈소스 | 아니오 | 예 (self-host 가능) |
| 실시간 | WebSocket | PostgreSQL Realtime |
| 벤더 종속 | 높음 | 낮음 |
SQL에 익숙하거나, 복잡한 관계형 데이터를 다뤄야 한다면 Supabase가 훨씬 자연스럽다.
Database — PostgreSQL을 그대로 사용한다. 테이블, 인덱스, Foreign Key, RLS(Row Level Security) 모두 지원한다.
Auth — 이메일/패스워드, OAuth(Google, GitHub 등), Magic Link 방식의 인증을 내장한다. JWT 기반으로 동작하며 RLS와 연동해 사용자별 데이터 접근을 제어할 수 있다.
Storage — 파일 업로드·다운로드를 위한 오브젝트 스토리지. 내부적으로 S3 호환 스토리지를 사용한다.
Realtime — PostgreSQL의 변경 사항(INSERT/UPDATE/DELETE)을 WebSocket으로 실시간 브로드캐스트한다.
Edge Functions — Deno 기반의 서버리스 함수. 인증 웹훅, 외부 API 호출 등 커스텀 로직을 엣지에서 실행한다.
RLS(Row Level Security): PostgreSQL 기능으로, 행 단위로 접근 권한을 제어한다. auth.uid와 결합해 "본인 데이터만 조회 가능" 같은 정책을 DB 레벨에서 강제할 수 있다.
클라이언트 (브라우저 / 앱)
│
▼
Supabase SDK (supabase-js)
│
┌────┴─────────────────────────┐
│ Kong API Gateway │
└──┬──────┬──────┬──────┬──────┘
│ │ │ │
PostgREST Auth Storage Realtime
│
PostgreSQL
외부 요청은 Kong을 통해 라우팅되고, PostgREST가 PostgreSQL을 REST API로 자동 노출한다. 별도의 API 서버 코드 없이 테이블을 만들면 즉시 엔드포인트가 생긴다.
PostgREST: PostgreSQL 스키마를 읽어 자동으로 RESTful API를 생성하는 서버.
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)
// 데이터 조회
const { data, error } = await supabase
.from('posts')
.select('*')
.eq('published', true)
.order('created_at', { ascending: false })
장점: SQL의 표현력, 오픈소스(벤더 종속 없음), 로컬 개발 환경 지원(supabase start), 무료 티어 제공.
단점: PostgreSQL 이외의 DB 선택지가 없음, 트래픽이 커지면 관리형 비용 증가, Edge Functions의 Deno 생태계가 Node.js보다 좁음.