← 작업
Case 01 · 2024년부터 현재
9개 언어, 유료 사용자 26명, 2024년부터 운영
독자의 선택에 따라 이야기가 갈라지는 인터랙티브 픽션 앱. 제가 설계하고 만들어 지금도 운영하는 Kotlin 백엔드 하나로 9개 언어를 서비스합니다.
스토어 등록 정보가 공개되면 스크린샷을 올립니다.
결과
- 9서비스 언어
- 26유료 사용자, 2026년 7월
- 61실결제 건수, 2026년 7월
- 2024운영 시작
맡은 일
- Ktor와 JVM 21 위의 백엔드 설계
- PostgreSQL 스키마와 JSONB 번역 레이어
- 코인·구독·보상형 광고를 하나의 장부로
- Cloudflare R2 미디어 전송
- Docker Compose 배포와 일상 운영
개요
독자는 AI 내레이터와 대화하고, 줄거리는 선택에 따라 갈라집니다. 앱은 2024년부터 App Store와 Google Play에 올라가 있고 한국어·영어·일본어·태국어·인도네시아어·말레이어·터키어·프랑스어·독일어를 지원합니다.
화면 뒤의 모든 것, 즉 API·데이터베이스·미디어 파이프라인·릴리스 절차를 제가 맡고 있습니다. 새 스토리는 제가 운영하는 배포 파이프라인으로 나가고, 2026년 7월 기준 실결제 61건에 유료 사용자 26명입니다.
제품과 고객사 이름은 NDA에 따라 비공개입니다. 표시된 스택, 구조, 숫자는 사실입니다.
스택
- Kotlin
- Ktor / JVM 21
- Compose Multiplatform
- PostgreSQL 16
- Cloudflare R2
- Docker Compose
- RevenueCat
- AdMob
구조
Client
- Compose Multiplatform · iOS / Android
API
- Ktor · JVM 21
Services
- PostgreSQL 16
- Cloudflare R2 (media)
- RevenueCat (webhooks)
- AdMob (rewarded)
중요했던 결정
- 01
번역은 JSONB에 산다
콘텐츠 하나가 아홉 개 언어 번역을 JSONB 컬럼 하나에 담습니다. 언어를 추가하는 일은 데이터 변경이지 마이그레이션이 아닙니다.
- 02
세 가지 수익원, 장부 하나
코인, 월 구독, 보상형 광고가 사용자별 잔액 하나로 정산됩니다. 웹훅 재시도와 환불은 원자적으로 되돌아가서 값이 어긋나지 않습니다.
- 03
스토리도 코드처럼 배포
새 스토리는 JSON으로 rsync와 DB 마이그레이션을 한 번에 거쳐 나갑니다. 버전 태그와 롤백 경로가 있습니다.
- 04
혼자 당직을 서기 위한 로그
요청·오류·웹훅 로그가 데이터베이스에 남아서, 아홉 개 시장 어디에서 온 버그 제보든 SSH 없이 재현할 수 있습니다.
