들어가며
백엔드 개발의 복잡함을 해결하고자 하는 개발자들에게 BaaS(Backend-as-a-Service) 플랫폼은 더 이상 선택이 아닌 필수가 되었습니다. 그중에서도 Supabase는 PostgreSQL을 기반으로 한 오픈소스 Firebase 대안으로 빠르게 성장하며, 2020년 출시 이후 45만 명 이상의 개발자와 GitHub에서 58,000개 이상의 스타를 받으며 주목받고 있습니다.
Supabase란 무엇인가?
Supabase는 PostgreSQL을 기반으로 구축된 완전한 오픈소스 백엔드 플랫폼입니다. “Firebase의 오픈소스 대안”이라는 슬로건으로 시작했지만, 이제는 독자적인 강력한 생태계를 구축했습니다. Y Combinator, Coatue, Mozilla Corporation 등 유명 투자자들로부터 1억 1,600만 달러 이상의 투자를 유치하며 그 가능성을 인정받았습니다.
핵심 구성 요소
Supabase는 단일 프로젝트에서 다음과 같은 완전한 백엔드 서비스를 제공합니다:
- PostgreSQL 데이터베이스: 세계에서 가장 신뢰받는 관계형 데이터베이스
- PostgREST: PostgreSQL을 자동으로 RESTful API로 변환하는 서버 (Supabase는 REST API를 지원합니다!)
- Kong API Gateway: 모든 마이크로서비스를 하나의 엔드포인트로 통합하는 관문
- 인증(Authentication): 이메일/비밀번호, OAuth, 매직 링크, 전화번호 인증 등 다양한 방식 지원
- 실시간 구독(Realtime): WebSocket을 통한 데이터베이스 변경 사항 실시간 동기화
- 스토리지(Storage): 이미지, 비디오 등 대용량 파일 관리
- Edge Functions: Deno 런타임 기반의 서버리스 함수
- 벡터 임베딩(Vector): AI/ML 애플리케이션을 위한 pgvector 지원
REST API는 어떻게 제공되나요?
Supabase는 PostgREST를 사용하여 PostgreSQL 데이터베이스를 자동으로 REST API로 변환합니다. 테이블을 생성하면 즉시 CRUD API가 자동 생성됩니다:
데이터베이스 테이블 생성
↓
PostgREST가 자동 분석
↓
REST API 엔드포인트 자동 생성
↓
Kong을 통해 클라이언트에 노출
예를 들어 users 테이블을 만들면:
GET /rest/v1/users– 전체 조회POST /rest/v1/users– 생성PATCH /rest/v1/users?id=eq.1– 수정DELETE /rest/v1/users?id=eq.1– 삭제
모두 코드 작성 없이 자동으로 사용 가능합니다!
Supabase의 주요 특징
1. PostgreSQL의 강력함
Supabase는 PostgreSQL을 핵심으로 사용하여 복잡한 관계형 데이터 모델링, 조인, 트리거, 뷰 등 SQL의 모든 기능을 활용할 수 있습니다. 이는 NoSQL 기반 솔루션에서는 구현하기 어려운 복잡한 쿼리와 데이터 정합성을 보장합니다.
2. Row Level Security (RLS)
데이터베이스 레벨에서 직접 보안 정책을 정의할 수 있는 RLS는 Supabase의 가장 강력한 기능 중 하나입니다. SQL로 세밀한 접근 제어를 구현할 수 있어, 각 사용자가 자신의 데이터만 접근하도록 보장합니다.
-- 사용자가 자신의 데이터만 조회할 수 있도록 하는 정책
CREATE POLICY "Users can view own data"
ON profiles FOR SELECT
USING (auth.uid() = user_id);
3. 실시간 기능
PostgreSQL의 복제 로그를 활용한 실시간 구독 기능으로 채팅 앱, 협업 도구, 라이브 대시보드 등을 쉽게 구현할 수 있습니다. 데이터베이스의 모든 변경 사항이 자동으로 클라이언트에 푸시됩니다.
4. AI 지원 SQL 편집기
2024년 출시된 AI 기반 SQL 편집기는 자연어로 쿼리를 설명하면 자동으로 SQL 코드를 생성해줍니다. 테이블 생성, 복잡한 조인 쿼리, 최적화 등을 AI의 도움으로 빠르게 처리할 수 있습니다.
5. 벡터 데이터베이스 기능
pgvector 확장을 통해 AI/ML 애플리케이스를 위한 벡터 임베딩을 저장하고 쿼리할 수 있습니다. 시맨틱 검색, 이미지 유사도 검색 등 최신 AI 기능을 데이터베이스에서 직접 처리할 수 있습니다.
6. 완전한 오픈소스
Supabase의 모든 핵심 서비스는 오픈소스이며, 자체 호스팅이 가능합니다. 벤더 락인(vendor lock-in) 없이 언제든지 마이그레이션할 수 있어 장기적인 프로젝트에 안정적입니다.
유사 솔루션과의 비교
Supabase vs Firebase
Firebase는 Google이 소유한 성숙한 BaaS 플랫폼이지만, Supabase와는 근본적인 차이가 있습니다.
데이터베이스 아키텍처
- Firebase: NoSQL 문서 기반 데이터베이스(Firestore)로 비구조화 데이터에 적합
- Supabase: PostgreSQL 관계형 데이터베이스로 구조화된 데이터와 복잡한 관계에 최적
Firebase의 NoSQL 방식은 프로토타이핑에는 빠르지만, 데이터 관계가 복잡해질수록 클라이언트 측에서 조인을 처리하거나 데이터를 비정규화해야 하는 문제가 있습니다. 반면 Supabase는 SQL의 강력한 조인, 외래 키, 인덱스를 처음부터 활용할 수 있습니다.
오픈소스 vs 독점
- Firebase: Google 소유의 독점 플랫폼으로 자체 호스팅 불가
- Supabase: 완전한 오픈소스로 자체 호스팅 및 코드 수정 가능
가격 모델
- Firebase: 읽기/쓰기/삭제 횟수 기반 과금으로 예측하기 어려움
- Supabase: 데이터 저장 용량 기반 과금으로 비용 예측이 명확
보안 규칙
- Firebase: JavaScript 유사 구문의 보안 규칙로, 대규모에서 디버깅이 어려움
- Supabase: SQL 기반 RLS로 데이터베이스 레벨의 세밀한 제어 가능
실시간 기능
- Firebase: 오프라인 우선 설계로 모바일 앱에 최적화
- Supabase: 서버 주도 변경 추적으로 데이터 일관성에 강점
어떤 것을 선택해야 할까?
Firebase를 선택하는 경우:
- NoSQL 데이터 모델이 적합한 프로젝트
- Google Cloud 생태계와의 통합이 중요한 경우
- 오프라인 우선 모바일 앱
- 빠른 프로토타이핑이 최우선인 경우
Supabase를 선택하는 경우:
- 복잡한 관계형 데이터 모델이 필요한 경우
- SQL 쿼리의 강력함이 필요한 프로젝트
- 오픈소스와 데이터 이식성이 중요한 경우
- 자체 호스팅이나 커스터마이징이 필요한 경우
- 투명하고 예측 가능한 비용 구조를 원하는 경우
Docker Compose로 Supabase 자체 구성하기
Supabase의 가장 큰 장점 중 하나는 자체 호스팅이 가능하다는 점입니다. Docker Compose를 사용하면 로컬 또는 자체 서버에서 Supabase를 쉽게 실행할 수 있습니다.
사전 요구사항
- Docker 및 Docker Compose 설치
- Git 설치
- 최소 2GB RAM (권장 4GB 이상)
기본 설치 과정
# Supabase 저장소 클론
git clone --depth 1 https://github.com/supabase/supabase
# Docker 폴더로 이동
cd supabase/docker
# 환경 변수 파일 복사
cp .env.example .env
# Docker Compose 시작
docker compose up -d
환경 변수 설정
.env 파일을 열어 다음 필수 값들을 변경해야 합니다:
# PostgreSQL 데이터베이스 비밀번호
POSTGRES_PASSWORD=your-super-secret-postgres-password
# JWT 시크릿 (최소 32자)
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters
# API URL 설정
SITE_URL=http://localhost:3000
API_EXTERNAL_URL=http://localhost:8000
# SMTP 설정 (이메일 인증용)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-email-password
SMTP_ADMIN_EMAIL=admin@yourdomain.com
JWT 키 생성
보안을 위해 고유한 JWT 키를 생성해야 합니다:
# 40자 랜덤 문자열 생성
openssl rand -base64 32
# 생성된 문자열을 JWT_SECRET에 사용
Supabase 공식 사이트의 JWT 생성기를 사용하여 JWT_SECRET으로 ANON_KEY와 SERVICE_ROLE_KEY를 생성할 수 있습니다.
Docker Compose 파일 구조 및 아키텍처
Supabase는 마이크로서비스 아키텍처로 구성되어 있으며, 각 서비스는 독립적으로 실행됩니다. 여기서 Kong API Gateway가 핵심적인 역할을 합니다.
Kong API Gateway의 역할
Kong은 **단일 진입점(Single Entry Point)**으로 작동하여 여러 마이크로서비스를 하나의 통합된 API로 제공합니다:
클라이언트의 요청 흐름:
클라이언트 → Kong (포트 8000) → 경로별 라우팅
↓
┌───────────────┼───────────────┬───────────────┐
↓ ↓ ↓ ↓
PostgREST GoTrue Storage Realtime
(포트 3000) (포트 9999) (포트 5000) (포트 4000)
Kong이 처리하는 경로:
/rest/v1/*→ PostgREST (데이터베이스 REST API)/auth/v1/*→ GoTrue (인증 서비스)/storage/v1/*→ Storage (파일 관리)/realtime/v1/*→ Realtime (실시간 구독)/functions/v1/*→ Edge Functions (서버리스 함수)
Kong의 주요 기능:
- 통합 라우팅: 모든 서비스를 하나의 포트로 통합
- 인증 및 보안: JWT 토큰 검증, API 키 관리
- CORS 처리: 크로스 오리진 요청 자동 처리
- Rate Limiting: API 사용량 제한
- 로깅 및 모니터링: 중앙 집중식 로그 관리
Docker Compose 서비스 구성
services:
# Kong API Gateway - 모든 서비스의 단일 진입점
kong:
image: kong:2.8.1
ports:
- "8000:8000" # HTTP
- "8443:8443" # HTTPS (선택)
environment:
KONG_DATABASE: "off"
KONG_DECLARATIVE_CONFIG: /var/lib/kong/kong.yml
volumes:
- ./volumes/api/kong.yml:/var/lib/kong/kong.yml
depends_on:
- auth
- rest
- realtime
- storage
# PostgreSQL 데이터베이스
db:
image: supabase/postgres:latest
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./volumes/db/data:/var/lib/postgresql/data
# PostgREST - PostgreSQL을 자동으로 REST API로 변환
rest:
image: postgrest/postgrest:latest
environment:
PGRST_JWT_SECRET: ${JWT_SECRET}
PGRST_DB_URI: postgres://postgres:${POSTGRES_PASSWORD}@db:5432/postgres
PGRST_DB_SCHEMA: public,storage
PGRST_DB_ANON_ROLE: anon
depends_on:
- db
# GoTrue - JWT 기반 인증 서비스
auth:
image: supabase/gotrue:latest
environment:
GOTRUE_JWT_SECRET: ${JWT_SECRET}
GOTRUE_SITE_URL: ${SITE_URL}
GOTRUE_DB_DRIVER: postgres
depends_on:
- db
# Realtime - WebSocket 기반 실시간 구독
realtime:
image: supabase/realtime:latest
environment:
DB_HOST: db
DB_PORT: 5432
PORT: 4000
JWT_SECRET: ${JWT_SECRET}
depends_on:
- db
# Storage - S3 호환 파일 스토리지
storage:
image: supabase/storage-api:latest
environment:
POSTGREST_URL: http://rest:3000
PGRST_JWT_SECRET: ${JWT_SECRET}
depends_on:
- db
- rest
# Supabase Studio - 웹 기반 관리 대시보드
studio:
image: supabase/studio:latest
ports:
- "3000:3000"
environment:
SUPABASE_URL: http://kong:8000
SUPABASE_ANON_KEY: ${ANON_KEY}
STUDIO_PG_META_URL: http://meta:8080
depends_on:
- kong
# Meta - 데이터베이스 메타데이터 API
meta:
image: supabase/postgres-meta:latest
ports:
- "8080:8080"
environment:
PG_META_DB_HOST: db
PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD}
depends_on:
- db
중요: 클라이언트 애플리케이션은 **Kong의 포트(8000)**만 알면 되고, 각 마이크로서비스의 개별 포트를 알 필요가 없습니다. 이것이 API Gateway 패턴의 핵심 장점입니다.
접속 및 사용
서비스가 모두 시작되면:
- Supabase Studio:
http://localhost:3000- 기본 로그인:
supabase/this_password_is_insecure_and_should_be_updated
- 기본 로그인:
- API Gateway:
http://localhost:8000 - PostgreSQL:
localhost:5432- 사용자:
postgres - 비밀번호:
.env에서 설정한 값
- 사용자:
유용한 Docker 명령어
# 로그 확인
docker compose logs -f
# 특정 서비스 로그 확인
docker compose logs -f studio
# 서비스 재시작
docker compose restart
# 서비스 중지
docker compose down
# 데이터 볼륨까지 완전 삭제
docker compose down -v
# 서비스 상태 확인
docker compose ps
# 특정 서비스만 재시작
docker compose restart auth
프로덕션 배포 시 고려사항
프로덕션 환경에서 자체 호스팅할 때는 다음 사항들을 반드시 고려해야 합니다:
1. 보안 강화
# 강력한 비밀번호 생성
POSTGRES_PASSWORD=$(openssl rand -base64 32)
JWT_SECRET=$(openssl rand -base64 32)
# 기본 Studio 비밀번호 변경
DASHBOARD_USERNAME=your-admin-username
DASHBOARD_PASSWORD=your-secure-password
2. HTTPS 설정
Nginx나 Traefik을 리버스 프록시로 사용하여 SSL/TLS를 구성합니다.
3. 백업 설정
# PostgreSQL 백업 스크립트
#!/bin/bash
docker exec supabase-db pg_dump -U postgres postgres > backup_$(date +%Y%m%d_%H%M%S).sql
4. 리소스 제한
services:
db:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
memory: 2G
5. 모니터링
Prometheus와 Grafana를 통합하여 서비스 상태를 모니터링합니다.
외부 PostgreSQL 사용하기
이미 운영 중인 PostgreSQL이 있다면 Supabase의 DB 컨테이너 대신 외부 데이터베이스를 사용할 수 있습니다:
# .env 파일 수정
POSTGRES_HOST=your-external-db.example.com
POSTGRES_PORT=5432
POSTGRES_DB=your_database
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your-password
# docker-compose.yml에서 db 서비스 주석 처리
외부 데이터베이스를 사용하려면 Supabase 마이그레이션을 먼저 실행해야 합니다.
업데이트 및 유지보수
# 최신 이미지 가져오기
docker compose pull
# 서비스 재시작으로 업데이트 적용
docker compose up -d
# 특정 서비스만 업데이트
docker compose pull studio
docker compose up -d studio
클라이언트 연결 예제
자체 호스팅한 Supabase에 연결하는 방법:
JavaScript/TypeScript
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = 'http://localhost:8000'
const supabaseKey = 'your-anon-key-from-env'
const supabase = createClient(supabaseUrl, supabaseKey)
// 데이터 조회
const { data, error } = await supabase
.from('users')
.select('*')
// 실시간 구독
supabase
.channel('public:users')
.on('postgres_changes',
{ event: '*', schema: 'public', table: 'users' },
(payload) => {
console.log('Change received!', payload)
}
)
.subscribe()
Python
from supabase import create_client, Client
url: str = "http://localhost:8000"
key: str = "your-anon-key"
supabase: Client = create_client(url, key)
# 데이터 조회
response = supabase.table("users").select("*").execute()
# 데이터 삽입
data = supabase.table("users").insert({
"name": "John Doe",
"email": "john@example.com"
}).execute()
비용 및 가격 정책
Supabase 호스팅 서비스
Supabase는 무료 티어부터 엔터프라이즈까지 다양한 플랜을 제공합니다:
Free 티어
- 500MB 데이터베이스
- 1GB 파일 스토리지
- 5GB 대역폭
- 50,000 월간 활성 사용자
- 7일 후 자동 일시정지
Pro 티어 ($25/월)
- 8GB 데이터베이스
- 100GB 파일 스토리지
- 250GB 대역폭
- 100,000 월간 활성 사용자
- 일시정지 없음
- 이메일 지원
Team 티어 ($599/월)
- Pro 기능 포함
- 우선 지원
- SOC2 인증
- 프로젝트별 권한 관리
자체 호스팅 비용
자체 호스팅 시 클라우드 서버 비용만 발생:
- 소규모: DigitalOcean Droplet (2GB RAM, 1 vCPU) – 약 $12/월
- 중규모: AWS EC2 t3.medium (4GB RAM, 2 vCPU) – 약 $35/월
- 대규모: 전용 서버 또는 Kubernetes 클러스터
실제 사용 사례
Supabase는 다양한 규모의 프로젝트에서 성공적으로 사용되고 있습니다:
- 스타트업: 5개월 만에 $1M 수익을 달성한 AI 앱
- 엔터프라이즈: 7개월 만에 100만 명의 사용자를 확보한 서비스
- 배달 플랫폼: Maergo Express의 확장성과 비용 절감 달성
마치며
Supabase는 PostgreSQL의 강력함과 현대적인 개발자 경험을 결합한 탁월한 BaaS 플랫폼입니다. 오픈소스라는 특성 덕분에 벤더 락인 없이 자유롭게 사용할 수 있으며, 자체 호스팅을 통해 완전한 제어권을 가질 수 있습니다.
복잡한 관계형 데이터, SQL의 강력함, 그리고 투명한 가격 정책이 필요한 프로젝트라면 Supabase는 최고의 선택이 될 것입니다. 특히 2024년 정식 GA(General Availability) 출시 이후 엔터프라이즈급 기능들이 추가되면서, 이제는 프로토타입부터 대규모 프로덕션까지 모든 단계에서 신뢰할 수 있는 플랫폼으로 자리잡았습니다.