코드랩 Retrofit으로 데이터 가져오기1
kotlin Retrofit + Moshi 로 서버통신하기
팀플하면서 Retrofit도 정말 많이 썼었는데, 처음부터 다시 구현하려니까 가물가물했다..😭 아예 손에 익을때까지는 얼마나 써야할까 ㅎ
다음 사이트의 객체 갯수를 가져오는 예제이다.
위사이트를 들어가면 price, id, type, img_src key-value로 이루어진 객체 배열을 볼 수 있다.
총 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"
(처음 안 사실이지만 $뒤의 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"/>
이거까지 적어주면
서버통신 끝 !
참고
Comments