본문 바로가기

Android

[Android] Gson을 대체하는 Moshi

주의! 본 포스팅은 ChatGPT를 통해 만들었습니다
Caution! This Posting was made with ChatGPT

Moshi란?

Moshi는 Square에서 개발한 JSON 파서 라이브러리입니다. Gson과 유사하지만, 성능이 더 빠르고 코틀린과의 호환성이 더 높은 특징을 가지고 있습니다. Moshi는 자바 및 안드로이드 앱과 함께 사용할 수 있습니다.

장점 목록

  • Moshi는 Gson보다 더 빠릅니다.
  • Moshi는 코틀린과의 호환성이 더 높습니다.
  • Moshi는 직렬화 및 역직렬화를 보다 쉽게 할 수 있습니다.
  • Moshi는 유연성이 높아 사용자 정의 형식을 처리하기 쉽습니다.

Gson과의 차이

  • Moshi는 성능이 더 빠릅니다.
  • Moshi는 코틀린과의 호환성이 더 높습니다.
  • Moshi는 JSON으로 직렬화하기 전에 검증 단계를 수행합니다. 이로 인해 오류가 적어집니다.
  • Moshi는 오류가 발생하면 예외를 throw합니다.

Retrofit에서 Moshi 사용법과 필요 dependencies

Moshi를 Retrofit에서 사용하기 위해서는 몇 가지 의존성이 필요합니다.

build.gradle 파일에 다음과 같은 의존성을 추가하세요.

dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
    implementation 'com.squareup.moshi:moshi-kotlin:1.12.0'
}

위 의존성은 Retrofit, Moshi, Moshi-Kotlin을 포함합니다. Moshi-Kotlin은 Kotlin과 함께 Moshi를 사용하기 위한 것입니다.

이제 Retrofit을 사용할 준비가 되었습니다.

다음은 Retrofit에서 Moshi를 사용하는 예시입니다.

val moshi = Moshi.Builder()
    .addLast(KotlinJsonAdapterFactory())
    .build()

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

interface ExampleApiService {
    @GET("example")
    suspend fun getExample(): ExampleResponse
}

data class ExampleResponse(val message: String)

이 예시에서는 Retrofit.Builder()를 사용하여 Retrofit 객체를 생성합니다. baseUrl()은 API의 기본 URL을 지정합니다. addConverterFactory()를 사용하여 MoshiConverterFactory를 추가합니다. MoshiConverterFactory는 Moshi와 Retrofit이 JSON을 변환하도록 해줍니다. 마지막으로 build()를 호출하여 Retrofit 객체를 완성합니다.

그리고 Interface를 생성해주고, 해당 메서드를 통해 API를 호출할 수 있습니다.

JsonClass Annotation에 대한 설명

Moshi는 JSON 데이터를 Kotlin 클래스로 변환할 때 Annotation을 사용합니다. JsonClass Annotation은 데이터 클래스를 매핑하는 데 사용됩니다.

@JsonClass Annotation은 다음과 같이 사용할 수 있습니다.

@JsonClass(generateAdapter = true)
data class ExampleResponse(
    @Json(name = "message") val message: String
)

@JsonClass Annotation은 Moshi가 클래스를 변환하는 데 사용되는 Adapter를 생성하도록 지시합니다.
@Json Annotation은 Moshi에게 JSON 필드 이름과 Kotlin 속성 이름 간의 매핑을 지정합니다.
@Json(name = "message")는 message 필드의 이름이 JSON에서 message로 매핑된다는 것을 나타냅니다.

제공하는 Date Format Adapter들과 날짜 형식 예시들

Moshi는 Date 객체를 직렬화하고 역직렬화하는 데 사용할 수 있는 여러 가지 Adapter를 제공합니다. 다음은 Moshi에서 지원하는 일부 Adapter입니다.

  • Rfc3339DateJsonAdapter : RFC3339 형식의 날짜와 시간을 변환합니다.
    "yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'" (예: "2022-03-10T15:30:00.000000Z")
  • Iso8601DateJsonAdapter : ISO8601 형식의 날짜와 시간을 변환합니다.
    "yyyy-MM-dd'T'HH:mm:ss.SSSZ" (예: "2022-03-10T15:30:00.000-0800")
  • SqlDateJsonAdapter : SQL DATE 형식을 변환합니다.
    "yyyy-MM-dd" (예: "2022-03-10")
  • SqlDateAdapter : SQL DATE 형식을 변환합니다.
    "yyyy-MM-dd" (예: "2022-03-10")
  • SqlTimestampJsonAdapter : SQL TIMESTAMP 형식을 변환합니다.
    "yyyy-MM-dd'T'HH:mm:ss.SSSZ" (예: "2022-03-10T15:30:00.000-0800")
  • UtcDateJsonAdapter : UTC 형식의 날짜와 시간을 변환합니다.
    "yyyy-MM-dd'T'HH:mm:ss'Z'" (예: "2022-03-10T15:30:00Z")

날짜와 시간을 처리하는 Moshi Adapter의 사용 예시입니다.

val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .add(Date::class.java, Rfc3339DateJsonAdapter())
    .build()

위 예시에서 Rfc3339DateJsonAdapter()를 추가하여 RFC3339 형식의 날짜와 시간을 처리할 수 있습니다.

이제 다음과 같이 날짜와 시간을 처리할 수 있습니다.

data class ExampleResponse(
    @Json(name = "created_at") @field:JsonAdapter(Rfc3339DateJsonAdapter::class) val createdAt: Date
)

위 예시에서 @JsonAdapter Annotation을 사용하여 Rfc3339DateJsonAdapter를 ExampleResponse 클래스의 createdAt 필드에 적용할 수 있습니다.

이렇게 Moshi를 사용하여 Retrofit에서 JSON 데이터를 처리하는 방법과 Annotation과 Adapter를 사용하여 데이터를 매핑하는 방법을 알아보았습니다.