RxJava와 가장 많은 조합으로 사용된다고 알고 있는 Retrofit 사용법을 정리해보고자 합니다.
RxJava 스타일대로 Retrofit을 사용할 수 있게 해주는 adapter 라이브러리가 RxJava3 버전으로 아직 나오지 않아서
이번 글은 RxJava2 + Retrofit의 조합으로 Android에서 REST API 통신을 하는 방법에 대해 작성하였습니다.
RxJava3 정리는 아래 링크에서 확인 가능합니다 :)
-> https://dev-eunji.tistory.com/19
역시 가장 빠르게 배우고, 써먹을 수 있는 방법은 직접 해보는 것이기 때문에
Fake REST API 사이트, https://jsonplaceholder.typicode.com 의 json 데이터의 도움을 받아서 테스트 코드를 구현했습니다.
토이프로젝트에서 간편하게 JSON 데이터 활용이 가능하기때문에, 활용해보시기를 추천드립니다.
STEP1. 종속성 추가
implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
STEP2. Model 생성 (DTO)
https://jsonplaceholder.typicode.com/todos 를 url 에 입력해보면, 아래와 같은 데이터가 반환됨을 확인할 수 있다.
[
// 동일한 구조의 200개의 뭉치
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
},
]
따라서, 아래와 같이 Model 클래스를 작성할 수 있다.
import com.google.gson.annotations.SerializedName
class Task(
@SerializedName("userId")
val userId: Long,
@SerializedName("id")
val id: String,
@SerializedName("title")
val title: String,
@SerializedName("completed")
val completed: Boolean
)
STEP3. Retrofit 구현
1. Api Manager
import com.google.gson.GsonBuilder
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
object ApiManager {
private val BASE_URL = "https://jsonplaceholder.typicode.com/"
private val gson =
GsonBuilder()
.setLenient()
.create()
private val retrofit by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.client(
OkHttpClient.Builder()
.build()
)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
val todoApi: TodoApi by lazy {
retrofit.create(TodoApi::class.java)
}
}
2. API 인터페이스 정의
import com.example.rx3retrofit.entity.Task
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.Path
interface TodoApi {
@GET("todos")
fun getTodos(): Single<List<Task>>
@GET("todos/{id}")
fun getTodo(
@Path("id") id: Long
): Single<Task>
}
3. repository 레벨 구현
import com.example.rx3retrofit.entity.Task
import io.reactivex.Single
import io.reactivex.schedulers.Schedulers
class TodoRepository {
private val api = ApiManager.todoApi
fun getTaskList(): Single<List<Task>> =
api.getTodos()
.subscribeOn(Schedulers.io())
fun getTask(id: Long): Single<Task> =
api.getTodo(id)
.subscribeOn(Schedulers.io())
}
STEP4. 로직 구현
1. ViewModel 정의
class TodoReposViewModel {
private val repository = TodoRepository()
fun getTaskListsObservable() =
repository.getTaskList().toObservable()
fun getTaskObservable(id: Long) =
repository.getTask(id).toObservable()
}
2. 화면 구현
fab.setOnClickListener { view ->
TodoReposViewModel().getTaskObservable(100).subscribe {
Snackbar.make(view, it.title, Snackbar.LENGTH_LONG).show()
}
}
참고
'Android' 카테고리의 다른 글
[Android] BottomSheet (0) | 2020.02.01 |
---|