직렬화 라이브러리 종류는 다양하다. Kotlinx-serialization
외에도 Gson
Moshi
등 여러 라이브러리가 존재한다. Gson
은 종종 사용해본적이 있지만 kotlinx-serialization
은 거의 사용해보지 못했다. 이름부터 코틀린에 최적화된 직렬화 라이브러리인 것 같은 느낌이 드는데, 왜 요새 떠오르는지, 권장하는 직렬화 라이브러리인지 알아보았다.
일단 이름에서 볼 수 있듯이 koltinx-serialization
은 코틀린으로 구현된 라이브러리이다. 반면 Gson
과 Moshi
는 자바로 개발된 라이브러리이기 때문에 코틀린 언어에 최적화되지 않는 점이 몇 가지 존재한다.
가장 대표적으로는 기본 값 할당이다. Gson을 사용할 때 Data class에 default value를 정의해두더라도 값이 들어올 때 제대로 설정이 안되는 문제가 있다.
data class User(
val name: String,
val age: Int = 20,
)
위의 코드에서는 나이의 기본 값을 20으로 설정해두었다.
{
"name" : "Jam"
}
name만 정의된 json 데이터를 User
데이터 클래스로 변환하게 되면 age 값이 0으로 들어오게 된다. 즉, 원하는 기본 값이 설정이 안되는 문제가 발생한다. 0이라는 값으로 들어오는 이유는 primitive 타입 필드에서는 0 값이 할당되게 되고, reference 타입에서는 null 값이 할당되게 된다. 그렇기 때문에 nullable한 필드로 만들어줘야하고 이는 상당히 불편하다. 반면, kotlinx-serialization
은 Deafult Value 를 할당하더라도 원하는 동작이 잘 수행된다.
kotlinx-serialization
은 Reflection을 사용하지 않고 개발한 라이브러리이다.
Reflection이란 구체적인 클래스 타입을 알지 못해도 해당 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다. 프로세스 동작 중에 많은 추가 객체를 생성한다. 이와 같이 이미 사용된 객체들은 GC의 타겟이 되며 과도한 GC 동작으로 인해 성능 저하 및 배터리 소모가 발생할 수 있다.
Serializable과 Parcelable의 차이에 대해서 학습했을 때 Reflection을 사용하지 않고 개발하는 것이 성능상 어떤 이점들이 있는지 확인할 수 있었다. 그렇기 때문에 다른 직렬화 라이브러리보다 성능상의 이점도 존재하는 것을 알 수 있다.