우리 앱은 사용자의 퀴즈 풀이 결과를 Omr형태로 서버에 저장합니다.

image.png

Int,List<String>이 포함된 List<Any>를 올리고, 퀴즈 결과 화면에서 해당 데이터를 받아와 사용합니다.

1. 문제 상황

Firestore를 통해 데이터를 저장하고 불러오는 과정에서 발생한 문제입니다.

QuizResult 클래스에서 userOmrAnswers는 사용자가 선택한 답안을 포함하고, Number 타입으로 처리됩니다.

특히, evaluateChoiceQuestion 함수에서 userAnswertoInt()로 변환하여 정답과 비교하는 로직을 작성했습니다:

kotlin
코드 복사
private fun evaluateChoiceQuestion(
    index: Int,
    userAnswer: Number,
): Boolean = userAnswer.toInt() == (questions[index] as ChoiceQuestion).answer

Firestore에 데이터를 저장할 때는 분명히 Int 타입으로 저장했으나, 데이터를 다시 불러와 디버깅해보니 userAnswer의 타입이 Long으로 들어오면서 문제가 발생했습니다. 이를 Firestore에서 숫자를 처리하는 방식과 관련된 문제로 파악했습니다.


2. Firestore의 숫자 데이터 처리 방식

Firestore는 내부적으로 모든 숫자 데이터를 Number 타입으로 관리합니다. 이 타입은 크게 두 가지 형태로 저장될 수 있습니다:

Firestore는 모든 정수를 플랫폼 독립적으로 처리하기 위해 기본적으로 Long 타입으로 저장하고 반환합니다.

즉, Kotlin의 Int로 저장한 값이라도 Firestore에서 불러오면 Long으로 반환됩니다.


3. 왜 Firestore는 IntLong으로 반환하는가?

Firestore는 다양한 언어와 플랫폼 간 호환성을 위해 숫자 데이터를 더 큰 범위를 지원하는 타입(Long)으로 통일하여 저장합니다.

예를 들어: