본문 바로가기

안드로이드/안드로이드 개인공부

[안드로이드 개인공부] Retrofit에 RxJava적용해보기

Retrofit에 대해서 궁금한 부분은 https://zzandoli.tistory.com/2 를 참고하면된다.

 

기존 Retrofit을 사용할 경우 아래와 같이 인터페이스 서비스를 만들고

interface GitHubService {
@GET("/users/{user}/repos")
fun listRepos(@Path("user") user:String): Call<Repo>}

해당서비스를 create해준다.

val service:GitHubService = Retrofit.Builder()
.baseUrl("https://api.github.com")
.build()
.create(GitHubService::class.java);

그리고 네트워킹을 하고자 하는 위치에 아래처럼 구현하여, Call객체를 통해 비동기적으로 네트워킹을 수행할 수 있다.

val repos: Call<Repo> = service.listRepos("USER")

repos.enqueue(new Callback<Repo>() {
@Override
public void onResponse(Response<List<Contributor>> response, Retrofit retrofit) {
// handle success
}

@Override
public void onFailure(Throwable t) {
// handle failure
}
});

 

여기서 RxJava를 사용하게 된다면

먼저 Gradle을 추가한다.

// rxjava
implementation "io.reactivex.rxjava2:rxjava:2.2.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.2"
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

그 다음 인터페이스 서비스 부분에서 Call을  Single로 바꾼다.

interface GitHubService {
@GET("/users/{user}/repos")
fun listRepos(@Path("user") user:String): Single<Repo> }

해당서비스를 기존과 같에 create한다.

val service:GitHubService = Retrofit.Builder()
.baseUrl("https://api.github.com")
.build()
.create(GitHubService::class.java);

그리고 이 해당 서비스를 가지고 사용하려고 하는데, 위와 많이 달라졌다.

service.listRepos("USER")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// handle success
}, {
// handle fail
}))

 

코드를 설명하기 전에.. 먼저 RxJava에 대해서 간단하게 알아보자

RxJava는 간단히 말해서 '발행''구독'이다.

 

1. 누군가는  데이터를 흘려보내고, 2. 누군가는 데이터를 줍는다.

1번을 발행이라고 하고, 2번을 구독이라고 한다.

 

위와 같은 네트워킹에서는

레트로핏 서비스는 Single을 통해 Repo라는 데이터를 발행하고

그 데이터를 처리하고 싶은 곳에서 구독해야한다.

 

그것을 위한 코드가 subscribeOn, observeOn, subscribe이다.

 

<subscribeOn이란?>

데이터를 강에 흘려보내는 스레드(스케줄러)를 지정하는 작업이다.

정확하게는 데이터를 발행(연산)하는 스케줄러를 지정하는 것이라고 할 수 있다.

지금 네트워킹 작업은 io작업이니까 Schedulers.io()로 설정해주었다.

io 스케줄러 말고도, 메인 스케줄러, 뉴 스케줄러등이 있다.

 

<observeOn이란?>

그후에 observeOn으로 데이터를 줍는 스레드(스케줄러)를 지정한다.

즉, 데이터를 구독하는 스케줄러를 지정하는 것이다.

이건 AndroidSchedulers.mainThread()로 지정해 주었다.

이유는 안드로이드 UI작업을 해주기 위해서이다.

 

스케줄러에 관한 자세한 내용은 http://reactivex.io/documentation/ko/scheduler.html 여기를 참고하면 된다.

 

<subscribe이란?>

이제, 네트워킹을 통해서 데이터를 강에 뿌렸으니 주워야한다.

그런 부분이 subscribe이다.

 

위 코드에서는 람다 두개를 전달해주고 있다.

하나는 통신이 성공했을 때, 다른 하나는 통신이 실패했을 때 실행된다.

데이터는 it으로 얻어올 수 있다.

 

service.listRepos("USER")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
name_text_view = it.name
}, {
Log.d(TAG, "ERROR message : ${it.message}")
}))

예를 들어서 이렇게 할 수 있다.

 

그렇다면? Single은 어떤 역할을 하는 걸까?

 

<Single이란?>

데이터를 한번 뿌린다는 뜻이다.

REST API로 호출한 데이터는 서버로부터 딱 한번 받고 끝이기 때문에, Single을 이용하게 된다.

그외에도, Observable과 Subject등등이 있다. 그중, Publish Subject은 소켓 통신이나, 여러가지 상황에 사용하면 좋기에

알아두기 바란다.

 

마지막으로

컨버터를 추가해주기 위해 아래와 같이 작성한다.

retrofit:Retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://api.github.com")
.build()

두줄을 추가하므로써, RxJava와 Gson 사용이 가능해졌다.

Gson을 이용하면 서버로 부터 응답받은 json파일을 아무것도 하지 않고, data class로 바꿔서 사용이 가능하다.