Supabase와 NextJS는 현대적인 풀스택 웹 애플리케이션 개발을 위한 이상적인 조합이다. Supabase는 PostgreSQL 기반 오픈소스 Firebase 대안으로 실시간 데이터베이스, 인증, 스토리지를 제공하며, NextJS는 React 기반 프로덕션 프레임워크다. npx create-next-app -e with-supabase 템플릿을 사용하면 Cookie-based 인증, TypeScript, Tailwind CSS가 사전 구성된 프로젝트를 즉시 시작할 수 있다. 이 템플릿에는 모든 기본 설정이 포함되어 있어 복잡한 설정 없이 바로 개발에 집중할 수 있으며, 필요한 부분만 기존 프로젝트에 이식하는 것도 가능하다.
Supabase + NextJS 소개
Hostit이라는 사이드 프로젝트를 효율적으로 빠르게 진행할겸, 최신 유행하는 기술들을 사용해보려는 취지로 리서치하던 중 이 조합을 찾게 되었다. Hostit은 LangChain의 Model Context Protocol(MCP)을 활용한 AI 도구 관리 플랫폼으로, 사용자 인증, 서버 관리, 실시간 데이터 동기화 등 복잡한 백엔드 기능이 필요한 프로젝트였다.
Supabase와 NextJS의 조합이 매력적인 이유는 복잡한 설정 없이도 강력한 풀스택 애플리케이션을 빠르게 구축할 수 있기 때문이다. 특히 with-supabase 템플릿을 사용하면 모든 기본 설정이 이미 완료된 상태로 시작할 수 있어 매우 편리하다.
핵심 장점
즉시 사용 가능: 템플릿으로 5분 안에 프로젝트 시작
PostgreSQL: 강력한 SQL 데이터베이스와 실시간 기능
인증 완료: 이메일/비밀번호, 소셜 로그인 사전 구성
타입 안전성: TypeScript와 자동 타입 생성 지원
Zero Config: 복잡한 백엔드 설정 불필요
Hostit의 구조를 보면 MCP 서버 관리, 사용자별 프로필 저장, 실시간 채팅 등 다양한 백엔드 기능이 필요했는데, Supabase의 인증 시스템과 PostgreSQL, 실시간 구독 기능이 이러한 요구사항들을 완벽하게 해결해주었다.
빠른 시작 방법
방법 1: 새 프로젝트 시작 (권장)
가장 쉬운 방법은 Supabase 템플릿을 사용하는 것이다:
# 템플릿으로 새 프로젝트 생성npx create-next-app -e with-supabase my-app# 프로젝트 이동cd my-app# 환경 변수 설정cp .env.example .env.local
.env.local 파일은 Git에 커밋하지 않도록 주의하세요. 이미 .gitignore에 포함되어 있습니다.
2. 샘플 테이블 생성
SQL Editor에서 실행:
-- 간단한 테이블 생성create table posts ( id bigint primary key generated always as identity, title text not null, content text, created_at timestamp with time zone default now());-- 공개 읽기 권한alter table posts enable row level security;create policy "Public can read posts" on posts for select using (true);
3. 개발 서버 실행 및 확인
npm run dev
브라우저에서 http://localhost:3000에 접속하면 다음과 같은 화면을 볼 수 있다:
.env.local 설정 전(Supabase 연결 x) 화면:
.env.local 설정 후:
템플릿에는 이미 로그인/회원가입 페이지가 구성되어 있고, 간단한 예제 페이지들도 포함되어 있다.
사실 이메일 인증 과정도 포함되어있지만, 나는 구글, 깃허브, 카카오 등 소셜 인증만 사용할 예정이기 때문에 제거할 예정이다.
-- 사용자별 데이터 접근create policy "Users see own data" on profilesfor all using (auth.uid() = user_id);-- 공개 읽기, 인증 쓰기 create policy "Public read" on postsfor select using (published = true);create policy "Auth write" on posts for insert to authenticatedwith check (auth.uid() = author_id);
타입 자동 생성
# 한 번만 설정npx supabase gen types typescript --project-id YOUR_PROJECT_ID > types/supabase.ts
주의사항
보안 주의사항
RLS 정책 필수 설정 - 테이블마다 적절한 보안 정책 추가
Service Role Key는 서버 사이드에만 사용
환경 변수는 .env.local에 보관 (.env.example은 빈 값으로)
성능 최적화
// ❌ 잘못된 예const { data } = await supabase.from('posts').select('*')// ✅ 올바른 예 const { data } = await supabase .from('posts') .select('id, title, created_at') .limit(10)