RSS듀오랩스

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개까지 허용합니다.

양쪽 다 되는 것

확장은 둘 다 충분합니다. pgvectorpg_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 부터입니다.

저는 아직 결정을 못 했습니다. 다만 가격 비교로 시작했다가 리전과 과금 구조에서 두 번 틀린 걸 보면, 처음부터 순서를 반대로 잡았어야 했던 것 같습니다.

마지막 수정:

공유하실 때는 출처(Duolabs)와 원문 주소를 표시해 주세요.