-
직렬화 라이브러리 마이그레이션 이유(Gson 에서 Kotlinx-Serialization)Android & Kotlin 2023. 12. 22. 00:12
📌 마이그레이션 배경
- Gson 은 Kotlin 의 Null-Safety 를 완전히 지원하지 못한다
- Backend 로 부터 약속에서 어긋난 응답을 받는 경우가 존재한다(None-Null type 필드가 Null로)
Backend 와 약속된 응답 형태에 근거하여 응답값의 Nullable 을 판단해왔었지만, 간혹 약속되지 않은 Null 을 전달해줄 때가 있었다. 이때Gson 은 None-Null 로 정의 된 필드에 대해서 Null 값이 들어 올 경우 해당 객체에 Null을 주입한다. 그리고 이 필드가 사용되는 시점(정확한 시점으로 규정할 수 없음)에 에러를 발생시킨다. 시점을 규정할 수 없는 탓에 예외처리도 당연히 불가하며 이는 곧 앱 크래시로 이어질 수 있는 위함한 결과를 초래할 수 있다.
[ 마이그레인션 목표 ]
잘못된 응답에대해서 받는 시점에 에러를 발생시켜 에러 핸들링을 가능케 한다.
실제 구체적 에러 사례 정리
1. 예상 응답: string / 서버 응답 : Null
- 결과 : Null
- 예외: java.lang.NullPointerException: Parameter specified as non-null is null
2. 예상 응답: Int / 서버 응답 : Null
- 결과 : 0
- 예외 : 파싱에러
갑자기 왜 0 이 나오지???
결과 값으로 Null 이 들어가고 NPE 가 발생하는 것은 예상했지만 0 이 들어가는 것은 의문이었다.
이에 대해서는 아래와 같이 정리해볼 수 있지만 이는 뇌피셜일 뿐 근거가 명확하지는 않다.- Kotlin Nullable Int? 는 java Integer 로 변환, Non-Null Int 는 java의 int 가 됨
- 원시 자료형으로 변환되는 Int Default 값으로Null 을 갖지 못해 0 으로 초기화 되는 것으로 추정
- 반면 String 은 객체로 null 을 가질 수 있어 Null 로 초기 값을 갖음
📌 마이그레이션 라이브러리 선정 : Kotlinx-Serialization
솔직히 마음속엔 이미 kotlinx-serialization 으로 내정한지 오래지만주요 라이브러리 예상치 못한 Null 예상치 못한 Null(List) Kotlin 호환성 Kotlin-Serialization 에러 던짐 or 기본값 설정 가능 에러던점 or 기본값 설정 가능 상 Moshi 에러 던짐 or 기본 값 설정 가능 애러 던짐 중 Gson Null 이 들어감 Null 이 들어감 하 - 예상치 못한 Null : Data Model에서 인자값이 Non-Null 임에도 불구하고 서버에서 Null 줬을 때
- kotlin 호환성
- Gson 은 Kotlin 의 null-safety 지원 X
- Moshi 는 Sealed Class 와 같이 몇몇 kotlin 기능에 대한 추가적 처리가 필요함
- 성능 평가는(benchmark 기준) 각 기능별로(serialization,deserialization,adapter-creation...) 순위가 상이하며 앱 성능 자체에 큰 영향을 줄 정도가 아니라 다루지 않았습니다. (대체로 Gson 이 가장 느림)
해결책
앱 크래시를 막는 해결책으로서는 두가지 정도를 생각했다.( gson 을 사용하면서 추가적인 조취를 추가할 수도 있지만 이는 근본적 해결책이 아니므로 제외했습니다)
- 전체 예상 응답을 Nullable 하게 선언한다 -> 코틀린의 Null Safety 를 포기하는 것은 너무 크다
- Kotlin Serialization 으로 마이그레이션 한다
현업에 있고 마이그레이션 할 시간과 인력이 부족하다면 1 번을 선택할 수도 있다고 생각한다.
참고
https://medium.com/swlh/using-gson-with-kotlins-non-null-types-468b1c66bd8bUsing GSON with Kotlin’s Non-Null Types
How to overcome GSON’s lack of Kotlin support
medium.com
https://medium.com/@jurajkunier/kotlinx-json-vs-gson-4ba24a21bd73
Kotlinx Json vs Gson
Let’s look at how new Kotlin cross-platform/multi-format reflectionless serialization works and why it’s better than other libraries!
medium.com
Moshi vs KotlinX Serialization — the ultimate benchmark
Moshi and KotlinX Serialization are solutions commonly used in Kotlin language to work with data in JSON format. I’ve decided to look at…
medium.com
'Android & Kotlin' 카테고리의 다른 글
Serialization 라이브러리 마이그레이션 과정(Gson -> Kotlinx-Serialization) (1) 2023.12.23 Hilt 관련 리펙토링 기록 (@binds @Provides 차이 , UsecaseModule) (0) 2023.01.08 DialogFragment 오류 정리 (Radius , 크기 지정) (0) 2022.11.28 By 키워드를 이용한 Shared Preference (0) 2022.11.18 Android 13 알아보기 (Target SDK 33 으로 변경) (0) 2022.11.11