Spring Boot 서비스 하나 운영하는 데 한 달에 얼마가 들까
서버비만 세면 절반도 못 셉니다. NAT Gateway, 데이터 전송, 로그, 부가세까지 넣어 취미용 7천 원짜리와 이중화 프로덕션 62만 원짜리를 끝까지 계산했습니다.
먼저 계산 기준
전부 서울 리전(ap-northeast-2) 온디맨드 정가, 2026년 9월 기준입니다. 약정·세이빙플랜 할인은 넣지 않았습니다. 한 달은 730시간으로 계산했습니다.
환율 1,340원 / $1
부가세 10% (AWS 코리아는 원화 청구 시 VAT가 붙습니다)
기간 730시간 = 1개월
원화는 전부 부가세를 뺀 환산액이고, 표 아래에 VAT를 따로 더했습니다. 정가는 자주 바뀌니 자릿수를 보는 용도로 쓰세요.
결론부터
| 구성 | 월 비용 (USD) | 월 비용 (KRW, VAT 포함) |
|---|---|---|
| A. 취미 — 단일 VM, DB 같이 | $5.76 | 약 7,700원 |
| B. 1인 실서비스 — AWS 단일 AZ | $47.41 | 약 63,500원 |
| B+. B에 ALB 추가 | $67.40 | 약 90,300원 |
| C. 이중화 프로덕션 — Multi-AZ | $465.47 | 약 623,700원 |
A 구성은 국내에 법인이 없는 해외 업체라 VAT가 붙지 않아 환산액이 그대로입니다. A에서 C까지 80배입니다. 그리고 이 차이의 대부분은 서버가 아니라 이중화와 네트워크에서 나옵니다.
구성 A — 취미 프로젝트 (월 7,700원)
Spring Boot 하나, DB 하나, 같은 장비. 트래픽은 사실상 없습니다.
| 항목 | USD | KRW |
|---|---|---|
| Hetzner CX22 (2vCPU / 4GB / 40GB) | $4.59 | 6,200원 |
| .com 도메인 (연 $14의 월분) | $1.17 | 1,600원 |
| TLS 인증서 (Let's Encrypt) | $0 | 0원 |
| 합계 | $5.76 | 약 7,700원 |
Oracle Cloud의 Always Free(Ampere 4 OCPU / 24GB)를 쓰면 도메인 값 1,600원만 남습니다. Spring Boot는 ARM에서 잘 돕니다.
여기서 중요한 건 금액이 아니라 무엇을 포기했는가입니다. 장비가 죽으면 서비스가 죽고, 백업은 직접 돌려야 하고, 배포 중에는 다운타임이 있습니다. 사이드 프로젝트에는 대체로 맞는 거래입니다.
구성 B — 1인 실서비스 (월 63,500원)
돈 받는 서비스지만 아직 이중화는 안 한 단계입니다. AWS 서울, 단일 AZ.
| 항목 | USD | KRW |
|---|---|---|
| EC2 t4g.small (2vCPU / 2GB) | $15.18 | 20,300원 |
| EBS gp3 30GB | $2.74 | 3,700원 |
| RDS db.t4g.micro (single-AZ) | $16.79 | 22,500원 |
| RDS 스토리지 gp3 20GB | $2.62 | 3,500원 |
| CloudWatch Logs 5GB | $3.90 | 5,200원 |
| Route 53 호스팅 영역 | $0.50 | 700원 |
| ECR 2GB | $0.20 | 300원 |
| 데이터 전송 아웃 50GB (월 100GB 무료) | $0 | 0원 |
| 도메인 월분 | $1.17 | 1,600원 |
| 소계 | $43.10 | 57,700원 |
| + VAT 10% | $47.41 | 약 63,500원 |
ALB를 붙이면 여기서 $18.18(24,400원)이 더 붙습니다. 트래픽이 0이어도 시간당 $0.0225는 그냥 나갑니다. 인스턴스가 한 대뿐인데 로드밸런서를 앞에 두는 건 한 대짜리 서비스에 서버 한 대 값을 더 내는 것과 같습니다. 그 단계에서는 Nginx나 Caddy로 인스턴스에서 TLS를 끝내는 편이 낫습니다. ALB는 뒤에 두 대 이상이 생길 때 붙이세요.
구성 C — 이중화 프로덕션 (월 623,700원)
2개 AZ, 앱 2대, DB Multi-AZ, 캐시, 프라이빗 서브넷.
| 항목 | USD | KRW |
|---|---|---|
| EC2 t3.medium × 2 | $75.92 | 101,700원 |
| EBS gp3 30GB × 2 | $5.47 | 7,300원 |
| ALB (+ LCU) | $22.27 | 29,800원 |
| RDS db.t4g.small Multi-AZ | $67.16 | 90,000원 |
| RDS 스토리지 100GB (Multi-AZ라 2배) | $26.20 | 35,100원 |
| ElastiCache cache.t4g.micro | $15.33 | 20,500원 |
| NAT Gateway × 2 + 처리량 100GB | $92.04 | 123,300원 |
| 데이터 전송 아웃 500GB | $50.40 | 67,500원 |
| CloudWatch (로그 30GB + 지표) | $27.80 | 37,300원 |
| S3 100GB + 요청 | $3.50 | 4,700원 |
| Route 53 + 도메인 | $2.07 | 2,800원 |
| ECR 10GB | $1.00 | 1,300원 |
| Sentry Team | $26.00 | 34,800원 |
| GitHub Actions 초과분 | $8.00 | 10,700원 |
| 소계 | $423.15 | 567,000원 |
| + VAT 10% | $465.47 | 약 623,700원 |
여기서 눈여겨볼 게 있습니다. 앱 서버(EC2) 비중은 전체의 18%뿐입니다. "서버비"라고 부르는 항목이 실제로는 5분의 1도 안 됩니다.
아무도 예산에 안 넣는 세 가지
1. NAT Gateway — 월 123,300원
C 구성에서 단일 항목 1위입니다. EC2 두 대보다 비싸지 않을 뿐, ALB보다 4배 비쌉니다.
NAT Gateway 시간당 $0.059 × 730h × 2 AZ = $86.14
처리량 100GB × $0.059 = $5.90
--------
$92.04 (123,300원)
프라이빗 서브넷에 있는 인스턴스가 밖으로 나가려면 필요합니다. 그런데 Spring Boot 앱이 밖으로 나가는 이유를 세어보면 대개 컨테이너 이미지 받기, 패키지 미러, S3 접근, 외부 API 호출 정도입니다. 앞의 셋은 VPC 엔드포인트로 대체할 수 있습니다. S3는 게이트웨이 엔드포인트가 무료입니다.
AZ를 하나로 줄이면 절반이 되지만, 그러면 이중화를 한 의미가 줄어듭니다. 엔드포인트로 트래픽을 걷어내는 쪽이 정답에 가깝습니다.
2. 데이터 전송 아웃 — GB당 $0.126
월 100GB까지는 무료, 그다음부터 GB당 169원입니다.
500GB → (500-100) × $0.126 = $50.40 (67,500원)
2,000GB → (2000-100) × $0.126 = $239.40 (320,800원)
이미지와 파일을 앱에서 직접 내보내고 있다면 이 줄이 조용히 자랍니다. CloudFront를 앞에 두면 GB당 단가가 낮아지고, 무엇보다 캐시 적중분은 원본에서 나가지 않습니다.
3. CloudWatch Logs — 로그를 다 넣으면 DB보다 비쌉니다
수집이 GB당 약 $0.76입니다. Spring Boot의 기본 로깅을 그대로 두고 액세스 로그까지 넣으면 금방 불어납니다.
로그 30GB/월 → 약 $22.80 (30,600원)
로그 100GB/월 → 약 $76.00 (101,800원) ← RDS보다 비쌈
INFO 레벨로 SQL 로그를 켜둔 채 운영에 올라간 서비스가 제일 흔한 원인입니다.
AWS 말고 — Vercel, Supabase, Railway는 어떤가
여기까지는 직접 굴리는 값이었습니다. 요즘 더 흔한 선택지를 같은 기준으로 놓겠습니다. 다만 시작 전에 하나 짚어야 합니다.
Vercel은 Spring Boot를 돌리지 못합니다
자주 같이 묶여 언급되지만, Vercel에는 JVM 런타임이 없습니다. 함수 런타임은 Node.js·Python·Go·Ruby이고 Java는 없습니다. 그래서 Vercel은 Spring Boot의 대안이 아니라 앞단 조합입니다.
Next.js 프런트엔드 → Vercel Hobby 무료 / Pro $20(26,800원) per seat
REST API → 다른 어딘가 ← Spring Boot는 여기
즉 Vercel을 쓴다고 아래 계산이 사라지지 않습니다. 프런트엔드 값이 위에 얹힐 뿐입니다.
Spring Boot가 실제로 돌아가는 곳
컨테이너를 받아주는 PaaS라면 Spring Boot도 그냥 돕니다. 구성 B(월 63,500원)와 같은 규모 — 앱 하나, DB 하나 — 로 맞춰 보겠습니다.
Railway (사용량 과금: vCPU $20/vCPU·월, RAM $10/GB·월, 볼륨 $0.15/GB·월)
| 항목 | USD | KRW |
|---|---|---|
| 앱 (평균 0.2 vCPU + 1.5GB) | $19.00 | 25,500원 |
| Postgres (0.1 vCPU + 1GB + 볼륨 10GB) | $13.50 | 18,100원 |
| Hobby 기본료 $5 (사용량 크레딧 $5 포함) | $0 | 0원 |
| 합계 | $32.50 | 약 43,600원 |
Render
| 항목 | USD | KRW |
|---|---|---|
| Web Service Standard (1 CPU / 2GB) | $25.00 | 33,500원 |
| Postgres Basic (1GB) | $19.00 | 25,500원 |
| 합계 | $44.00 | 약 59,000원 |
Fly.io (CPU $1.94/코어·월, RAM $5.34/GB·월)
| 항목 | USD | KRW |
|---|---|---|
| 앱 shared-cpu-1x / 2GB | $12.62 | 16,900원 |
| Postgres 1x / 1GB | $7.28 | 9,800원 |
| 볼륨 20GB | $3.00 | 4,000원 |
| 합계 | $22.90 | 약 30,700원 |
Railway 앱 + Supabase Postgres
| 항목 | USD | KRW |
|---|---|---|
| Railway 앱 | $19.00 | 25,500원 |
| Supabase Pro (8GB DB, 조직당) | $25.00 | 33,500원 |
| 합계 | $44.00 | 약 59,000원 |
전부 구성 B(63,500원)보다 싸거나 비슷합니다. 그런데 여기에는 표에 안 적힌 게 더 들어 있습니다 — 배포 파이프라인, TLS, 헬스체크, 롤백, 메트릭, 로그가 기본으로 옵니다. 구성 B에서 저걸 갖추려면 GitHub Actions를 짜고 ALB를 붙이고 CloudWatch를 설정해야 합니다.
PaaS는 인프라를 사는 게 아니라 앞 절의 '사람 시간'을 사는 겁니다. 주 4시간이 월 496,000원이었던 걸 떠올리면, 월 4만 원대에 그중 일부를 없애는 건 압도적으로 남는 거래입니다.
그런데 규모가 커지면 역전됩니다
상시 1 vCPU / 2GB를 쓰는 앱 하나의 단가만 떼어 보겠습니다.
| USD | KRW | |
|---|---|---|
| Railway (1 vCPU + 2GB, 100% 사용) | $40.00 | 53,600원 |
| Render Standard | $25.00 | 33,500원 |
| Fly.io (shared-cpu-1x + 2GB) | $12.62 | 16,900원 |
| EC2 t4g.small (2 vCPU / 2GB) | $15.18 | 20,300원 |
| Hetzner CX22 (2 vCPU / 4GB) | $4.59 | 6,200원 |
Railway의 vCPU 단가는 EC2의 2.6배, Hetzner의 8.7배입니다. 유휴 시간이 많은 앱에서는 사용량 과금이 이득이지만, CPU를 꾸준히 쓰는 앱이 여러 개가 되는 순간 곱하기로 벌어집니다.
Supabase도 같은 패턴입니다. Pro $25는 소규모에서 RDS(구성 B의 $19.41)보다 후하지만, 컴퓨트를 키우기 시작하면 애드온 단가가 붙습니다.
정리하면 이렇습니다.
앱 1~3개, CPU 유휴 많음 → PaaS가 싸고, 사람 시간까지 아낌
앱 여러 개, CPU 상시 사용 → 단가 역전. IaaS로 내려갈 시점
데이터 전송이 많음 → PaaS 이그레스 단가부터 확인 (Railway $0.05/GB)
전환 시점을 판단하는 기준은 청구서 총액이 아니라 vCPU 단가입니다. Railway 청구서가 월 $150을 넘겼다면, 같은 워크로드를 EC2에 올렸을 때의 값을 한 번 계산해 볼 때입니다.
무료 티어의 함정
- Supabase Free — 1주일 비활동 시 프로젝트가 일시 정지됩니다. 사이드 프로젝트를 가끔 켜보는 용도라면 매번 깨우게 됩니다.
- Render Free — 15분 무요청이면 인스턴스가 내려갑니다. 그리고 Spring Boot는 다시 뜨는 데 20~40초가 걸립니다. 첫 방문자가 매번 그 시간을 기다립니다. 이 조합은 특히 나쁩니다.
- Railway — 무료 플랜이 없어졌습니다. Hobby $5(6,700원)가 시작점입니다.
구성 A(월 7,700원)가 여전히 의미 있는 이유가 여기 있습니다. VM은 잠들지 않습니다.
Spring Boot라서 더 드는 비용
여기까지는 어떤 스택이든 같습니다. JVM이기 때문에 생기는 차이가 둘 있습니다.
1. 1GB 인스턴스로는 안 됩니다. JVM은 힙 말고도 메타스페이스, 코드 캐시, 스레드 스택, GC 구조를 씁니다. Spring Boot에 JPA와 커넥션 풀을 얹으면 RSS가 500MB를 쉽게 넘습니다. t4g.micro(1GB)에서 뜨긴 하지만, 배포 중 구버전과 신버전이 잠깐 겹치는 순간 OOM으로 죽습니다. 현실적인 시작점은 2GB이고, 이게 t4g.micro $7.59 대신 t4g.small $15.18을 쓰게 만듭니다. 월 10,200원의 차이지만, 오토스케일링으로 열 대가 되면 월 10만 원입니다.
2. 부팅이 느려서 스케일아웃이 비쌉니다. Spring Boot 앱이 트래픽을 받기까지 20~40초가 걸립니다. 그래서 오토스케일링을 트래픽에 딱 맞춰 걸 수 없고, 여유분을 항상 켜 두게 됩니다. 이 여유분이 곧 고정비입니다. CDS나 AOT/네이티브 이미지로 기동 시간을 줄이면 여유분을 줄일 수 있지만, 그 최적화에 드는 사람 시간이 아낀 서버비보다 비싼 경우가 많습니다 — 규모가 작다면요.
가장 비싼 항목은 표에 없습니다
C 구성이 월 623,700원입니다. 그런데 이 인프라를 굴리는 사람의 시간은 저 표에 한 줄도 없습니다.
연봉 6,000만 원 개발자의 시간당 가치는 대략 31,000원입니다.
인프라 관리에 주 4시간 → 월 16시간 → 약 496,000원
사람 시간이 인프라비의 80%에 육박합니다. 이 숫자를 옆에 놓고 보면 판단이 달라지는 선택이 몇 개 있습니다.
- RDS 대신 EC2에 직접 MySQL — 월 22,500원을 아끼려고 백업·패치·장애 대응을 떠안습니다. 한 달에 45분만 써도 본전을 잃습니다.
- Kubernetes 도입 — EKS 컨트롤 플레인만 월 $73(약 97,800원)입니다. 그리고 서비스가 하나뿐이라면 이 돈보다 학습과 운영에 드는 시간이 훨씬 큽니다.
- 직접 모니터링 스택 구축 — Prometheus + Grafana를 직접 올리면 Sentry 34,800원은 아낍니다. 그 스택이 죽었을 때 고치는 시간까지 계산하셨나요?
반대로 비용을 줄이는 게 확실히 남는 선택도 있습니다. NAT Gateway를 VPC 엔드포인트로 바꾸는 건 두 시간이면 끝나고 매달 6만 원 이상을 영구적으로 줄입니다. 시급 기준 회수 기간이 한 달입니다.
그래서 어느 단계에 뭘 쓰나
매출이 없다면 A입니다. 월 7,700원. AWS 프리티어를 쓰겠다고 12개월 뒤 요금 폭탄을 맞느니, 처음부터 정가가 싼 곳을 쓰는 편이 예측 가능합니다.
돈을 받기 시작하면 B입니다. 월 63,500원. 여기서 가장 중요한 건 RDS로 옮기는 것입니다. 이중화보다 백업이 먼저입니다. 장비 한 대 죽는 것보다 데이터 날리는 게 훨씬 치명적입니다.
다운타임이 돈이 되면 C입니다. 월 623,700원. 이 단계로 넘어갈 판단 기준은 트래픽이 아니라 **"한 시간 멈추면 얼마를 잃는가"**입니다. 그 값이 월 62만 원보다 작다면 아직 B에 있어도 됩니다.
환율은 매달 예산을 바꿉니다
C 구성(VAT 포함)을 환율만 바꿔서 보면 이렇습니다.
| 환율 | 월 비용 |
|---|---|
| 1,250원 | 581,800원 |
| 1,340원 | 623,700원 |
| 1,450원 | 674,900원 |
아무것도 안 바꿨는데 위아래로 9만 원이 움직입니다. 달러로 예산을 잡고 원화로 결재를 올리는 조직이라면, 이 차이 때문에 매 분기 "왜 늘었냐"는 질문을 받게 됩니다. 예산은 달러로 관리하고 환율은 따로 보고하는 편이 설명이 쉽습니다.
정리
- 서울 리전 기준 Spring Boot 서비스 하나는 취미 7,700원 / 1인 실서비스 63,500원 / 이중화 프로덕션 623,700원입니다.
- 이중화 구성에서 앱 서버 비중은 18%뿐입니다. 나머지는 이중화·네트워크·관측입니다.
- NAT Gateway(월 123,300원)가 단일 항목 1위입니다. VPC 엔드포인트로 대부분 걷어낼 수 있습니다.
- 데이터 전송은 100GB까지 무료, 그 뒤로 GB당 169원입니다. CloudFront가 답입니다.
- CloudWatch 로그는 GB당 약 $0.76 — 로그 100GB면 DB보다 비쌉니다.
- JVM 때문에 2GB가 현실적 하한이고, 느린 기동이 여유분이라는 고정비를 만듭니다.
- 인프라 관리에 주 4시간을 쓰면 **사람 값이 인프라비의 80%**입니다. RDS를 직접 굴려서 아끼는 22,500원은 대개 손해입니다.
- Vercel은 Spring Boot를 못 돌립니다. JVM 런타임이 없어 프런트엔드 조합일 뿐입니다.
- 소규모에서는 Railway 43,600원 / Fly.io 30,700원 / Render·Supabase 59,000원으로 구성 B보다 싸고, 배포·TLS·모니터링이 딸려 옵니다.
- 다만 Railway의 vCPU 단가는 EC2의 2.6배입니다. CPU를 상시 쓰는 앱이 늘면 역전됩니다.
- 무료 티어는 잠듭니다. Render Free + Spring Boot는 첫 요청마다 20~40초를 물립니다.
- 표시가에 **VAT 10%**를 더하고, 환율이 100원 오르면 C 구성에서 월 46,500원이 더 나갑니다.
여러분의 서비스는 지금 A, B, C 중 어디에 있나요? 그리고 그 단계를 트래픽으로 정하셨나요, 다운타임 비용으로 정하셨나요?
출처
- Amazon EC2 요금 — 서울 리전 온디맨드 단가.
- Amazon RDS 요금 — 인스턴스·스토리지·Multi-AZ 단가.
- Elastic Load Balancing 요금 — ALB 시간당 요금과 LCU.
- Amazon VPC 요금 — NAT Gateway 시간당·처리량 요금, VPC 엔드포인트.
- AWS 데이터 전송 요금 — 아웃바운드 GB 단가와 월 100GB 무료분.
- Amazon CloudWatch 요금 — 로그 수집·보관 단가.
- AWS 한국 부가가치세 안내 — 국내 청구 시 VAT 10%.
- Hetzner Cloud 요금 — CX22 등 유럽 리전 정가.
- Oracle Cloud Always Free — Ampere 무료 한도.
- Vercel 요금 및 지원 런타임 문서 — Java 런타임이 없다는 근거.
- Railway 요금 — vCPU·RAM·볼륨·이그레스 단가.
- Render 요금 — Web Service와 Postgres 플랜.
- Fly.io 요금 — CPU·RAM·볼륨 단가.
- Supabase 요금 — Pro 플랜과 Free 티어 일시 정지 정책.