코드랩 Retrofit으로 데이터 가져오기1

1 minute read

kotlin Retrofit + Moshi 로 서버통신하기

팀플하면서 Retrofit도 정말 많이 썼었는데, 처음부터 다시 구현하려니까 가물가물했다..😭 아예 손에 익을때까지는 얼마나 써야할까 ㅎ


다음 사이트의 객체 갯수를 가져오는 예제이다.

위사이트를 들어가면 price, id, type, img_src key-value로 이루어진 객체 배열을 볼 수 있다.

스크린샷 2021-02-15 오후 11 53 12

총 838개의 객체가 있다고 한다ㅎㅎ

Retrofit 객체 생성하기

먼저 Retrofit 모듈을 추가해준다.

build.gradle(Module)

implementation "com.squareup.retrofit2:retrofit:$version_retrofit"  
//    implementation "com.squareup.retrofit2:converter-scalars:$version_retrofit"  
  
  implementation "com.squareup.moshi:moshi-kotlin:$version_moshi"  
  implementation "com.squareup.retrofit2:converter-moshi:$version_retrofit"

스크린샷 2021-02-15 오후 11 58 14

(처음 안 사실이지만 $뒤의 version~ 이건 build.gradle(Project)에서 상수처럼 선언한 것이였다ㅎ.. def 로 맨위에 선언해놓는것도 좋지만 한눈에 보기도 쉽고, 버전 바꿀때 간단해서 좋은 방법인거같다.)

response가 객체 리스트기 때문에, 객체클래스를 만들어준다.

class MarsProperty(  
  val id: String,  
        @Json(name = "img_src")  
  val imgSrcUrl : String,  
        val type : String,  
        val price : Double  
)

본격적으로 retrofit을 사용하기 위한 코드를 작성한다!

1) 서버를 가져올 BASE_URL 주소를 적어준다. (위 사이트의 주소이다.)

private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com/"

2) 그 다음 retrofit 객체를 생성해준다.

private val retrofit = Retrofit.Builder()  
  .addConverterFactory(MoshiConverterFactory.create(moshi))  
  .baseUrl(BASE_URL)  
  .build()

여태껏 Retrofit을 사용하면서 gson컨버터만 사용해봤고 moshi라는 컨버터는 처음 봤다.

찾아보니 moshi로 바뀌는 추세라고 한다.

3) 그 다음 GET, POST, DELETE, PUT등 api를 호출하는 함수를 적어줄 interface를 만든다. (서버통신은 시간이 오래걸리는 작업이기 때문에 코루틴을 사용해줬다.)

interface MarsApiService{  
  @GET("realestate")  
  suspend fun getProperties(): List<MarsProperty>  
}

4) Retrofit에 접근해주기 위해서 서비스 인스턴스를 만들어준다. 하나만 필요하기 때문에 공용개체 사용 !

object MarsApi{  
  //호출 계산비용 많이 들기 때문에 느리게 초기화 함  
  val retrofitService : MarsApiService by lazy {  
  retrofit.create(MarsApiService::class.java)  
  }  
}

마지막으로 만들어둔 retrofit 객체와 함수를 사용하여 데이터를 가져오면 된다. 함수에 suspend를 붙여줬기 때문에 viewModel.Scope ~ 를 사용해야한다.

private fun getMarsRealEstateProperties() {  
  //callback 대신 코루틴 사용 ?  viewModelScope.launch {  
  try{  
  val listResult = MarsApi.retrofitService.getProperties()  
  _response.value = "Success: ${listResult.size} Mars properties retrieved"  
  }catch (e: Exception){  
  _response.value = e.message  
        }  
  }  
  
}

*manifests에

<uses-permission android:name="android.permission.INTERNET"/>

이거까지 적어주면

서버통신 끝 !


참고

코드랩 :https://developer.android.com/codelabs/kotlin-android-training-internet-data?index=..%2F..android-kotlin-fundamentals#0

Comments