Android/Architecture

안드로이드 MVVM 패턴 익히기 (2.5) Coroutine

Seoplee 2020. 12. 29. 17:35

Retrofit2 + Coroutine에 대한 기록

 

비동기처리를 할 때 주로 Rxjava2를 사용하지만, 코틀린에서는 Coroutine 이라는 것을 이용할 수 있다.

특히 서버통신에서 Rxjava대신 Coroutine을 사용하면 낮은 학습곡선 및 보일러 플레이트 코드를 상당히 줄일 수 있다는 장점이 있다.

 

@GET("search/repositories")
suspend fun searchRepo(@Query("q") query: String): RepoSearchResponse

기존의 retrofit2만을 사용하던 때와 달리 suspend 수식어를 사용하고, Call<T> 대신 data class type으로 리턴한다.

 

viewModelScope.launch {
    val searchRepoInfo = service.searchRepo(query)
    searchArray.value = searchRepoInfo.items
    totalCount.value = searchRepoInfo.total_count
}

api 호출은 viewModelScope를 이용하여 호출한다. 실제로는 비동기 처리 코드지만 마치 동기 코드처럼 짤 수 있다.

service.searchRepo(query).enqueue(object : Callback<RepoSearchResponse?> {
    override fun onResponse(
            call: Call<RepoSearchResponse?>,
            response: Response<RepoSearchResponse?>
    ) {
        if (response.isSuccessful) {
            val result = response.body()!!
            searchArray.value = result.items
            totalCount.value = result.total_count

        } else { //통신에러

        }

    }

    override fun onFailure(call: Call<RepoSearchResponse?>?, t: Throwable) {
        //통신에러
    }
})

기존에는 이런식으로 콜백을 받는 형태의 코드를 작성해야했다.

 

위 기능은 retrofit2 2.6.0 이상의 버전에서만 동작한다. 

 

+) Coroutine에 대한 추가기록

코루틴 없이 retorfit2을 사용할 때 responsedata가 필요없으면 Call<Void> 의 형태로 사용했지만,

코루틴을 사용할 땐 Response<Unit> 의 형태로 사용해야한다.