반응형
요약 (Summary)
안드로이드 프로젝트가 코틀린이 주로 구성되어 있다면 HTTP 통신 시 역/직렬화는 Kotlinx Serialization을 사용해야 합니다.
배경 (Background)
HTTP 통신시 Json Converter로는 Java 구성된 Gson이나 Moshi 가 대표적으로 있습니다. 하지만 이것들은 Java 기반이라 Kotlin에 적합하지 않은 문제가 있습니다. 예를 들면 서버에서 field 값을 안 주거나, null로 줬을 때 대응에 어려움이 있습니다.
비교 (Compare)
Gson, Moshi, Kotlinx Converter 를 비교하기 전에 제가 Json Converter 라이브러리를 지정하는 기준은 아래와 같습니다.
- Default Argument 를 사용자가 그때그때마다 처리할 수 있는가?
- List 형식의 데이터도 Default Argument 로 처리할 수 있는가?
- Data Model에서 인자값이 NonNull 임에도 불구하고 서버에서 Null 줬을 때 Default Value를 지정할 수 있는가?
- 성능적으로 이슈가 없는가?
이러한 빡쏀(?) 조건을 충족하는 게 Kotlinx Serialization입니다.
거두절미하고 실제 데이터 통신을 하면서 설명해보도록 하겠습니다.
- Response JsonObject-1
{ status : null, data : { "id" : System.currentTimeMs } }
- Response JsonObject-2
{ status : "success", data : { "id" : System.currTimeMs, "list" : null } }
- Response JsonObject-3
{ status : "success", data : { "id" : System.currTimeMs, "list" : ["onverter test"] } }
위 캡처 화면이면 제가 요구한 조건에 충족한 역/직렬화 라이브러리는 Kotlinx 가 아주 적합해 보입니다.
How To Use (사용법)
- build.gradle
plugin { id 'kotlinx-serialization' } ... dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.1' // Retrofit2 Converter implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0' }
- Data Model
import kotlinx.serialization.Serializable @Serializable data class Example( val id : Int = 0 ) // 어논테이션 Serializable 선언해주고 Default 값을 지정해주면 해당 값이 없거나 Null 인경우 자동으로 지정됩니다.
- Json Builder
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json Json { isLenient = true // Json 큰따옴표 느슨하게 체크. ignoreUnknownKeys = true // Field 값이 없는 경우 무시 coerceInputValues = true // "null" 이 들어간경우 default Argument 값으로 대체 }
- Retrofit Json Converter
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory Retrofit.Builder { ... addConverterFactory( Json { isLenient = true // Json 큰따옴표 느슨하게 체크. ignoreUnknownKeys = true // Field 값이 없는 경우 무시 coerceInputValues = true // "null" 이 들어간경우 default Argument 값으로 대체 }.asConverterFactory("application/json".toMediaType())) )
비교적 사용법은 정말 간단합니다. 앞으론 서버에서 데이터 값이 Null로 인해서 죽거나 Field 값이 없어서 죽는 이슈로부터 벗어나길 바랍니다 :)
사용법 안내
반응형
'android' 카테고리의 다른 글
[안드로이드] Github Action 을 이용한 자동 배포 (2) | 2022.06.05 |
---|---|
안드로이드 개발시 HTTP 트레킹 라이브러리 소개 (1) | 2022.05.05 |
[안드로이드] Visual 라이브러리 "widget" 소개 (0) | 2021.11.02 |
[안드로이드] SimplePermissions 소개 (0) | 2021.11.02 |
드로이드 나이츠 2021 보고 인상 깊었던 세션 #1 (0) | 2021.10.23 |