본문 바로가기
Mobile App

[안드로이드] Json parser Converter 라이브러리 [Gson VS Moshi]

by Jman 2023. 1. 12.

안드로이드 Retrofit 을 사용하여 remote API 통신할 때 Retrofit Builder 패턴에서 사용하는 addConverterFactory 메서드를 본 적이 있었을 것이다. 아래 메서드 매개변수로 우리는 JSON parser Converter 라이브러리를 적용한다.

적용하는 이유는 JSON 직렬화 / 역직렬화 하는 과정이 필요해서다.

직렬화와 역직렬화에 대해서는 다시 블로그를 작성해서 링크를 걸 예정이다.

여기서 간단하게 설명을 하자면, 문자열 <-> 객체 변화하는 과정이라 생각하면 된다.

public Builder addConverterFactory(Converter.Factory factory) {
  converterFactories.add(Objects.requireNonNull(factory, "factory == null"));
  return this;
}
JSON 이란?
Javascript Object Notation 의 약자로 Name 과 Value 로 이루어진 하나의 텍스트 형식이다.
JSON 은 언어로부터 독립적이다. 따라서 다수의 언어 간의 데이터 교환에 사용된다.

JSON 에서는 기본적으로 key : value 형태로 데이터를 표현한다.
또한 데이터들을 묶어 Object(중괄호 { } 로 표기) 와 Array(대괄호 [ ] 로 표기) 형태로 표현한다.

 

 

안드로이드 개발에 보통 JSON 직렬화는 Gson을 했을 것이다.

쓴이도 Retrofit 기술을 사용할 때 블로그에서 찾아보아서 적용했는데 보통 예제 코드가 아래와 같이 적용했었다. 그래서 그냥 자연스럽게 Json Converter 라이브러리를 Gson으로 사용했다. 

retrofit = Retrofit.Builder()
    .baseUrl("$url:$port")
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .client(okHttpClient)
    .build()

 

GsonConverterFactory.create() 이렇게 factory 를 만들어 매개변수로 전달을 했다.

 

여러 Json Converter 라이브러리

  • Gson : com.squareup.retrofit2:converter-gson
  • Jackson : com.squareup.retrofit2:converter-jackson
  • Moshi : com.squareup.retrofit2:converter-moshi
  • Protobuf : com.squareup.retrofit2:converter-protobuf
  • Wire : com.squareup.retrofit2:converter-wire
  • Simple XML : com.squareup.retrofit2:converter-simplexml
  • JAXB : com.squareup.retrofit2:converter-jaxb
  • Scalars(primitives, boxed, String) : com.squareup.retrofit2:converter-scalars

 

위와 같이 여러 라이브러리가 존재하다.

위 라이브러리를 비교해보고 상황에 맞게 사용하면 좋을 것 같다.

일단 여기서는 Gson 과 Moshi 에 대해서 이야기를 해보자.

 

Gson 이란?

보통 API 작업 중에 JSON 값을 받을 때, 클라이언트 쪽에서 이를 파싱해서 필요한 곳에 알맞게 값들을 넣어준다.

그러나 매번 파싱하는 과정에서 JSONObject, JSONArray 를 일일이 코드 작업을 해가면서 파싱하는 것이 귀찮은 작업이 된다.

 

그래서 이 부분을 해소 시켜줄 Gson 라이브러리가 만들어졌다.

간단하게, JSON 을 파싱하는 과정을 단축 시켜주는 라이브러리라고 생각하면 된다.

 

Gson 은 자바 객체를 JSON 으로 변환하는 데 사용할 수 있는 자바 라이브러리다.

JSON 문자열을 동등한 자바 객체로 변환하는 데에도 사용할 수 있다.

 

Gson 인스턴스는 Thread-safe 함으로 여러 스레드에서 자유롭게 재사용할 수 있다.

기본 구성이 필요한 모든 경우 new Gson() 을 호출해 인스턴스 생성이 가능하다.

GsonBuilder 를 써서 버전관리, 사용자 지정 JsonSeralizers, JsonDeserializers, InstanceCreators 와 같은 다양한 구성 옵션으로 Gson 인스턴스를 빌드할 수 있다.

 

아래와 링크를 통해, 사용법을 배울 수 있을 것이다.

https://futurestud.io/tutorials/gson-getting-started-with-java-json-serialization-deserialization

 

Gson — Getting Started with Java-JSON Serialization & Deserialization

Mapping JSON to Java objects (and vice versa) is from the 90s. Gson is the modern solution to map between Java and JSON automatically with minimal effort. You just need to know how! Learn every detail about Gson's capabilities, configuration & customizatio

futurestud.io

 

Moshi 란?

Gson 과 비교해서 더 많은 기능을 갖추고 Kotlin 친화적이고 빠르고 안정적인 JSON Converter 라이브러리 입니다.

 

더 나은점

  • JSON 데이터에서 필드의 구문 분석을 사용자 지정하기 위해 고유한 주석을 생성할 수 있다.
  • 사용자 정의 어댑터 또는 Contextual 역직렬화로 보일러 플레이트 코드를 줄일 수 있다.
  • 직렬화 실패 메시지를 가지고 있다. 따라서, 스택 추적을 받을 때 큰 장점이 된다.
  • OkHttp 또는 Okio 빌더와 유사한 upstream adapter 에서 새로운 adapter 를 생성하는데 사용할 수 있는 newBuilder() API 가 있다.
  • unknown type 에 대해서 대비책을 가지고 있다.
  • Kotlin 용도로 Code-gen adapter 가 존재한다. 오래되고 느린 이전의 리플렉션에 대해서 더 빠른 직렬화 / 역직렬화를 보여준다.

Adapter convenience methods

  • nullSafe()
  • nonNull()
  • lenient()
  • failOnUnknown()
  • indent()
  • serializeNulls()

https://github.com/square/moshi

 

GitHub - square/moshi: A modern JSON library for Kotlin and Java.

A modern JSON library for Kotlin and Java. Contribute to square/moshi development by creating an account on GitHub.

github.com

 

Gson VS Moshi

Gson 보다 훨씬 빠르며, 메모리를 덜 사용한다.

스트림을 구문 분석하는 동안 알수 없거나 원치 않은 필드를 무시하는데 도움이 되는 키를 미리 예측하거나 예상할 수 있는 Okio 를 사용하기 때문이다.

JSON 직렬화 라이브러리(Moshi) 와 네트워킹 라이브러리(Retrofit) 는 버퍼를 공유하여 네트워크 호출을하고 응답을 직렬화하는 동안 메모리 소비를 훨씬 줄이게 된다.