음지하게임즈 웹

유휴 비용 0 설계 · 완전 서버리스

게임 배포·커뮤니티·유료 멤버십 웹 서비스입니다. AWS 인프라부터 결제까지 1인으로 개발했고, 유휴 비용 0 — 사용량에만 비례하는 서버리스 구조로 설계·운영했습니다.

역할
1인 개발 (기획 협업 제외 전 범위: 프론트·백엔드·인프라·결제·운영)
기간
2025.10 ~ 2025.12
플랫폼
Web
TypeScriptNext.jsReactNestJSAWS AmplifyDynamoDBLambdaS3CognitoCloudFront

30초 요약

인디 게임 스튜디오의 게임 배포(Unity WebGL 임베드) + 커뮤니티 + 유료 멤버십을 하나로 묶은 웹 서비스입니다 (MAU 3,000+). AWS 인프라(IaC)부터 프론트·백엔드·토스페이먼츠 정기구독 결제·운영 스크립트까지 혼자 개발했습니다. 상시 과금 리소스를 모두 배제한 유휴 비용 0 서버리스 설계 — 비용이 사용량에만 비례하는 구조라 초기 트래픽 구간을 최소 비용으로 통과하고, 성장 시에도 구조 변경이 필요 없습니다. 모든 최적화는 Before/After 수치와 월 비용 환산을 문서로 남기며 진행했습니다.

아키텍처

기술적 도전

유휴 비용 0 설계 — 상시 인프라 없는 완전 서버리스 구성

유휴 비용 $0
증상
인프라 비용은 트래픽이 아니라 구조가 결정합니다. 개인 실험(soobak-playground)에서 VPC·서브넷·NAT 게이트웨이 기반 인프라를 직접 구축해보며, 트래픽과 무관하게 상시 과금 리소스만으로 월 $200가 나가는 것을 경험했습니다.
조치
회사 서비스에서는 상시 과금 리소스(EC2·RDS·NAT Gateway)를 두지 않는 완전 서버리스 구성을 선택했습니다. 프론트는 정적 export(SSR 서버 비용 0), API는 Lambda + 온디맨드 DynamoDB, 정기 결제 배치는 EventBridge → Lambda로 처리해 모든 비용을 사용량에만 비례하게 만들었습니다.

결과

유휴 비용 0 — 트래픽이 없으면 과금도 없고, 트래픽이 늘면 구조 변경 없이 비용만 비례 증가합니다. 초기 서비스에 맞는 비용 구조를 아키텍처 수준에서 확보했습니다.

커서 기반 페이지네이션 — RCU 57% 절감

월 RCU 57% 절감
증상
Offset/Limit은 뒤로 갈수록 비쌉니다. 앞 데이터를 전부 읽어야 해서 10페이지 조회에 10 RCU(Read Capacity Unit)가 들고, 100페이지는 조회 자체가 불가능했습니다.
계측
일 10,000회 조회 가정으로 월 RCU를 정량 산정하고, 페이지 버튼 노출 로직은 11개 시나리오 시뮬레이션으로 검증했습니다.
조치
커서 기반 페이지네이션으로 전환했습니다 — 어느 페이지든 1 RCU로 고정됩니다.

결과

월 705,000 RCU → 300,000 RCU (57% 절감), 평균 응답 50~500ms → 10~50ms, 페이지 상한이 사라졌습니다.

댓글 좋아요 설계 — 3안 비용 비교 후 92% 절감안 채택

월 비용 92% 절감
증상
댓글 전건 좋아요 집계 방식은 월 $96~101로 산정됐습니다 (댓글 100개+대댓글 200개 조회에 304 RCU).
계측
전건 집계 / 지연 로딩 / 배치 조회 3안의 DynamoDB·Lambda 비용을 각각 산정해 비교 문서를 작성했습니다.
조치
배치 조회안을 채택했습니다 (304 RCU → 4 RCU) — Lambda 컨테이너 재사용 인메모리 캐시(TTL 5초)를 더했습니다. 지연 로딩안이 근소하게 더 쌌지만, 호버 없이 즉시 표시되는 UX를 위해 의도적인 트레이드오프를 선택했습니다.

결과

월 $96~101 → $6.37~8.37 (92% 절감), UX 저하는 없습니다.

Redis를 '도입하지 않기로' 한 결정

순비용 +$3.79 → 도입 보류
계측
캐시 도입도 비용 계산의 대상입니다. ElastiCache 도입 시 RCU 99% 절감·응답 30배 개선으로 월 $13을 아낄 수 있지만, t3.micro 인스턴스 비용이 월 $16.79 — 순비용 +$3.79로 손해임을 산정했습니다.
조치
도입을 보류하되 CacheService를 no-op 인터페이스로 남겨, 환경변수 하나로 활성화되는 확장 지점으로 설계했습니다.

결과

현재 규모에서 불필요한 고정비를 차단하면서, 트래픽 증가 시 코드 변경 없이 캐시를 켤 수 있는 구조를 확보했습니다.

토스페이먼츠 정기구독 결제 시스템 — 서버리스 위에서

외부 API 호출 99% 감소
증상
정기결제에는 배치가 필요합니다. 그런데 상시 서버가 없는 서버리스 구조에서는 내부 cron으로 결제 배치를 돌릴 수 없습니다.
조치
토스페이먼츠 빌링키 기반 자동결제를 연동하고, 매일 정기결제 배치는 EventBridge 스케줄 → Lambda 이벤트 분기로 처리했습니다. 웹훅 검증·결제 실패 시 구독 비활성화 처리까지 구현하고, 카드 정보 조회는 24시간 이내 갱신분을 스킵하고 동기화를 백그라운드로 옮겼습니다.

결과

구독 상태 조회 응답 약 1~2초 → 50~100ms, 외부 API 호출 99% 감소. 결제·스케줄러는 Jest 스펙으로 검증합니다.

N+1 쿼리 제거 — 배치 조회 전환

DB 호출 93~98% 감소
증상
댓글·소식 목록에서 항목마다 개별 조회가 발생해 요청당 DynamoDB 호출이 30~50회에 달했습니다.
조치
BatchGetCommand 기반 배치 조회로 전환하고, 목록 API는 ProjectionExpression으로 본문 필드를 제외했습니다.

결과

호출 93~98% 감소, 응답 3배 개선 (약 200ms → 60ms), 목록 응답 크기 약 50KB → 5KB입니다.