
Trivia Battle AI
데일리 퀴즈 · 브레인 게임
Trivia Battle AI는 AI가 실시간으로 문제를 생성하는 4지선다 퀴즈 게임입니다. 12개 카테고리에서 사용자의 정답률에 따라 난이도가 자동으로 조절되며, 매일 바뀌는 데일리 챌린지와 연속 출석 보상으로 가벼운 두뇌 게임 습관을 만들어 줍니다. SwiftUI와 Observation으로 구현했고, 퀴즈 생성은 디바이스에서 OpenAI를 직접 호출하지 않고 AWS Lambda 프록시를 경유해 API 키를 Secrets Manager 뒤에 숨깁니다.
고정된 문제 은행을 쓰는 기존 퀴즈 앱은 금방 문제가 바닥나고 반복되어 흥미를 잃기 쉽습니다. OpenAI(gpt-4o-mini)로 매번 새 문제를 생성하고, 최근 10문항 정답 흐름으로 난이도를 1~10 사이에서 조절해 무한히 신선하면서도 지루하지도 너무 어렵지도 않은 경험을 제공합니다.
앱 미리보기
무엇을 할 수 있나요
AI 실시간 문제 생성
AWS Lambda 프록시가 OpenAI(gpt-4o-mini)를 호출해 카테고리·난이도(1~10)·언어에 맞는 4지선다 문제와 해설을 JSON 모드(response_format: json_object)로 생성합니다. 프롬프트는 난이도를 easy/medium/hard/very hard 레이블로 매핑하고, 한 번에 필요한 수보다 3문항 더 받아 캐시해 끊김 없이 진행합니다.
중복 방지 & 선요청 캐싱
QuestionGenerator actor가 "카테고리_난이도" 키로 미사용 문제를 캐시하고, 이미 출제된 문제 ID(최대 50개)를 프롬프트의 제외 목록으로 전달해 반복을 막습니다. 모든 결과가 중복이면 제외 없이 자동 재시도하는 폴백 경로를 둡니다.
적응형 난이도 엔진
AdaptiveDifficultyEngine이 5.0에서 시작해 정답 시 +0.3(3연속 이상이면 +0.2 보너스), 오답 시 -0.4로 레이팅을 조정하고 1~10 범위로 클램프합니다. 최근 10문항 슬라이딩 윈도우로 정답률을 함께 추적해 항상 적정 도전 수준을 유지합니다.
데일리 챌린지 & 연속 출석
날짜를 시드로 매일 카테고리가 결정론적으로 바뀌고, 연속 출석일에 따라 점수 배율(최대 2배)과 보너스 퀴즈가 주어집니다. 출석 캘린더 뷰로 스트릭을 시각화해 습관 형성을 유도합니다.
순수 함수형 스코어링
QuizEngine은 부수효과 없는 정적 함수로, 기본 100점에 연속 정답 보너스(스트릭×10, 최대 50점)와 남은 시간 비례 타임 보너스(최대 50점)를 합산합니다. 빠르고 정확하게 풀수록 높은 점수가 나오며, 상태는 항상 새 QuizState로 반환됩니다(불변).
AI 힌트
별도 /quiz/hint Lambda 라우트가 정답을 직접 노출하지 않고 1~2문장 단서만 주도록 설계된 시스템 프롬프트로 gpt-4o-mini 힌트를 생성합니다. 문제·보기·정답 인덱스를 받아 사용자 언어로 교육적인 힌트를 돌려줍니다.
글로벌 리더보드
AWS DynamoDB 기반 리더보드 Lambda가 점수·정확도·스트릭을 저장하고, 오늘/주간/전체 기간 필터와 카테고리 필터로 순위를 조회합니다. 점수는 서버에서 0~10,000 범위로 검증하고 표시명은 20자로 잘라 저장합니다.
프리미엄 구독 & 하이브리드 수익화
StoreKit 2 월간/연간 구독(무료 체험 포함)으로 일일 퀴즈 제한 해제와 4개 프리미엄 카테고리를 제공하고, 무료 사용자에게는 Google Mobile Ads의 리워드·전면 광고를 결합한 하이브리드 모델을 적용합니다. ATT(App Tracking Transparency) 동의를 광고 초기화 전에 처리합니다.
어떻게 만들었나요
iOS
Concurrency
Monetization
AI
Backend
Testing & Build
Feature 단위로 폴더를 나눈 MVVM + 순수 함수 도메인 엔진 구조이며, iOS 클라이언트와 AWS 서버리스 백엔드가 분리되어 있습니다. 게임 로직(스코어링·난이도)은 부수효과 없는 정적 enum으로 떼어내 결정론적으로 테스트하고, 외부 통신은 actor 기반 서비스가, 비밀 키는 Lambda 프록시가 담당합니다.
- 1
QuizEngine·AdaptiveDifficultyEngine을 불변 상태(state-in → new-state-out) 순수 함수 enum으로 구현해 점수·난이도 규칙을 결정론적으로 검증 — 15개 단위 테스트로 커버
- 2
OpenAIService·QuestionGenerator·LeaderboardService를 actor로 격리해 캐시·중복 추적·네트워크를 데이터 경쟁 없이 안전하게 관리
- 3
API 키를 디바이스에 두지 않고 AWS Lambda 프록시 + Secrets Manager(콜드스타트 후 키 캐싱)로 보호하는 서버리스 보안 설계
- 4
퀴즈 생성 Lambda와 리더보드 Lambda를 책임별로 분리하고, AWS SDK v3 기반 Node.js ESM(.mjs)으로 작성해 콜드스타트와 의존성을 최소화
- 5
리더보드 Lambda가 기간(오늘/주간/전체)·카테고리 필터를 DynamoDB FilterExpression으로 구성하고, 점수 범위(0~10,000)·표시명 길이를 서버에서 검증
- 6
@Observable ViewModel과 SwiftUI 뷰를 Feature별(Home·Quiz·Leaderboard·Profile·Settings·Onboarding)로 분리하고, 단일 디바이스 언어로 OpenAI 프롬프트 언어를 동기화(en/ko/ja/zh)한 고응집 구성
- 7
AQ 디자인 시스템(Colors·Typography·Spacing·Shadows·Animations·Components)을 별도 Core 레이어로 토큰화해 일관된 게임 UI 제공
12 (8 free + 4 premium)
퀴즈 카테고리
4 (en/ko/ja/zh-Hans)
지원 언어
15
도메인 엔진 단위 테스트
1–10
난이도 레이팅 범위
2 (quiz + leaderboard)
AWS Lambda 함수
76
Swift 파일



