Supabase는 "오픈소스 Firebase 대안"으로 알려진 백엔드 서비스 플랫폼입니다. 2020년에 출시된 이후 빠르게 성장하고 있는 Supabase는 Firebase와 유사한 기능을 제공하지만, NoSQL 대신 PostgreSQL이라는 관계형 데이터베이스를 기반으로 합니다.
제가 최근 개발한 AI 블로그 관리 시스템 프로젝트에서도 Supabase를 활용했는데요, 프론트엔드 개발자로서 별도의 백엔드 서버 구축 없이 강력한 백엔드 기능을 구현할 수 있어 매우 효율적이었습니다.
Firebase와 Supabase의 가장 큰 차이점은 데이터베이스 모델입니다.
Firebase (NoSQL)
Supabase (PostgreSQL)
우선 프로젝트에서는 다음과 같이 Supabase 클라이언트를 설정했습니다:
// src/lib/supabase.ts
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
export const supabase = createClient(supabaseUrl || "", supabaseAnonKey || "");
Supabase의 가장 큰 장점 중 하나는 인증 시스템을 쉽게 구현할 수 있다는 점입니다. 프로젝트에서는 다음과 같이 로그인, 로그아웃, 세션 관리 등의 기능을 구현했습니다:
// 로그인 API 호출
export async function loginUser(email: string, password: string) {
const response = await fetch("/api/auth/login", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, password }),
});
const result = await response.json();
if (result.data?.session) {
await supabase.auth.setSession({
access_token: result.data.session.access_token,
refresh_token: result.data.session.refresh_token,
});
}
return result.data;
}
// 인증 상태 변경 리스너 설정
export function setupAuthStateChangeListener(callback) {
return supabase.auth.onAuthStateChange((event, session) => {
callback(session);
});
}
이 코드를 활용해 useAuth
훅을 만들어 전체 애플리케이션에서 인증 상태를 관리했습니다:
// src/hooks/useAuth.ts (간략화 버전)
export function useAuth() {
const [user, setUser] = useState(null);
const [isAdmin, setIsAdmin] = useState(false);
useEffect(() => {
// 세션 확인 및 상태 관리
const checkSession = async () => {
const { data: { session } } = await getCurrentSession();
if (session) {
setUser(session.user);
const { data } = await getUserRole(session.user.id);
setIsAdmin(data?.role === "admin");
}
};
checkSession();
// 인증 상태 변경 감지
const { data: { subscription } } = setupAuthStateChangeListener(async (session) => {
// 세션 변경 시 상태 업데이트
});
return () => subscription.unsubscribe();
}, []);
// 로그인, 로그아웃 등 함수 제공
return { user, isAdmin, login, logout, register };
}
Supabase는 직관적인 API를 통해 데이터베이스 작업을 쉽게 수행할 수 있습니다:
// 사용자 목록 조회 예시
const { data: users, error } = await supabase
.from("users")
.select("id, name, email, blog_id, phone, bank_name")
.eq("role", "user")
.order("created_at", { ascending: false });
// 블로그 글 상태 업데이트 예시
const { data, error } = await supabase
.from("blog_posts")
.update({
status: "completed",
blog_url: blogUrl,
completion_notes: completionNotes,
completed_at: new Date(),
})
.eq("id", postId)
.eq("assigned_to", user.id)
.select();
프로젝트에서는 블로그 이미지를 저장하고 관리하기 위해 Supabase Storage를 활용했습니다:
// 이미지 업로드 예시
const filePath = `blog_images/${postId}/${fileName}`;
const { data, error: uploadError } = await supabase.storage
.from("uploads")
.upload(filePath, fileData, {
contentType: file.type,
cacheControl: "3600",
});
// 이미지 URL 생성
const { data: urlData } = await supabase.storage
.from("uploads")
.getPublicUrl(filePath);
// 이미지 삭제
const { error: storageError } = await supabase.storage
.from("uploads")
.remove([imageData.file_path]);
복잡한 트랜잭션이나 비즈니스 로직은 PostgreSQL의 함수를 정의하고 RPC로 호출할 수 있습니다:
// Supabase RPC 호출 예시
const { data, error } = await supabase.rpc(
"approve_blog_with_points",
{
p_post_id: postId,
p_admin_id: user.id,
p_admin_feedback: adminFeedback || "",
p_points_amount: pointsAmount,
}
);
이 예시에서는 블로그 글 승인과 포인트 지급이라는 복잡한 로직을 데이터베이스 함수로 처리하고 있습니다.
프로젝트에서는 사용자 권한에 따라 데이터 접근을 제한하기 위해 RLS를 활용했습니다:
// 역할 기반 접근 제어 예시
export async function verifyUserRole(request, requiredRole = "admin") {
// 사용자 인증 및 역할 확인
const { data: userData } = await supabase
.from("users")
.select("role")
.eq("id", user.id)
.single();
if (userData.role !== requiredRole) {
return {
user: null,
errorResponse: NextResponse.json(
{ error: "권한이 없습니다." },
{ status: 403 },
),
};
}
// 인증 성공 시 사용자 정보 반환
return { user, errorResponse: null };
}
프론트엔드 개발자로서 Supabase는 백엔드에 대한 부담 없이 풀스택 애플리케이션을 개발할 수 있게 해주는 강력한 도구입니다. 특히 관계형 데이터베이스의 장점을 활용하면서도 Firebase와 같은 편리한 API를 제공하는 점이 매력적입니다.
이번 AI 블로그 관리 시스템 프로젝트에서는 Supabase를 통해 인증 시스템, 데이터베이스 CRUD 작업, 파일 스토리지, 권한 관리 등을 모두 구현했으며, 백엔드 서버 구축 없이도 완전한 기능을 갖춘 애플리케이션을 개발할 수 있었습니다.
복잡한 데이터 관계가 있는 프로젝트나, 백엔드 개발 리소스가 제한적인 소규모 팀, 그리고 빠른 MVP 개발이 필요한 스타트업에 Supabase는 훌륭한 선택이 될 것입니다.