Skip to main content
LadeStack LogoLadeStack
Backend as a Service 약 7분 소요 2024년 8월 12일

BaaS 플랫폼 심층 비교 분석: Firebase vs Supabase vs Appwrite

데이터 모델, 보안 아키텍처, 실시간 동기화, 서버리스 함수, 셀프 호스팅 가능 여부 및 벤더 락인 관점에서 Firebase, Supabase, Appwrite를 객관적으로 비교합니다.

Firebase, Supabase, Appwrite 아키텍처 비교 다이어그램

소개: Backend-as-a-Service의 진화

Backend-as-a-Service(BaaS) 플랫폼은 초기 단순 모바일 백엔드 지원을 넘어 현대 풀스택 웹 애플리케이션의 핵심 인프라로 자리 잡았습니다. 인증, 데이터베이스, 스토리지, 서버리스 함수를 추상화함으로써 개발팀은 고유한 비즈니스 로직 구현에 집중할 수 있습니다.

하지만 BaaS 선택은 되돌리기 어려운 중요한 아키텍처 결정입니다. 추후 플랫폼을 변경하려면 클라이언트 코드, 보안 규칙, 데이터 스키마를 전면 재작성해야 합니다. 현재 주요 세 가지 플랫폼은 서로 다른 철학을 제시합니다:

  1. Google Firebase: 완전 관리형 클라우드 BaaS로, GCP 독점 생태계와 밀접하게 통합되어 있습니다.
  2. Supabase: 오픈소스 PostgreSQL을 기반으로 구축된 관계형 BaaS로, 강력한 SQL 표준과 확장성을 제공합니다.
  3. Appwrite: 도커(Docker) 기반 컨테이너 아키텍처로 구축되어 손쉬운 셀프 호스팅과 데이터 주권을 보장합니다.

1. 플랫폼 아키텍처 비교 요약

비교 항목 Google Firebase Supabase Appwrite
기본 엔진 Cloud Firestore (NoSQL 문서형) PostgreSQL (관계형 RDBMS) MariaDB / Redis / Custom
데이터 구조 컬렉션 및 문서 테이블, 행, 관계(Foreign Key) 데이터베이스, 컬렉션, 문서
조인(JOIN) 미지원 (역정규화 필수) 완벽한 SQL JOIN 지원 내부 관계(Relationships) 지원
보안 모델 선언적 보안 규칙 (DSL) PostgreSQL 행 레벨 보안 (RLS) 문서별 권한 배열 (Permissions)
셀프 호스팅 불가 (독점 클라우드) 완전 지원 (Docker Compose / K8s) 1줄 명령어로 도커 배포 지원

2. 데이터 모델 및 쿼리 방식

Firestore (NoSQL 문서형)

Firestore는 빠른 읽기에 유리하지만 다중 조건 검색이나 관계형 데이터 집계에 제약이 있습니다:

import { collection, query, where, getDocs } from 'firebase/firestore';

const q = query(
  collection(db, 'invoices'),
  where('tenantId', '==', 'tenant_123'),
  where('status', '==', 'unpaid')
);
const snapshot = await getDocs(q);

Supabase (관계형 PostgreSQL)

PostgREST 클라이언트를 통해 단일 네트워크 요청으로 연관 테이블 데이터를 조인하여 가져올 수 있습니다:

import { supabase } from './supabaseClient';

const { data, error } = await supabase
  .from('invoices')
  .select(`
    id,
    amount_cents,
    customers (
      name,
      email
    )
  `)
  .eq('tenant_id', 'tenant_123');

3. 보안 및 권한 제어 모델

Firebase 보안 규칙

전용 문법을 사용하여 클라우드 엣지에서 검증합니다:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /invoices/{invoiceId} {
      allow read, write: if request.auth != null 
        && request.auth.token.tenant_id == resource.data.tenantId;
    }
  }
}

Supabase 행 레벨 보안 (RLS)

PostgreSQL 엔진 자체의 RLS 정책을 활용하므로 API, 마이크로서비스, 직접 접속 시에도 동일한 보안 정책이 강제됩니다:

ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;

CREATE POLICY tenant_isolation_policy ON invoices
  FOR ALL
  USING (
    tenant_id = (auth.jwt() -> 'app_metadata' ->> 'tenant_id')::uuid
  );

4. 실시간 데이터 동기화 메커니즘

  • Firebase: Firestore 실시간 스냅샷 리스너. 문서 변경 시 클라이언트 측에서 차이점(diff)을 즉시 계산하여 모바일 환경에 최적화된 상태를 유지합니다.
  • Supabase Realtime: PostgreSQL의 Write-Ahead Log(WAL)를 논리 디코딩(pgoutput)하여 Elixir Phoenix Channels 기반 웹소켓으로 클라이언트에 브로드캐스트합니다.
  • Appwrite Realtime: 내부 Redis Pub/Sub 시스템을 기반으로 웹소켓 워커를 통해 변경 이벤트를 실시간으로 전달합니다.

5. 결론 및 선택 가이드

  • Supabase를 선택해야 하는 경우: 관계형 데이터 무결성, 외래 키, 복잡한 SQL 쿼리, pgvector 기반 AI 임베딩이 필요한 대부분의 SaaS 웹 애플리케이션.
  • Firebase를 선택해야 하는 경우: 서버 관리가 전혀 필요 없는 모바일 앱, Google Analytics 및 Crashlytics와의 즉각적인 연동이 필요한 빠른 프로토타입.
  • Appwrite를 선택해야 하는 경우: 사내 데이터 규정 준수(온프레미스/데이터 주권)로 인해 독립적인 도커 컨테이너 환경에서 셀프 호스팅해야 하는 엔터프라이즈 환경.

관련 아키텍처 가이드

More Engineering Articles