서두
저는 최근 nexon open api를 이용하여 "메이플스토리" 게임의 캐릭터 정보를 검색하는 앱을 만들고 있습니다.
해당 글 또한 해당 앱을 만들면서 Json 직렬화/역직렬화 라이브러리를 변경하게된 이유를 설명한글입니다.
해당 앱에대해 더 궁금하시다면 아래 링크를 방문해주시면 감사하겠습니다.
https://github.com/hegunhee/MapleFinder
GitHub - hegunhee/MapleFinder
Contribute to hegunhee/MapleFinder development by creating an account on GitHub.
github.com
Moshi에서 Serialization로 전환하게된 계기 (현 상황)
캐릭터의 장비 정보를 받기위해 api response class를 작성하기 위해 api 명세를 확인하던중
캐릭터 장비의 전체 옵션이 해당 장비의 강화로 증가하는 옵션의 총 합이라는걸 발견했습니다.
ex) 전체 옵션 = 기본 옵션 + 추가 옵션 + 주문서 강화 옵션(익셉셔널) + 스타포스 강화 옵션
현재 json 명세에 큐브 관련 옵션은 분리되어있기때문에 제외했습니다.
그리고 추가적으로 붙는 옵션들은 전체 옵션 혹은 다른옵션들과 key-value 한 두개정도 차이가 나므로
똑같은 class로 moshi 라이브러리를 이용해 json 역직렬화가 불가능했습니다.





kotlinx.serialization 라이브러리에서 json builder 설정을 통해 특정 프로퍼티를 무시할 수 있는 설정이 있다는걸 발견하고
기존의 설정에서 json converter와 api response에 설정된 annotation만 변경하면 되기때문에
작은 비용으로 moshi에서 kotlinx.serialization라이브러리로 변경하게 되었습니다.

json 빌더안에 ignoreUnknownKeys 플래그를 true로 설정한다면
정의하지 않은 key-value 쌍이 존재하더라도 SerializationException을 던지는것이 아닌 무시하게됩니다.
이 외에도

여러가지 설정들을 변경할 수 있습니다.
결과적으로 ignoreUnknownKeys 플래그 설정을 통해 아이템 옵션 클래스 한개만 만들어 추가옵션, 주문서 옵션, 스타포스 옵션등을 모두 커버할 수 있게 되었습니다.

아이템 전체 옵션이 다른 강화 옵션들을 포함하므로 해당 클래스만으로 사용할 수 있습니다.
그리고 moshi에서 api response class를 작성하는법과 많이 닮았습니다.
kotlinx.serializable에서도 json key값과 data class 프로퍼티 값이 다를때 @SerialName 어노테이션을 이용하면 됩니다.
retrofit 환경에서 kotlinx.serializable을 사용하는방법은 아래 링크를 참고해주시면 감사하겠습니다.
https://readystory.tistory.com/178
Kotlinx.Serialization + Retrofit 사용하기
이전 글에서 Kotlinx.Serialization을 알아봤습니다. [Kotlin/Library] - Kotlinx Serialization - 코틀린에 가장 적합한 Json Converter Kotlinx Serialization - 코틀린에 가장 적합한 Json Converter 아마 REST API를 구현해보신
readystory.tistory.com
사용하면서 알게된 kotlinx.serializable의 장점
- Kotlin을 지향합니다. (non-nullable)
기존의 Moshi를 사용하다보면 default value를 사용하려할때 번거로운 설정을 해줘야했지만
생성자에 default value를 설정하면 됩니다.
Json builder 설정중에 coerceInputValues를 true로 설정해
json value값이 null이 떨어지더라도 해당 프로퍼티값을 not-nullable하게 설정할 수 있습니다.
대신 해당 프로퍼티의 default value를 설정해야합니다. - 컴파일 타임 에러
다른 라이브러리와는 다르게 kotlinx.serialization 라이브러리는
@Serializable 어노테이션이 있는 클래스만 직렬화하기 때문에
직렬화를 수행할 수 없는 경우 런타임 에러 대신 컴파일 에러가 발생하기때문에
디버그가 쉬워집니다.

결론
moshi에서 kotlinx.serialization 으로 전환하게되면서 nullable한 코드를 줄이게되어 유지보수하거나
데이터를 가공할때 많은 이점을 가져갈 수 있고
kotlin을 지향하며 json builder를 통해 많은 설정을 할 수 있기때문에
앞으로의 json parser 라이브러리로 kotlinx.serialization를 애용할것같습니다.
긴 글 읽어줘서 감사합니다.
'Study > Android' 카테고리의 다른 글
| [Hilt] @Provides를 사용하는 경우 object 키워드로 클래스를 정의해야 하는 이유 (2) | 2024.12.18 |
|---|---|
| [Android] 멀티모듈 프로젝트 UI단에서 httpException을 처리하는 방법 (0) | 2024.03.11 |
| compileSdk vs targetSdk (0) | 2024.02.21 |
| BindingAdapter 적용 (0) | 2022.04.13 |
| Android의 Context (0) | 2022.04.04 |