Neon vs Supabase: 리전, egress, 리얼타임 비교
Vercel 서울 리전에서 도는 Next.js 앱에 붙일 관리형 Postgres 를 고르는 중이었습니다. 처음에는 두 서비스의 가격표를 나란히 놓고 비교하면 끝날 일이라고 생각했습니다. 실제로는 가격이 아니라, 나중에 되돌릴 수 없는 것들에서 갈렸습니다.
리전부터 틀렸습니다
Neon 에 서울은 없더라도 도쿄 정도는 있을 거라고 막연히 생각했습니다. 확인해 보니 둘 다 없었습니다. AWS 기준으로 아시아에는 싱가포르(ap-southeast-1)와 시드니(ap-southeast-2) 두 곳뿐입니다. Supabase 는 서울(ap-northeast-2)과 도쿄(ap-northeast-1)를 모두 제공합니다.
그리고 Neon 문서에 이런 문장이 있습니다.
You cannot change the region for an existing project.
프로젝트를 만들 때 고른 리전은 나중에 못 바꿉니다. 옮기려면 새 프로젝트를 만들고 데이터를 이전해야 합니다. 가격은 언제든 플랜을 바꾸면 되지만 이건 아닙니다.
얼마나 차이 나는지 궁금해서 한국에서 AWS 리전별 퍼블릭 엔드포인트에 TCP 연결 시간을 재 봤습니다. 리전마다 여섯에서 일곱 번씩 붙여 중앙값을 취했습니다.
| 리전 | 측정값 |
|---|---|
서울 ap-northeast-2 |
19.9ms |
도쿄 ap-northeast-1 |
49.7ms |
싱가포르 ap-southeast-1 |
80.2ms |
측정한 회선의 라스트마일이 약 15ms 였으니, 서울에 있는 서버에서 보면 리전 간 왕복은 대략 서울 2ms, 도쿄 30ms, 싱가포르 65ms 입니다.
쿼리 한 번에 65ms 면 참을 만해 보입니다. 문제는 새 커넥션입니다. TCP 와 TLS 핸드셰이크로 왕복을 세 번쯤 쓰니 콜드 커넥션 하나에 200ms 가 붙습니다. 서버리스에서는 이게 드물지 않게 일어납니다.
egress 한도는 무료 티어에서 같습니다
여기서 두 번째로 틀렸습니다. Supabase 무료의 egress 한도가 좁으니 Neon 무료로 옮기면 숨통이 트일 거라고 생각했습니다. 확인해 보니 Neon Free 의 public network transfer 도 월 5GB 입니다. 똑같습니다.
바뀌는 건 유료로 올라갔을 때입니다.
| 플랜 | 포함 egress | 초과 요금 |
|---|---|---|
| Supabase Free | 5GB | 없음 |
| Neon Free | 5GB | 없음 |
| Neon Launch | 프로젝트당 500GB | $0.10/GB |
| Supabase Pro | 250GB + 캐시 250GB | $0.09/GB |
Neon Launch 의 500GB 는 확실히 넉넉합니다. 다만 egress 때문에 Launch 를 고른다면, 정작 청구서를 좌우하는 건 egress 가 아닙니다.
사용량 기반이 늘 싼 것은 아닙니다
Neon 의 유료 플랜에는 월 최저 요금이 없습니다.
On Launch and Scale plans, you pay only for what you use; there's no minimum monthly fee.
좋은 조건으로 들렸는데 계산해 보니 생각과 달랐습니다. 컴퓨트가 CU 시간당 $0.106 이고 가장 작은 컴퓨트가 0.25 CU 입니다. 이게 계속 깨어 있으면 한 달에 0.25 × 730시간 × $0.106, 약 $19 가 나옵니다.
Neon 에는 유휴 시 컴퓨트를 재우는 기능이 있어서 정말로 한가한 DB 는 이보다 훨씬 적게 나옵니다. 문제는 크론이나 헬스체크나 크롤러가 꾸준히 두드리는 DB 입니다. 그런 DB 는 잘 안 잡니다. Supabase Pro 는 월 $25 정액에 컴퓨트 크레딧 $10 가 포함이라 성격이 반대입니다. 비쌀 수도 있고 쌀 수도 있지만 예측은 됩니다.
"사용량 기반이니까 싸다"는 전제부터 검증해야 합니다. 내 DB 가 실제로 하루에 몇 시간이나 자는지 모르면 계산 자체가 안 됩니다.
리얼타임은 한쪽만 제품입니다
Supabase 는 Realtime 을 관리형 기능으로 제공합니다.
- Broadcast: 클라이언트 사이 메시지 전달
- Presence: 접속 상태 동기화
- Postgres Changes: DB 변경 구독
Neon 에는 대응하는 관리형 제품이 없습니다. 대신 Neon Functions 위에서 Postgres 의 LISTEN/NOTIFY 와 SSE 또는 WebSocket 을 조합해 직접 만드는 방식을 안내합니다. 별도 브로커 없이 Postgres 만으로 pub/sub 을 구성하는 구조라 발상은 깔끔합니다.
다만 Neon Functions 는 아직 public beta 이고, 베타 기능은 us-east-2 리전 프로젝트에서만 열립니다. 아시아에서 쓰려면 데이터를 미국 오하이오에 두거나 리얼타임만 다른 데서 돌려야 합니다.
한 가지 덧붙이면, Supabase Realtime 을 쓰는 순간 Supabase 는 Postgres 호스트에서 플랫폼이 됩니다. 클라이언트가 DB 에 직접 붙기 때문에 RLS 정책이 사실상 필수가 되고, 인증 토큰도 Supabase 가 검증할 수 있는 형식이어야 합니다. 모든 DB 접근이 서버 라우트를 지나는 구조를 쓰고 있었다면 그 전제를 바꾸는 결정입니다.
그리고 리얼타임은 앱 계층에서도 됩니다. SSE 는 Node 런타임에서 설정 없이 동작하고, Vercel Functions 는 WebSocket 도 지원합니다. DB 벤더를 리얼타임 때문에 고르는 건 한 번 더 생각해 볼 만합니다.
브랜치는 Neon 이 앞섭니다
여기는 비교랄 것이 없습니다. Neon 의 브랜치는 copy-on-write 라 부모와 데이터를 공유하다가 쓰기가 생긴 만큼만 따로 저장합니다. 프리뷰 배포마다 독립된 데이터베이스를 붙이는 용도에 잘 맞습니다. 보존 기간 안이라면 과거 시점으로 브랜치를 뜨는 것도 됩니다.
Supabase 에도 브랜칭이 있지만 성격이 다르고, 무료 티어의 활성 프로젝트 제한이 실험을 제약합니다. 무료는 두 개까지이고 조직을 더 만들어도 합산됩니다. Neon Free 는 프로젝트를 100개까지 허용합니다.
양쪽 다 되는 것
확장은 둘 다 충분합니다. pgvector 와 pg_trgm 이 양쪽에서 되고 HNSW 인덱스도 문제없습니다. 임베딩 검색을 DB 안에서 처리할 계획이라면 이걸로는 갈리지 않습니다.
풀러도 양쪽 다 PgBouncer 트랜잭션 모드입니다. 여기에는 알아 둘 함정이 하나 있습니다. 트랜잭션 모드 풀러는 연결 문자열의 options=-c search_path 를 전달하지 않습니다. 인스턴스 하나를 스키마로 갈라 여러 앱이 나눠 쓰려는 계획이 있다면, 풀러를 경유하는 한 그 방법은 못 씁니다.
백업은 성격이 다릅니다. Supabase 무료에는 자동 백업이 없어서 덤프를 직접 걸어야 하고 Pro 부터 일일 백업을 7일 보관합니다. Neon 은 히스토리 보존 기간 안에서 특정 시점의 브랜치를 뜨는 방식이라 복원이라는 개념 자체가 다릅니다.
무엇으로 고를까
가격표는 마지막에 봐도 됩니다. 먼저 확인할 것이 두 가지 있습니다.
앱이 어느 리전에서 도는가. DB 는 앱 옆에 있어야 합니다. 앱이 서울인데 DB 가 싱가포르면 쿼리마다 65ms 를 물고 갑니다. 순차 쿼리가 깔린 페이지에서는 그게 그대로 쌓입니다. 게다가 Neon 은 리전을 나중에 못 바꿉니다.
DB 를 Postgres 로 쓸 것인가, 플랫폼으로 쓸 것인가. Auth 와 Realtime 과 Storage 까지 쓸 생각이면 Supabase 쪽이 통합된 만큼 이득이 큽니다. 반대로 그냥 빠른 Postgres 가 필요하고 인증과 실시간이 이미 앱 계층에 있다면, 그 기능들은 선택 기준이 되지 못합니다.
서울 리전이 꼭 필요하면서 Supabase 는 아니어야 하는 경우라면, PlanetScale 이 GCP asia-northeast3(서울)에서 Postgres 를 제공합니다. 무료 티어는 없고 단일 노드가 월 $5 부터입니다.
저는 아직 결정을 못 했습니다. 다만 가격 비교로 시작했다가 리전과 과금 구조에서 두 번 틀린 걸 보면, 처음부터 순서를 반대로 잡았어야 했던 것 같습니다.
함께 읽기
- Supabase와 Neon 비교: 같은 PostgreSQL, 다른 역사와 구조Supabase와 Neon을 처음 보면 둘 다 관리형 PostgreSQL 서비스처럼 보입니다. 실제로 두 서비스 모두 표준 PostgreSQL 연결 방식과 SQL 생태계를 활용합니다. 그래서 기능표만 훑으면 가격과 무료 용량 정도만 비교하게 됩니다.
- 직원 20명 사내 시스템, Supabase Micro면 충분할까?사내 시스템을 새로 만들 때 인프라를 처음부터 크게 잡아야 할지 고민하게 됩니다. 특히 Supabase Pro를 검토하면 Micro와 Small의 월 비용 차이는 크지 않지만, 어떤 기준으로 선택해야 하는지는 가격표만 보고 판단하기 어렵습니다.
- 배포 문서 한 줄이 AI 기능 전체를 막을 뻔한 이유새 기능의 코드와 테스트가 모두 준비되어도 데이터베이스 테이블이 운영에 만들어지지 않으면 서비스는 시작할 수 없습니다. 문서 RAG 기능을 배포하는 과정에서 실제 배포 스크립트는 마이그레이션 파일을 적용하고 있었지만, 개발 지침에는 마이그레이션 파일을 만들지 말라고 적혀 있는 불일치를 발견했습니다.
- 여러 회사를 지원하는 SaaS의 데이터는 어떻게 분리해야 할까?한 애플리케이션을 여러 회사가 함께 사용하는 SaaS에서는 로그인보다 테넌트 경계가 더 중요하다. 사용자가 정상적으로 로그인했더라도 다른 회사의 계약, 직원, 파일, 검색 결과를 볼 수 있다면 인증은 성공했지만 데이터 격리는 실패한 것이다.
- Prisma 마이그레이션 이전 리허설: migrate diff로는 못 잡는 것들운영 중인 서비스의 데이터베이스를 온프레미스에서 Supabase로 옮기는 중입니다. 지난번에 1단계로 앱을 무상태화했고, 이번이 2단계인 스키마 복제입니다. 프로젝트를 만들고 접속 문자열을 받아 prisma migrate deploy 한 줄 돌리면 끝나는 일이라고 생각했습니다. 그 전에 빈 데이터베이스에 한 번 리허설을…