HooneyLog
© 2026 Seunghoon Shin. All rights reserved.
모든 게시글
기타
2026. 3. 28.•
1

Supabase와 PostgreSQL, 그리고 Prisma: 나에게 맞는 데이터베이스 전략 선택하기

Seunghoon Shin
작성자 Seunghoon Shin풀스택 개발자

Supabase와 PostgreSQL, 그리고 Prisma: 나에게 맞는 데이터베이스 전략 선택하기

TL;DR 백엔드 개발의 핵심인 데이터베이스 관리를 위해 Supabase(BaaS)와 PostgreSQL의 관계를 이해하고, SQL 직접 사용과 Prisma ORM 활용 사이의 장단점을 비교하여 최적의 개발 환경을 구축하는 방법을 알아봅니다.

1. 문제의 배경

현대적인 풀스택 애플리케이션을 개발할 때 가장 큰 병목 중 하나는 인프라 구축과 데이터베이스 설계입니다. 과거에는 데이터베이스 서버를 직접 설치하고, 보안 설정을 하고, 복잡한 SQL 문을 작성하며 백엔드 API를 하나하나 만들어야 했습니다.

이 과정에서 개발자는 다음과 같은 고민에 빠집니다.

  • "인프라 설정 없이 바로 데이터를 저장하고 불러올 수는 없을까?"
  • "SQL을 직접 쓰는 게 나을까, 아니면 객체 지향적인 ORM을 쓰는 게 나을까?"
  • "Supabase를 쓰는데 Prisma 같은 무거운 ORM이 정말 필요할까?"

이러한 의문들을 해결하기 위해 데이터베이스의 기초부터 현대적인 솔루션까지 하나씩 파헤쳐 보겠습니다.

2. 해결 방안 탐색

우리는 데이터를 안전하고 효율적으로 관리하기 위해 PostgreSQL이라는 강력한 오픈소스 관계형 데이터베이스를 기반으로 합니다. 그리고 이를 더 쉽게 사용하기 위해 두 가지 큰 방향을 고려할 수 있습니다.

  1. Supabase (BaaS): PostgreSQL을 기반으로 인증, API, 실시간 구독 기능을 제공하는 플랫폼입니다. 내장된 PostgREST 기반의 쿼리 빌더를 사용하여 백엔드 코드 없이도 데이터를 다룰 수 있습니다.
  2. Prisma (ORM): 데이터베이스 스키마를 정의하고 이를 타입 안정성이 보장된 코드로 변환해 주는 도구입니다.

이 두 도구가 각각 어떤 역할을 하는지, 그리고 함께 썼을 때의 시너지는 무엇인지 분석해 보았습니다.

3. 핵심 개념 및 아키텍처

Supabase와 PostgreSQL의 관계

먼저 PostgreSQL은 데이터를 표(Table) 형태로 저장하는 관계형 데이터베이스 관리 시스템(RDBMS)의 "엔진"입니다. Supabase는 이 PostgreSQL 엔진을 클라우드에서 바로 쓸 수 있게 해줄 뿐만 아니라, 그 위에 편리한 기능들을 얹은 "종합 선물 세트"라고 이해하면 쉽습니다.

ORM(Object-Relational Mapping)이란?

데이터베이스의 표(Table)와 프로그래밍 언어의 객체(Object)를 연결해 주는 다리 역할을 합니다. SQL 문법을 몰라도 자바스크립트나 타입스크립트 코드로 데이터베이스를 조작할 수 있게 도와줍니다.

Supabase 쿼리 빌더 vs Prisma ORM

  • Supabase Client: 브라우저나 서버에서 직접 호출하기에 최적화되어 있습니다. 별도의 백엔드 서버 없이 프론트엔드에서 바로 DB에 접근할 때 강력합니다.
  • Prisma: 강력한 타입 안정성(Type Safety)과 자동 완성이 강점입니다. 복잡한 릴레이션(Join)을 다룰 때 코드가 훨씬 간결해지며, 마이그레이션 도구가 매우 훌륭합니다.

4. 구현 및 트러블슈팅

PostgreSQL 대표 문법 맛보기

기본적으로 알아야 할 SQL 문법은 다음과 같습니다.

-- 테이블 생성 CREATE TABLE movies ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), title TEXT NOT NULL, year INTEGER ); -- 데이터 삽입 INSERT INTO movies (title, year) VALUES ('Inception', 2010); -- 데이터 조회 SELECT * FROM movies WHERE year > 2000 ORDER BY year DESC;

Supabase 내장 쿼리 빌더 사용법

Supabase는 SQL을 직접 쓰지 않고도 아래와 같이 데이터를 가져올 수 있습니다.

// Supabase 클라이언트를 이용한 쿼리 const { data, error } = await supabase .from('movies') .select('*') .eq('year', 2010);

Prisma ORM과 함께 사용하기

만약 복잡한 서비스 로직이 필요하여 NestJS 같은 백엔드를 따로 둔다면, Prisma를 쓰는 것이 유지보수 면에서 더 유리할 수 있습니다.

// Prisma를 이용한 쿼리 (강력한 타입 자동 완성 지원) const movies = await prisma.movie.findMany({ where: { year: 2010 }, include: { director: true } // 연관된 데이터도 쉽게 가져옴 });

주의할 점: Supabase에서 Prisma를 사용할 때는 커넥션 풀(Connection Pooling) 설정에 주의해야 합니다. Supabase는 기본적으로 서버리스 환경이므로, Prisma가 DB 연결을 너무 많이 점유하지 않도록 PgBouncer 포트(6543)를 사용하는 것이 필수입니다.

5. 결과 및 Trade-off

결론적으로 어떤 조합을 선택해야 할까요?

비교 항목Supabase 전용 쿼리 빌더Prisma ORM 활용
추천 환경Serverless, 간단한 풀스택복잡한 백엔드 아키텍처, NestJS
장점가볍고 설정이 빠름, API 서버 불필요압도적인 타입 안정성, 복잡한 관계 처리
단점복잡한 조인이나 트랜잭션 처리가 까다로움초기 설정(Schema 설정) 및 마이그레이션 학습 필요

결과: 빠른 프로토타이핑이나 소규모 프로젝트라면 Supabase 내장 기능만으로도 충분합니다. 하지만 대규모 시스템에서 데이터 무결성과 엄격한 타입 체크가 중요하다면 Prisma를 도입하는 것이 장기적으로 생산성이 높습니다.

6. 마치며

데이터베이스 선택에는 정답이 없습니다. 내가 만들고자 하는 서비스의 복잡도와 팀의 숙련도에 따라 결정해야 합니다. Supabase는 훌륭한 엔진(PostgreSQL)을 가장 쉽게 제공하는 도구이며, 그 위에서 SQL을 직접 쓸지, 쿼리 빌더를 쓸지, 아니면 Prisma를 얹을지는 개발자의 전략에 달려 있습니다.

다음 글에서는 Supabase의 보안 핵심인 RLS(Row Level Security)에 대해 더 자세히 다뤄보겠습니다.

← 이전 글NestJS 요청 검증의 모든 것: DTO와 Class Validator, Transformer 활용기
다음 글 →Next.js 렌더링 전략 완벽 가이드: SSR, SSG, ISR부터 RSC까지