Kotlinx.serialization

김은섭 2.0·2022년 8월 24일
0

Retrofit2의 Converter로 Gson을 사용할 때

val retrofit = Retrofit.Builder()
	.baseUrl("https://example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

Gson을 포함해 Jacson, Moshi 등의 Converter Library는 모두 Java 언어로 개발이 되어있다. 그러니 코틀린에서 사용 가능하지만, 완벽하게 호환되지 않는다.

Kotlinx Serialization - 코틀린에 가장 적합한 Json Converter

여기 글에서 잘 정리해두었다. 자바로 만든 라이브러리다 보니 코틀린 data class의 장점인 default value 문법을 무시한다는 게 문제다.

primitive 타입의 필드는 0, reference 타입의 필드는 null로 처리해버린다.
게다가 gson 컨버터는 코틀린의 null-safety를 준수하지 않는다. not null field인데 null이 들어가 버린다. 그래서 코틀린에서 Gson, Jacson, Moshi 등 자바 컨버터 라이브러리를 쓸 때는 nullable 선언을 해줘야 한다.

Kotlinx.serialization

코틀린에서 공식적으로 제공하고 있는 이 라이브러리를 사용하면 default value 문법이 정상적으로 적용된다.

사용법 역시 Kotlinx Serialization - 코틀린에 가장 적합한 Json Converter 여기에 잘 나와있다.

Retrofit2의 Converter를 Kotlinx.serialization으로 쓰고 싶을 때

Kotlinx.Serialization + Retrofit 사용하기

여기에 잘 나와있다.

1. Dependency를 추가하기

(1) kotlinx.serialization dependency
kotlinx.serialization#setup

위의 공식 문서를 참고.

project 레벨의 build.gradle에 플러그인을 추가하고 module 레벨의 build.gradle에서 플러그인을 적용해줘야 한다.

(2) kotlinx.serialization을 retrofit2와 쉽게 사용할 수 있게 한 com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter dependency

retrofit2-kotlinx-serialization-converter git

2. Converter 바꾸기

val contentType = "application/json".toMediaType()
val retrofit = Retrofit.Builder()
    .baseUrl("https://example.com/")
    .addConverterFactory(Json.asConverterFactory(contentType))
    .build()

3. data class에 @Serialable 주석 달기

패키지명 : kotlinx.serialization.Serializable

내부 클래스에도 모두 @Serialable을 달아준다.

❓ MissingFieldException 오류날 때

Optional properties

필수로 채워지는 프로퍼티가 아닌 경우 default value를 설정해 이 오류를 방지한다.

공식 문서 링크

https://kotlinlang.org/docs/serialization.html#c35b308c
https://blog.jetbrains.com/kotlin/2020/10/kotlinx-serialization-1-0-released/

profile
생각하지 말고 그냥 할게요

0개의 댓글