일반

Supabase로 백엔드 없이 SaaS 만들기 – 실전 경험담

Supabase만으로 유료 SaaS를 만들어 수익화한 실전 경험담. 인증, RLS, Edge Functions, Stripe 결제 연동까지 과정을 공유합니다.

·5 min read
#일반

백엔드 개발자 없이 SaaS를 만들 수 있을까

결론부터 말하면, 가능합니다. 저는 프론트엔드 개발자인데, Supabase만으로 유료 구독 기능이 있는 SaaS를 만들어서 현재 월 50만 원 정도 수익을 내고 있습니다. 물론 한계도 있었고, 삽질도 많이 했습니다. 그 과정을 솔직하게 공유합니다.

만든 서비스 소개

북마크 관리 + AI 요약 서비스입니다. 사용자가 URL을 저장하면 AI가 자동으로 요약하고 태그를 달아줍니다. 기술 스택은:

  • 프론트엔드: Next.js 15 + Tailwind CSS

  • 백엔드: Supabase (Auth, Database, Edge Functions, Storage)

  • 결제: Stripe

  • 배포: Vercel

Supabase Auth – 인증이 이렇게 쉬워도 되나

가장 감동받은 부분입니다. 소셜 로그인 구현이 몇 줄이면 됩니다:

`import { createClient } from '@supabase/supabase-js'

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)

// 구글 로그인 const { data, error } = await supabase.auth.signInWithOAuth({ provider: 'google', options: { redirectTo: 'https://myapp.com/callback' } })` Google, GitHub, Kakao 로그인을 대시보드에서 클릭 몇 번으로 설정할 수 있습니다. JWT 토큰 관리, 세션 갱신 같은 건 Supabase가 알아서 해줍니다.

RLS(Row Level Security) – 핵심이자 난관

Supabase의 보안은 PostgreSQL의 RLS에 의존합니다. 이게 처음에 좀 헷갈립니다:

`-- 사용자가 자기 데이터만 볼 수 있게 CREATE POLICY "Users can view own bookmarks" ON bookmarks FOR SELECT USING (auth.uid() = user_id);

-- 사용자가 자기 데이터만 생성할 수 있게 CREATE POLICY "Users can insert own bookmarks" ON bookmarks FOR INSERT WITH CHECK (auth.uid() = user_id);` RLS 정책을 잘못 설정하면 보안 구멍이 생기거나, 반대로 정상 요청이 차단됩니다. 저는 초기에 RLS 실수로 다른 사용자 데이터가 노출될 뻔한 적이 있습니다. 테스트를 꼼꼼히 하세요.

Edge Functions – 서버리스 로직 처리

AI 요약 기능은 Supabase Edge Functions로 구현했습니다:

`// supabase/functions/summarize/index.ts import { serve } from 'https://deno.land/std/http/server.ts'

serve(async (req) => { const { url } = await req.json()

// URL에서 콘텐츠 추출 const content = await fetchAndExtract(url)

// AI API 호출 (Claude 4 사용) const summary = await callAI(content)

// DB에 저장 await supabase.from('bookmarks').update({ summary }).eq('url', url)

return new Response(JSON.stringify({ summary })) })` Deno 런타임 기반이라 Node.js와 약간 다르지만, 2026년 현재 npm 호환성이 많이 좋아져서 큰 불편은 없습니다.

Stripe 결제 연동

유료 구독은 Stripe Checkout + Webhook으로 구현했습니다. Supabase Edge Function에서 Webhook을 받아서 사용자의 구독 상태를 DB에 업데이트하는 구조입니다. 이 부분이 가장 시간이 많이 걸렸는데, Stripe 문서가 워낙 잘 되어 있어서 하루 안에 끝냈습니다.

한계와 주의점

  • 복잡한 비즈니스 로직: Edge Functions만으로 처리하기 어려운 복잡한 로직은 별도 서버가 필요합니다.

  • DB 마이그레이션: Supabase 대시보드에서 직접 SQL 치는 건 위험합니다. supabase CLI로 마이그레이션 파일을 관리하세요.

  • 벤더 종속: Supabase가 오픈소스라 셀프호스팅 가능하지만, 실제로 옮기려면 작업량이 있습니다.

총평 – 사이드 프로젝트에는 최고

프론트엔드 개발자가 혼자서 SaaS를 만들어 수익화하는 데 Supabase만큼 좋은 도구는 현재 없다고 생각합니다. 무료 티어로 시작해서 사용자가 늘면 그때 Pro로 올리면 됩니다. 완벽하지는 않지만, "일단 출시하고 검증하자"는 마인드에는 이만한 게 없습니다.

관련 글