[안드로이드 / Kotlin] Moshi

2022. 9. 30. 15:58·Android
반응형

오늘은 최근 안드로이드 네트워킹시 자주 이용되고 있는 Moshi에 대해 간략하게 알아보도록 하겠습니다!

 

 

Moshi

보통 직렬화, 역직렬화 라이브러리로 Gson을 많이들 이용하셨을거라는 생각이 듭니다. 안드로이드 개발 언어의 추세가 자바에서 코틀린으로 넘어가게되면서 Gson외에도 Moshi라는 라이브러리가 최근 많이 이용되고 있습니다.

Moshi란, Gson과 마찬가지로 Json과 객체 사이의 직렬화 및 역직렬화를 안전하게 할 수 있도록 돕는 라이브러리 입니다. Gson이라는 라이브러리가 있음에도 최근 Moshi의 사용이 증가하는 이유가 무엇일까요?

 

이유를 간단히 살펴보면 아래와 같습니다.

  1. Kotlin 친화적이다.
  2. Gson의 리플랙션외 Code-gen 방식이 변환을 지원한다.
  3. 어뎁터를 커스텀하여 사용할 수 있다.
  4. 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
'Android' 카테고리의 다른 글
  • [안드로이드] ConstraintLayout 뷰 밀림 문제
  • [안드로이드 / Kotlin] ViewPager2 setCurrentItem duration
  • [안드로이드 / Kotlin] Clean Architecture 개념
  • [안드로이드 / Kotlin] 소스코드 수정 없이 debug/release 앱 분리하기
서주냥
서주냥
간단한 것도 기록하는 습관을 가지자
  • 서주냥
    DroidLog
    서주냥
  • 전체
    오늘
    어제
    • 전체보기 (58)
      • 알고리즘 (12)
        • 백준 (4)
        • 프로그래머스 (5)
        • 개념 (3)
      • Android (43)
        • Compose (1)
      • Java (2)
      • Kotlin (1)
  • 링크

    • GitHub
  • 인기 글

  • 태그

    moshi
    최단 경로
    이진 탐색
    Hilt
    벨만 포드
    코루틴
    코틀린
    다이나믹 프로그래밍
    SnackBar
    viewmodel
    클린 아키텍처
    자바
    ConstraintLayout
    백준
    BLE
    블루투스
    reified
    안드로이드
    Coroutine Flow
    FusedLocationProviderClient
    Coroutine
    Clean Architecture
    RecyclerView
    프로그래머스
    투 포인터
    textunit
    뷰모델
    알고리즘
    debounce
    viewpager2
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
서주냥
[안드로이드 / Kotlin] Moshi

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.