android

[안드로이드] Json Converter는 이제 Kotlinx Serialization로 변경해야 하는 이유

sieunju 2021. 12. 18. 16:23
반응형
요약 (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입니다. 

거두절미하고 실제 데이터 통신을 하면서 설명해보도록 하겠습니다.

각 종류별 DataModel

  • Response JsonObject-1
    {
      status : null,
      data : {
        "id" : System.currentTimeMs
      }
    }​

Response JsonObject-1 

  • Response JsonObject-2
    {
      status : "success",
      data : {
        "id" : System.currTimeMs,
        "list" : null
      }
    }​

Response JsonObject-2

  • Response JsonObject-3
    {
      status : "success",
      data : {
        "id" : System.currTimeMs,
        "list" : ["onverter test"]
      }
    }​

Response JsonObject-3

위 캡처 화면이면 제가 요구한 조건에 충족한 역/직렬화 라이브러리는 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 값이 없어서 죽는 이슈로부터 벗어나길 바랍니다 :)

사용법 안내 

https://github.com/sieunju/kotlinxSerialization

 

GitHub - sieunju/kotlinxSerialization: 코틀린에 맞는 역/직렬화 셈플 코드 입니다.

코틀린에 맞는 역/직렬화 셈플 코드 입니다. Contribute to sieunju/kotlinxSerialization development by creating an account on GitHub.

github.com

반응형