Intro

웹 애플리케이션을 개발할 때 인증(Auth)데이터베이스(Database)는 빠질 수 없는 핵심 요소입니다. 하지만 이 분야에 익숙하지 않은 개발자라면, 아키텍처를 어떻게 설계해야 할지, 어떤 DBMS를 선택해야 할지조차 막막하게 느껴질 수 있습니다.

저 역시 AI 엔지니어로서 인증 시스템이나 데이터베이스 설계에 깊은 경험이 있지는 않습니다. 서비스를 빠르게 만들고 검증하는 데 집중하고 싶은데, 백엔드 인프라 구축에 많은 시간을 쏟는 건 쉽지 않은 일이었습니다.

이런 고민을 해결해준 것이 바로 Supabase입니다.

Supabase는 오픈 소스 기반의 Firebase 대안으로 주목받는 BaaS(Backend as a Service) 플랫폼입니다. PostgreSQL을 기반으로 하며, 인증, 데이터베이스, 실시간 기능, 파일 스토리지 등 웹 앱 개발에 필요한 대부분의 백엔드 기능을 통합 제공하고 있습니다. 최근에는 MCP(Model Context Protocol)를 통해 AI 인터페이스와의 연동까지 지원하면서, 개발 워크플로우에 새로운 가능성을 제시하고 있기도 합니다.

그리고 무엇보다 “무료”로 대부분의 기능을 활용할 수 있다는 큰 장점이 있습니다.

이번 글에서는 제가 실제로 활용 중인 Supabase의 주요 기능 중 Auth, Database, 그리고 MCP(with Cursor) 기능에 대해 중점적으로 소개해 보겠습니다. 특히 저처럼 백엔드에 익숙하지 않지만 서비스를 빠르게 개발하고 싶은 분들께 Supabase가 얼마나 실용적인 선택지인지 공유드리고자 합니다.


Supabase Auth

Supabase Auth는 애플리케이션에 인증/인가 기능을 손쉽게 구현할 수 있게 해줍니다. 클라이언트 SDK와 API endpoint를 통해 새로운 유저를 등록하고 관리할 수 있습니다.

  • 다양한 인증 방법 지원: Supabase Auth는 이메일/비밀번호, 소셜 로그인(OAuth), 전화 OTP, 싱글 사인온(SSO) 등 인기 있는 다양한 인증 방식을 지원합니다예를 들어 구글, 페이스북, 깃허브, 애플 등의 소셜 계정으로 손쉽게 로그인 기능을 구현할 수 있습니다. 개발자는 몇 줄의 코드만으로 supabase.auth.signInWithOAuth({ provider: ‘google’ }) 등의 메소드를 호출해 OAuth 로그인을 처리할 수 있고, UI에도 Supabase가 제공하는 위젯이나 직접 구현을 활용하면 됩니다. 이러한 소셜 로그인 지원으로 사용자는 별도 회원가입 절차 없이도 익숙한 계정으로 앱을 이용할 수 있어 온보딩 경험이 향상되고, 개발자는 OAuth 흐름과 토큰 관리를 간소화할 수 있습니다.
Supabase 로그인 UI 예시

Supabase 로그인 UI 예시 (이메일 기반 + 구글(소셜) 로그인)

  • 매직 링크(Magic Link) 로그인: 매직링크는 비밀번호 없이 이메일 링크를 통해 로그인하는 패스워드리스(passwordless) 인증 방식입니다. 사용자가 이메일로 전송된 1회용 링크를 클릭하면 즉시 로그인되므로, 번거로운 비밀번호 생성/관리 과정을 없앨 수 있습니다. 이는 사용자 경험을 개선하고, 비밀번호 유출 등의 보안 위험을 줄이는 장점이 있습니다. Supabase에서는 매직링크 기능이 기본 활성화되어 있으며, 별도 설정 없이도 supabase.auth.signInWithOtp({ email }) 메소드를 호출해 매직링크를 발송할 수 있습니다. 매직링크를 사용하면 사용자에게는 “로그인 링크를 이메일로 보냈습니다”와 같은 안내만 하면 되므로, 로그인 UX가 매우 간단해집니다. 또한 비밀번호 리셋이나 복구 처리에 대한 부담도 줄어들어 개발/운영 측면에서도 효율적입니다.

  • 강력한 보안: Row-Level Security(RLS): Supabase의 가장 강력한 보안 기능 중 하나는 Postgres의 Row-Level Security를 활용한 세밀한 권한 제어입니다. RLS를 사용하면 각 사용자별 데이터 접근 권한을 데이터베이스 레벨에서 강제할 수 있습니다

    Supabase Auth는 발급한 JWT 토큰을 Postgres와 연계하여, 테이블에 RLS 정책을 설정하면 해당 사용자의 user_id나 역할에 따라 자동으로 행 단위 필터링이 이루어집니다. 예를 들어 자신이 소유한 todo 항목만 조회할 수 있도록 todos 테이블에 아래와 같은 RLS 정책을 정의할 수 있습니다:

    -- 사용자가 자신의 todo만 조회할 수 있도록 하는 RLS 정책 예시
    create policy "Individuals can view their own todos"
      on todos for select
      using ((auth.uid()) = user_id);
    

    위 정책은 todos 테이블에서 select(조회) 시 JWT의 사용자 ID(auth.uid()로 얻음)와 각 행의 user_id를 비교하여 일치하는 행만 허용합니다.

    이렇게 하면 클라이언트가 실수로 잘못된 쿼리를 보내거나 토큰을 변조하더라도 데이터베이스 레벨에서 권한이 없는 데이터는 절대 조회/수정되지 않는 강력한 보안망이 형성됩니다. Supabase는 이러한 RLS 정책을 대시보드 UI에서도 쉽게 관리할 수 있게 해주며, 새 테이블 생성 시 기본적으로 RLS를 활성화하도록 권장하고 있습니다.

    결과적으로 Auth와 RLS의 연계로 클라이언트에서 데이터베이스까지 이어지는 end-to-end 보안이 구현되어, 추가 서버 레이어 없이 안전한 데이터 접근이 가능합니다.

이처럼 Supabase Auth는 다양한 인증 옵션과 데이터베이스 수준의 보안을 제공하여 편의성과 안전성을 모두 충족합니다. 소셜 로그인과 매직링크로 사용자 경험을 높이고, RLS로 치밀한 권한 관리를 구현하면, 별도 백엔드 서버 없이도 프로덕션 수준의 인증 체계를 구축할 수 있습니다.


Supabase Database

Supabase의 데이터베이스는 완전한 관리형 PostgreSQL 인스턴스로 제공되며, 이를 통해 개발자는 관계형 DB의 풍부한 기능을 그대로 활용할 수 있습니다.

즉, SQL 쿼리, 조인, 트랜잭션, 스토어드 프로시저, 트리거 등 Postgres의 모든 기능을 사용할 수 있고, Supabase는 여기에 추가로 BaaS에 적합한 부가기능들을 통합했습니다. Supabase Database의 주요 강점들을 살펴보겠습니다.

익숙한 PostgreSQL, 완전한 제어권

Supabase 프로젝트를 생성하면 Postgres 데이터베이스가 통째로 하나 주어지는 것과 동일합니다. 개발자는 해당 DB에 postgres 슈퍼유저 권한으로 접근할 수 있으며, 로우레벨의 쿼리부터 DB 확장 설치까지 제약 없이 다룰 수 있습니다.

이는 Firebase와 달리 자유도가 매우 높고 성능 튜닝이나 쿼리 최적화, 인덱스 설정 등을 DBA 수준으로 제어할 수 있음을 의미합니다. 또한 데이터베이스 백업/복구 기능을 Supabase가 관리형으로 제공하여 안심하고 데이터를 운영할 수 있습니다.

요약하면, Supabase는 개발 편의를 위해 추상화된 NoSQL이 아니라 검증된 오픈소스 RDBMS를 기반으로 하여 개발 속도와 안정성 두 마리 토끼를 잡은 셈입니다.

실시간 쿼리 및 데이터 업데이트

Supabase는 Postgres에 Realtime 기능을 확장하여, 데이터 변경을 실시간으로 수신(subscribe)할 수 있게 합니다. 예를 들어 클라이언트 앱에서 특정 테이블에 대한 INSERT/UPDATE/DELETE 이벤트를 구독해두면, 해당 테이블에 새로운 데이터가 들어오거나 변경될 때마다 웹소켓을 통해 실시간 알림을 받을 수 있습니다.

이를 활용하면 별도의 푸시 서버나 폴링 없이도 라이브 업데이트 UI를 쉽게 구축할 수 있습니다. 실제로 Supabase의 Realtime 서버는 Postgres의 논리적 복제를 이용하여 데이터 변경을 감지하고 브라우저로 전송해주며, 개발자는 Supabase JS SDK 등을 통해 간단하게 이를 구독할 수 있습니다. 아래는 JavaScript 클라이언트에서 todos 테이블의 모든 변경을 실시간으로 구독하는 예시입니다:

const channel = supabase.channel('table-db-changes');
channel.on(
  'postgres_changes', 
  { event: '*', schema: 'public', table: 'todos' }, 
  payload => { console.log('Change received!', payload); }
).subscribe();

위와 같이 구독해두면 다른 사용자가 todo를 추가하거나 완료 상태를 변경했을 때 즉각적으로 payload가 전달되어 옵니다. Supabase Realtime은 특정 이벤트만 필터링하거나 특정 조건의 변경만 듣는 것도 가능해 유연하게 활용할 수 있습니다.

이러한 실시간 기능 덕분에 채팅 애플리케이션, 공동 편집 도구, 대시보드 등에 데이터 일치성과 즉각성을 부여할 수 있으며, 아키텍처적으로도 클라이언트 <-> DB 간 직접 실시간 연결로 단순하고 확장성 있는 구성이 가능합니다. (Supabase Realtime은 내부적으로 Elixir로 구현되어 수만 개 이상의 동시 커넥션 처리도 견딜 수 있도록 설계되었습니다.)

확장성과 성능 최적화

Supabase의 데이터 레이어는 프로덕션 수준의 부하를 견딜 수 있도록 설계되었습니다. 기본적으로 단일 Postgres 인스턴스로 시작하지만, 필요에 따라 수직 확장(인스턴스 스펙 업그레이드)이 가능하고 리플리카 추가를 통해 읽기 부하 분산도 지원합니다. Supabase는 “Build in a weekend, scale to millions”라는 슬로건대로 작은 프로젝트부터 시작해도 뒤에서 대규모 트래픽으로 확장할 수 있다고 홍보하고 있습니다.

또한 연결 풀링과 쿼리 최적화 도구(Supavisor 등)를 제공하여 많은 동시 연결 상황에서도 안정적인 성능을 유지하도록 돕습니다. 개발자는 일반 Postgres에서와 마찬가지로 인덱스 생성, 파티셔닝, 쿼리 플래너 힌트 등을 활용해 성능을 튜닝할 수 있으며, Supabase 대시보드의 모니터링 도구나 쿼리 성능 분석기를 통해 병목을 찾고 해결할 수도 있습니다.

이런 기능들은 모두 오픈소스 PostgreSQL의 강력함에서 비롯된 것으로, Supabase는 그 위에 개발 편의 기능을 더하면서도 성능과 확장성 측면에서는 기존 RDBMS의 신뢰성을 그대로 제공합니다.

Foreign Tables (외부 데이터 연동) 지원

Supabase Database가 제공하는 뛰어난 기능 중 하나는 Postgres Foreign Data Wrappers(FDW) 기능을 손쉽게 활용할 수 있다는 점입니다. 이를 통해 다른 데이터베이스나 외부 API의 데이터를 마치 로컬 테이블처럼 질의할 수 있습니다.

Supabase는 Rust로 작성된 오픈 소스 Wrappers 프레임워크를 사용하여 다양한 외부 시스템과의 연결을 지원하고 있는데, 예를 들어 외부의 또 다른 Postgres, MySQL, Firebase의 컬렉션, Stripe의 결제 데이터, GitHub API 등 거의 모든 종류의 원격 데이터 소스를 Foreign Table로 연결할 수 있습니다. 예를 들어 Stripe 결제 내역을 직접 DB 질의에 활용하고 싶다면, Supabase에 Stripe용 Foreign Table을 생성해두고 SELECT * FROM stripe_payments와 같이 조회할 수 있습니다.

실제로 Supabase 문서에서는 subscriptions라는 Foreign Table을 만들어 Stripe 구독 정보를 읽거나, collections 테이블을 만들어 Firebase 컬렉션 데이터를 Postgres 쿼리로 가져오는 예시를 소개합니다.

이렇게 하면 외부 시스템의 데이터를 정기적으로 ETL하여 복제할 필요 없이 실시간 조회가 가능하고, 조인도 직접 수행할 수 있어 데이터 통합의 편의성이 크게 향상됩니다. Supabase 대시보드에서는 몇 가지 설정만으로 이러한 외부 연동을 구성할 수 있으며, Foreign Table도 일반 테이블처럼 취급되어 Supabase의 실시간 기능이나 보안 정책을 동일하게 적용할 수 있습니다. 이를 활용하면 한 곳에서 다양한 데이터 소스를 관제하고 조합하여 사용할 수 있으므로, 데이터 레이어의 유연성 측면에서 큰 이점을 얻을 수 있습니다.

이 외에도 Supabase Database는 풍부한 확장(Extension) 지원을 통해 PostGIS(지리정보), pg_trgm(유사 문자 검색), pg_vector(벡터 유사도 검색) 등 수십 가지의 Postgres 확장을 클릭 한 번으로 설치하여 사용할 수 있습니다. 또, 데이터베이스에 변경이 발생하면 자동으로 RESTful API 및 GraphQL API에 반영해주는 Instant API 기능도 제공되어, DB 스키마만 설계하면 즉시 백엔드 API가 구성되는 생산성도 누릴 수 있습니다. 요컨대 Supabase의 데이터베이스 계층은 전통적 RDBMS의 안정성과 기능성에 현대적 개발 편의성(실시간, 확장, 자동 API, 외부 연동)을 결합한 강력한 솔루션입니다.


MCP (Model Context Protocol)

Supabase의 MCP(Model Context Protocol) 기능은 개발 워크플로우에 AI 어시스턴트를 접목시킨 새로운 시도입니다. MCP는 대규모 언어 모델(LLM)을 Supabase에 연결해 주는 표준 프로토콜로서, Cursor와 같은 AI 코딩 도구와 연동하면 채팅 인터페이스를 통해 데이터베이스를 제어할 수 있습니다.

Cursor를 예로 Supabase MCP를 활용하는 방법에 대해 알아보겠습니다.

Supabase MCP를 사용하기 위해서는 현재 작업중인 프로젝트에 .cursor/mcp.json 파일에 아래와 같은 configration을 설정해야 합니다.

{
  "mcpServers": {
    "supabase": {
      "command": "npx",
      "args": [
        "-y",
        "@supabase/mcp-server-supabase@latest",
        "--access-token",
        "<personal-access-token>"
      ]
    }
  }
}

여기서 을 여러분의 personal access token으로 바꿔야 합니다. 이후 Cursor Settings의 MCP탭에서 Supabase MCP를 활성화 시켜줍니다.

자 이제 우측 채팅창에서 실제로 Supabase MCP를 사용해 보겠습니다.

시나리오는 이미지 생성 기능을 개발했다고 했을때 유자가 이미지를 생성할때 사용한 파라미터와 이미지가 저장된 s3 url을 저장하기 위한 테이블이 필요하다고 가정해 보겠습니다.

위와같은 프롬프트를 입력했을때 “supabase” 라는 키워드를 통해 Cursor가 MCP를 활용하게 됩니다. 먼저 제 계정의 프로젝트 리스트를 검색한뒤에 적절한 프로젝트를 찾았습니다.

이후 apply_migration 이라는 툴을 통해 테이블을 생성하는 쿼리를 작성합니다. 이 작업을 수행하게 되면 아래 이미지처럼 프로젝트에 generated_images 라는 테이블이 생성된 것을 대시보드에서 볼 수 있습니다.

그런데 보니까 어떤 유저가 만들었는지 파악하기 위한 user_id가 없네요. 채팅에서 이 컬럼을 추가하고 updated_at 컬럼은 필요없으니 제거해 보겠습니다.

테이블이 잘 수정되었습니다. 여러분이 데이터베이스를 구축하고 sql을 배우지 않아도 개발을 하면서 바로바로 데이터를 저장하기위해 필요로 하는 테이블을 생성하거나, 기능 수정으로 특정 컬럼을 수정하는 작업을 프롬프트에서 수행할수 있어 개발에 집중할 수 있습니다.

기존 SQL 에디터와의 차이점 및 효율성

Supabase 대시보드에는 기본적으로 SQL Editor가 내장되어 있어 수동으로 쿼리를 작성하고 실행할 수 있습니다. 하지만 MCP with Cursor를 활용하면 다음과 같은 차별점과 효율성을 누릴 수 있습니다:

  • 자연어를 통한 빠른 명령 실행: SQL 에디터에서는 개발자가 정확한 SQL 구문을 직접 작성해야 하지만, MCP 환경에서는 원하는 작업을 자연어로 설명하면 됩니다. 특히 복잡한 쿼리나 DDL(Data Definition Language) 작성 시 문법을 일일이 찾아볼 필요 없이 AI가 대체해주므로 속도가 빨라집니다. 개발자는 의도만 표현하면 되니, 학습 곡선도 완화됩니다.
    이는 프로젝트 초기 데이터 모델 설계 단계에서 큰 도움이 되는데, Supabase 팀의 예시처럼 “하고 싶은 내용을 설명하면 AI가 ER 다이어그램과 SQL 마이그레이션을 알아서 만들어준다”는 발상이 현실화된 것입니다

  • AI의 맥락 인지 및 다중 작업: MCP의 또 다른 장점은 AI가 DB 스키마와 이전 대화 맥락을 기억하기 때문에 연속적인 작업에 유리하다는 점입니다. 예를 들어 한 테이블을 만든 뒤 곧바로 관련 FOREIGN KEY 제약을 추가하거나 더미 데이터를 삽입하라고 지시하면, AI는 방금 만든 테이블 구조를 이미 알고 있으므로 추가 작업을 맥락에 맞게 정확히 처리합니다.
    또한 Supabase의 MCP 통신은 AI에게 일정 수준의 자율권을 부여하므로, 사용자가 명시적으로 확인하지 않아도 여러 SQL 문을 연속 실행하여 결과를 내줄 수 있습니다. (물론 의도치 않은 변경을 막기 위해 적절한 환경에서 테스트하는 것이 좋지만, 로컬 개발이나 샌드박스 DB에서는 이러한 자동화가 개발 속도를 높여줍니다.) 전통적인 SQL 에디터라면 한 쿼리 실행 후 결과 확인, 다음 쿼리 작성 등의 순차적 작업이 필요하지만, AI 어시스턴트는 목표 달성을 위해 내부적으로 여러 스텝을 알아서 수행해주는 것입니다.

  • 학습과 오류 수정 피드백: SQL 작성에 미숙한 개발자라면 MCP 환경에서 AI를 통해 학습 효과도 얻을 수 있습니다. 예를 들어 잘못된 요청을 하면 AI가 피드백을 주거나, SQL 오류가 발생할 경우 해당 에러를 읽고 AI가 스스로 쿼리를 수정(repair)하는 모습도 볼 수 있습니다. Supabase의 AI 보조 기능은 쿼리 에러를 LLM에 전달하여 자동으로 몇 차례 수정 시도를 하는 self-healing 메커니즘도 실험하고 있습니다. 이러한 과정을 지켜보면서 개발자는 올바른 SQL 패턴을 자연스럽게 습득하거나, 모범 사례를 제안받아 코드 품질을 높이는 이점이 있습니다.

요약하면, Supabase의 MCP + Cursor 조합은 데이터베이스와 상호작용하는 새로운 방식을 제시합니다. 이는 일반 SQL 에디터 사용 대비 생산성을 향상시키고 인적 오류를 줄이며, 동시에 AI의 제안을 통해 더 나은 설계/구현을 도모할 수 있게 합니다. 아직은 초기 단계의 도구이지만, 빠르게 발전하는 추세이며 Supabase 공식 문서에서도 Cursor, VS Code Copilot 등과의 MCP 연동 가이드를 제공하여 누구나 시도해볼 수 있도록 하고 있습니다. 향후에는 이 AI 통합이 데이터베이스 관리의 표준 중 하나로 자리잡을 가능성도 있으며, 숙련된 개발자일수록 이러한 도구를 잘 활용하여 반복적인 작업을 자동화하고 보다 중요한 로직에 집중하는 방향으로 나아갈 것이라 기대됩니다.


Conclusion

Supabase는 인증(Auth), 데이터베이스(Database), 실시간 기능(Realtime), 스토리지(Storage) 등 웹/모바일 앱 백엔드에 필요한 요소를 통합 제공하여 개발 생산성을 극대화하는 BaaS 플랫폼입니다.

저는 Supabase를 무료버전으로 사용중이며 소셜 로그인, 데이터베이스를 주로 활용하고 있습니다.

Supabase Auth를 통해 신뢰성 있는 사용자 관리를 신경쓰지 않아도 되고 Supabase Database로 쉽게 데이터를 저장 및 관리할 수 있기 때문에 아이디어 구현에 대부분의 시간을 쏟을 수 있게 되었습니다.

이미 많은 스타트업과 개발자들이 Firebase에서 Supabase로 갈아타거나 신규 프로젝트에 도입하고 있으며, 공식 문서와 커뮤니티도 활발하여 실무 적용에 큰 무리가 없습니다. Supabase는 오픈 소스이므로 자체 호스팅이나 기능 기여도 가능하고, 반대로 클라우드 호스팅을 통해 관리형 서비스의 편리함도 취할 수 있습니다.

이러한 유연성까지 고려하면 Supabase는 중급~고급 개발자에게 로우 레벨 제어와 고수준 추상의 밸런스를 제공하는 매력적인 선택지라 할 수 있습니다. 앞으로도 발전될 Supabase의 기능들을 주목하면서, 프로젝트에 적극 활용해 보시길 권합니다.

Keep going

Docs: https://supabase.com/docs

Updated:

Leave a comment