Case 01 · enum FSM / AsyncStream
퀴즈 상태머신 + 제출 배리어 · 불가능한 상태를 타입으로 제거
isReviewing과 isEnd 불리언 조합은 "복습이면서 완료" 같은 불가능한 상태가 컴파일을 통과합니다. 빠른 연타 시 화면과 서버가 어긋나는 문제도 남아 있었습니다.
enum 상태머신으로 불가능한 상태를 타입 차원에서 제거했습니다. 제출은 낙관 진행 + 체크포인트 배리어로 사용자는 기다리지 않고 정합은 경계에서 한 번만 맞춥니다.
진행 상태를 enum 하나로 모델링하고 전이 규칙을 전용 UseCase에 모았습니다. 경계에서 withCheckedContinuation으로 다음 진행을 붙들고 실패분은 큐에 모아 재전송합니다.
불가능한 상태가 타입 차원에서 사라지고, 빠른 연타에도 화면과 서버가 어긋나지 않습니다.
실기기 데모 · 퀴즈 플로우
QuizProgressType.swift 재구현 예제
enum QuizProgressType: Equatable { case study(stage: Int) // 풀이 case review(stage: Int) // 복습 (틀린 문제만) case survey(stage: Int) // 설문 case end( stage: Int, adType: QuizADType) case completed // "복습이면서 완료" 같은 조합이 // 타입 차원에서 불가능해진다 }