Retrofit2 + Gson 왜 써?

현빈·2022년 10월 30일
0

Android

목록 보기
4/4
post-thumbnail
post-custom-banner

Gson이란?

| Json → Java 객체, Java 객체 → Json 의 변환을 도와주는 라이브러리입니다.

그러면 Gson과 Retrofit2를 같이 사용하는 이유를 알아보겠습니다.


기본적으로 Retrofit2를 이용하여 서버통신을 진행할 경우, Json의 변수 명에 맞춰 Response Data Class를 생성해주어야 합니다.

EX)

response : 200,
message: "서버 통신에 성공하였습니다!",
data : [
	{
		id: 1,		
		name: "홍길동"
		phone_number: "010-1234-5678"
      	updateAt: "2022.10.28"
	}, 
	{
		id: 2,		
		name: "김철수"
		phone_number: "010-5678-1234"
      	updateAt: "2022.10.28"
	}
]

| 예시를 위해서 Json Response 를 극단적으로 설정해두었습니다...😅

data class User (
	val id: Int,
	val name: String,
	val phone_number: String		// Snake case
    val updateAt: String		// Camel Case
)

data class BaseResponse<T> (
	val response: Int,
	val message: String,
	val data: List<T>
)

하지만 위의 코드를 작성하는 과정에서 팀의 코딩 컨벤션과 일치하지 않는 경우가 생길 수 있습니다.

해당 팀에서 Snake Case를 사용한다면 updateAt 변수가 컨벤션에서 어긋나게 되고, Camel Case를 사용한다면 phone_number 변수가 컨벤션에서 어긋나는 것을 확인할 수 있습니다.

위의 경우에서 Gson 라이브러리를 Retrofit2와 함께 사용합니다.

EX)

response : 200,
message: "서버 통신에 성공하였습니다!",
data : [
	{
		id: 1,		
		name: "홍길동"
		phone_number: "010-1234-5678"
      	updateAt: "2022.10.28"
    }, 
	{
		id: 2,		
		name: "김철수"
		phone_number: "010-5678-1234"
      	updateAt: "2022.10.28"
	}
]
data class User (
	@SeriallizedName("id")
	val id: Int,

	@SeriallizedName("name")
	val name: String,

	@SeriallizedName("phone_nuber")		// Snake Case -> Camel Case
	val phoneNubmer: String
    
    @SeriallizedName("updateAt")		// Camel Case -> Snake Case
    val update_at: String
)

data class BaseResponse<T> (
	val response: Int,
	val message: String,
	val data: List<T>
)
object RetrofitClient {
    val userService: UserService = initService()

    private fun initService(): UserService =
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            // Gson 라이브러리를 이용할 경우 GsonConverFactory 코드를 붙여주셔야 합니다.
			.build()
            .create(UserService::class.java)
    }
}

위의 방식을 이용하여 해당 팀의 컨벤션에 맞게 Data Class 를 사용할 수 있습니다.

profile
주니어 안드로이드 개발자 황현빈입니다!
post-custom-banner

0개의 댓글