2024-01-18 복습 모드 지원 및 기능 개선
January 18, 2024
📝 복습 모드 버그 수정 완료
수정 사항
- O/X 버튼 비활성화 문제 완전 해결
- 복습 모드 마스터 처리 로직 개선 (원래 파일명 보존)
- 복습 완료 UI 개선 (“다시 복습” 및 “홈으로 가기” 버튼 추가)
1. 복습 모드 O/X 버튼 버그 수정
문제
복습 모드에서 문제를 4개 이상 풀면 O/X 버튼이 비활성화(disable)되는 문제가 발생했습니다.
원인
QuizScreen.kt에서 O/X 버튼의 enabled 조건이 !currentQuestion.isAnswered로만 설정되어 있었습니다. 틀린 문제는 이미 답변 상태(userAnswer != null)로 로드되어 버튼이 비활성화되었습니다.
해결
// QuizScreen.kt
val isReviewMode = uiState is QuizUiState.Success && uiState.quiz.fileName == "review_mode"
// O/X 버튼 enabled 조건
enabled = isReviewMode || !currentQuestion.isAnswered
복습 모드에서는 항상 버튼을 활성화하여 언제든 O/X 선택할 수 있습니다.
2. 복습 모드 마스터 처리 개선
문제
복습 모드에서 정답을 맞추면 마스터 처리가 review_mode 파일명으로 저장되어 틀린 문제 목록에서 제외되지 않았습니다.
해결
Question 모델 변경
// QuizModels.kt
data class Question(
val id: Int,
val question: String,
val answer: Boolean,
val explanation: String,
val userAnswer: Boolean? = null,
val fileName: String? = null,
val originalFileName: String? = null // 원래 퀴즈 파일명 보존
)
QuizRepository 틀린 문제 로드 로직 변경
// QuizRepository.kt - getWrongQuestions()
wrongQuestions.add(
Question(
fileName = "review_mode", // 복습 모드 파일명
originalFileName = fileName, // 원래 파일명 보존
userAnswer = null,
...
)
)
QuizViewModel 마스터 처리 로직 변경
// QuizViewModel.kt - AnswerQuestion 이벤트 처리
if (isReviewMode) {
if (event.isCorrect && currentQuestion.originalFileName != null) {
repository.markQuestionMastered(currentQuestion.originalFileName!!, currentQuestion.id)
}
}
QuizRepository 마스터 처리 로직 변경
// QuizRepository.kt - updateReviewProgress()
fun updateReviewProgress(questions: List<Question>) {
questions.forEach { question ->
if (question.userAnswer == question.answer && question.originalFileName != null) {
markQuestionMastered(question.originalFileName, question.id)
}
}
}
개선 효과
- ✅ 틀린 문제를 올바르게 마스터 처리
- ✅ 마스터된 문제가 다음 복습 시 틀린 문제 목록에서 제외됨
- ✅ 원래 파일명을 보존하여 데이터 일관성 유지
3. 복습 완료 UI 개선
문제
복습 모드 완료 후 일반 결과 화면(“결과 보기” 버튼)이 표시되어 복습 모드 특성(“다시 복습”)이 고려되지 않았습니다.
해결
ResultScreen 파라미터 추가
// ResultScreen.kt
@Composable
fun ResultScreen(
...
isReviewMode: Boolean = false // 복습 모드 여부 추가
) {
val scrollState = rememberScrollState()
if (isReviewMode) {
ReviewModeResultContent(...) // 복습 완료 전용 UI 호출
return
}
// 기존 일반 모드 UI 로직...
}
ReviewModeResultContent 컴포넌트 추가
// ResultScreen.kt
@Composable
private fun ReviewModeResultContent(
totalQuestions: Int,
correctAnswers: Int,
onContinueReview: () -> Unit = {},
onNavigateToHome: () -> Unit,
isDarkMode: Boolean
) {
Column(...) {
// 복습 완료 메시지
Text("복습 완료!")
// 마스터된 문제 수
Text("${correctAnswers}개 문제를 마스터했습니다.")
// 버튼 Row
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
Button(onClick = onContinueReview, ...) {
Text("다시 복습")
}
Button(onClick = onNavigateToHome, ...) {
Text("홈으로 가기")
}
}
}
}
개선 효과
- ✅ 복습 완료 시 전용 UI 표시
- ✅ “다시 복습” 및 “홈으로 가기” 버튼으로 사용자 경험 개선
- ✅ “결과 보기” 버튼이 표시되지 않도록 분리
기술적 개선 사항
1. Compose 최적화
rememberScrollState()로 스크롤 상태 캐싱- 불필요한 recomposition 방지
2. 코드 구조화
- UI 컴포넌트 분리 (
ReviewModeResultContent) - 파라미터 전달 방식 개선
3. 사용자 경험 개선
- 복습 모드에서 명확한 기능 제공
- 버튼 배치와 간격 최적화
🎯 개선 전망
단기
- 틀린 문제별 난이도 추천 시스템
- 복습 히토리 추적 (어떤 문제를 자주 틀리는지)
- 복습 효율 분석 (어떤 시점에 복습하는지)
중기
- 복습 모드 커스터마이징 기능
- 자동으로 복습할 문제 추천
- AI 기반 오답 패턴 분석
📊 수정 내용 요약
| 항목 | 내용 |
|---|---|
| 파일 수정 | 3개 파일 (QuizModels.kt, QuizRepository.kt, QuizViewModel.kt, ResultScreen.kt) |
| 기능 추가 | 복습 완료 UI, 마스터 처리 개선 |
| 버그 수정 | O/X 버튼 비활성화 문제 완전 해결 |
| 코드 개선 | Compose 최적화, 코드 구조화 |
✅ 검증 사항
- 컴파일 성공 (BUILD SUCCESSFUL)
- 마스터 처리 로직 검증 완료
- 복습 완료 UI 검증 완료
- 원래 파일명 보존 기능 검증 완료
🙏 사용자를 위한 제언
이번 업데이트를 통해 복습 모드를 완전하게 개선했습니다:
- 버그 수정: O/X 버튼 비활성화 문제 완전 해결
- 기능 개선: 마스터 처리 로직 개선으로 틀린 문제 제외가 올바르게 동작
- UX 개선: 복습 완료 후 명확한 UI 제공
이제 복습 모드를 사용하실 때 다음과 같이 개선된 경험을 느끼실 수 있습니다:
- 모든 문제에서 O/X 버튼이 정상 작동
- 마스터 처리가 올바르게 이루어져 다음 복습 시 이미 마스터된 문제가 제외됨
- 복습 완료 후 “다시 복습” 또는 “홈으로 가기”로 명확하게 선택 가능
감사합니다! 🎉