오늘은 최근 안드로이드 네트워킹시 자주 이용되고 있는 Moshi에 대해 간략하게 알아보도록 하겠습니다!
Moshi
보통 직렬화, 역직렬화 라이브러리로 Gson을 많이들 이용하셨을거라는 생각이 듭니다. 안드로이드 개발 언어의 추세가 자바에서 코틀린으로 넘어가게되면서 Gson외에도 Moshi라는 라이브러리가 최근 많이 이용되고 있습니다.
Moshi란, Gson과 마찬가지로 Json과 객체 사이의 직렬화 및 역직렬화를 안전하게 할 수 있도록 돕는 라이브러리 입니다. Gson이라는 라이브러리가 있음에도 최근 Moshi의 사용이 증가하는 이유가 무엇일까요?
이유를 간단히 살펴보면 아래와 같습니다.
- Kotlin 친화적이다.
- Gson의 리플랙션외 Code-gen 방식이 변환을 지원한다.
- 어뎁터를 커스텀하여 사용할 수 있다.
- Gson에 비해 빠르고 적은 메모리를 사용한다.
이외에도 필드의 null 및 기본값 처리 편의성이나, 알 수 없는 데이터 타입의 처리등의 장점이 있습니다.
지금부터는 Moshi를 사용하는 방법에 대해 알아보도록 하겠습니다!
의존성 (Gradle)
- buildSrc -
const val RETROFIT = "2.9.0"
const val MOSHI = "1.9.3"
const val MOSHI = "com.squareup.moshi:moshi-kotlin:${Version.MOSHI}"
const val MOSHI_CONVERTER = "com.squareup.retrofit2:converter-moshi:${Version.RETROFIT}"
- build.grade.kts -
implementation(Library.Network.MOSHI)
implementation(Library.Network.MOSHI_CONVERTER)
모듈 (Module - Hilt)
@Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}
모델 (Model)
@JsonClass(generateAdapter = true)
data class UnsplashPhoto(
@Json(name = "id") val id: String,
@Json(name = "urls") val urls: UnsplashPhotoUrls,
@Json(name = "user") val user: UnsplashUser
)
@JsonClass 어노테이션에서 generateAdapter를 true로 해주셔야 code-gen 방식으로 직렬화 및 역직렬화가 가능하니 꼭 잊지말고 해주셔야합니다!
@Json 어노테이션의 name에는 Json 포멧의 key 값을 대응시켜주시면 되겠습니다.
+ 추가적으로 Json Array의 경우 List<JsonClass> 형식으로 표현이 가능합니다.
추가) @JsonQualifier
Moshi의 장점 중에 커스텀 어뎁터를 만들어 사용할 수 있다는 점이 있었습니다. 이때 같은 타입의 값에 대해 특별한 타입으로 변환하는 처리가 필요한 경우 @JsonQualifier 어노테이션을 이용하시면됩니다!
예를 들어 색깔코드(String) 값을 Int형으로 바꾸는 경우를 살펴보도록 하겠습니다.
1. 커스텀 어노테이션 생성
@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class HexColor
2. 모델에 커스텀 어노테이션 적용
@JsonClass(generateAdapter = true)
data class ColorItem(
val width : Int,
val height : Int,
@HexColor
val color : Int
)
3. 커스텀 어뎁터에 정의
class CustomAdapter{
@ToJson
fun toJson(@HexColor rgb: Int): String? {
return String.format("#%06x", rgb)
}
@FromJson
@HexColor
fun fromJson(rgb: String): Int {
return rgb.substring(1).toInt(16)
}
}
오늘은 간단하게 Moshi의 개념 및 사용법에 대해 알아보았습니다.
제가 작성한 기능 외에도 더 많은 기능들이 있기 때문에 직렬화, 역직렬화 라이브러리로
Moshi를 적극 활용하시면 좋을 듯 싶습니다 🤗
'Android' 카테고리의 다른 글
[안드로이드] ConstraintLayout 뷰 밀림 문제 (0) | 2022.10.30 |
---|---|
[안드로이드 / Kotlin] ViewPager2 setCurrentItem duration (0) | 2022.10.28 |
[안드로이드 / Kotlin] Clean Architecture 개념 (0) | 2022.09.18 |
[안드로이드 / Kotlin] 소스코드 수정 없이 debug/release 앱 분리하기 (0) | 2022.05.29 |
[안드로이드 / Kotlin] Status bar 투명하게 (with DrawerLayout) (0) | 2022.05.18 |