안드로이드 코틀린 기초 코드랩을 학습한 내용입니다.
https://developer.android.com/courses/kotlin-android-fundamentals/overview?hl=ko
이번 코드랩에서 사용 할 MarsRealEstate 앱에 대한 구조를 살펴보자.
private val viewModel: OverviewViewModel by lazy{
ViewModelProvider(this).get(OverviewViewModel::class.java)
}
https://android-kotlin-fun-mars-server.appspot.com
app gradle 파일에 retrofit 의존성을 추가해주자.
implementation "com.squareup.retrofit2:retrofit:$version_retrofit"
implementation "com.squareup.retrofit2:converter-scalars:$version_retrofit"
레트로핏은 서버로부터 데이터를 가져와서 data를 decode하는 convert 과정을 거쳐 사용가능한 객체의 형태로 반환해준다.
레트로핏은 XML, JSON과 같은 유명한 웹 데이터 포맷들에 대해 지원해준다.
백그라운드 쓰레드에서 요청하는 것과 같은 중요한 세부 정보들을 포함해서 네트워크 계층의 대부분 내용을 생성한다.
private val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build()
레트로핏을 사용하기 위해 적어도 2가지가 준비 되어야한다. web service를 위한 base url, 그리고 converter factory
. converters는 레트로핏에게 웹 서버로부터 받은 데이터로 무엇을 해야하는지 알려줄 수 있다.
interface MarsApiService {
@GET("realestate")
fun getProperties():
Call<String>
}
realestate를 base url의 endpoint에 추가 하라는 의미다.
Call 객체는 request를 시작하기 위해 사용하는데 refrofit 인터페이스 설명을 잘 보면 각 call yields는 자신의 http reqeust, response 쌍을 가지고 있다고 한다.
rest api 메서드를 interface에 정의 해줬다면 이제 생성하는 코드를 만들어 줘야한다.
object MarsApi {
val retrofitService: MarsApiService by lazy {
retrofit.create(MarsApiService::class.java)
}
}
앱은 1개의 Retrofit service 객체가 필요하기 때문에 MarsApi라는 object를 이용해서 서비스를 앱 전체에서 사용할 수 있게 처리해준다.
윗 단계까지 retrofit을 이용한 메서드를 정의 했는데 실제로 사용 해보자. OverviewViewModel에서 retrofit service를 바로 호출하는 구조를 가지고 있으며 viewModel의 getMarsRealEstateProperties()에서 api 호출 로직을 추가한다.
MarsApi.retrofitService.getProperties().enqueue(
object: Callback<String> {
override fun onResponse(call: Call<String>, response: Response<String>) {
TODO("Not yet implemented")
}
override fun onFailure(call: Call<String>, t: Throwable) {
TODO("Not yet implemented")
}
})
비동기 요청을 전달하고 요청의 응답 값을 Callback 구현체를 통해 넘겨받을 수 있게 된다.
API 호출이 정상적으로 잘 끝나면 onResponse 콜백 메서드가 호출되면서 응답값이 response 파라미터를 통해 들어오게 될 것이다.
API 호출이 정상적으로 끝나지 않는다면 onFailure 콜백 메서드가 호출되면서 응답 실패의 원인이 에러 객체로 파라미터를 통해 들어오게 된다.
이대로 앱을 빌드하고 실행하면 앱 크래시가 나버린다.
안드로이드에게 명시적으로 이를 알려줘야한다.
AndroidManifest.xml 파일을 열어 다음 줄을 추가해준다.
<uses-permission *android:name*="android.permission.INTERNET" />