Retrofit + Rxjava 사용하기

안석주·2021년 11월 21일
0

서론

이전에 Retrofit 공식 문서 읽기에서 Retrofit의 기본 사항에 대해서 알아봤었습니다!
이번 포스트에서는 안드로이드에서 Retrofit을 사용할 때 Rxjava와 어떻게 함께 사용하는지, Github Repository API를 사용해 예제를 통해 알아보겠습니다.

순서

먼저 Retrofit을 이용해 API 서버로부터 데이터를 요청하기 위해서는 다음과 같은 순서로 진행해야 합니다.

0. 당연하지만, Internet Permission 추가해줍니다!

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="비밀">

    <uses-permission android:name="android.permission.INTERNET" />

1. 라이브러리를 추가해줍니다.

dependencies {
    // Rx
    implementation 'io.reactivex.rxjava3:rxkotlin:3.0.0'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

여기서는 Rx와 같이 이용할 것이기 때문에, Rx도 같이 implemetation 해줍니다.
또한 최신 버전 확인은 Maven Repository에서 검색한 뒤 찾으면 최신 버전을 확인할 수 있습니다!

2. DTO 작성

Data Transfer Object는 안드로이드 스튜디오에서 Plugin 설치를 통해 쉽게 변환할 수 있습니다!
Kotlin data class from JSON에 잘 설명되어 있습니다.
공식 API Document를 이용해 Response DTO를 만듭니다!

위와 같이 Document의 Response를 복사하여 붙여넣어준 뒤, Class Name을 입력해주면 자동으로
Data class를 생성해줍니다.

3. 데이터를 요청 할 API 명세서(인터페이스) 작성

Retrofit에서 RESTful 통신을 위해 가장 먼저 API 명세서를 작성합니다.
이 때 공식 API document를 보고, BASE_URL을 파악해야 합니다! 그리고 GET/POST 등 필요한 방식을 정합니다.
그리고 나서 인터페이스 안에 함수를 작성합니다. 여기 예제에서는 사용자의 Github Repository를 얻어오는 GET 함수를 만들어 보겠습니다!

유저의 Repository를 얻어 오려면, GET에 위와 같이 작성해주어야 하고, username이 필요하네요! 토큰 또한 필요하니 토큰 생성 법은 이곳을 참고해주세요!

@GET("/users/{username}/repos")
fun getRepository(@Header("Authorization") token: String,
                      @Path("username") username: String): Single<GithubResponse>

여기서 RxJava를 이용합니다! RxJava를 이용하면 기존에 Call<GithubResponse>만 가능했던 코드를, Observable, Flowable, Single, Maybe, Completable을 이용할 수 있게 됩니다.

값을 받아오는 GET의 경우 보통 Single을 이용하고, POST,DELETE,PUT의 경우 Completable을 이용합니다! (반드시는 아니지만 보통의 경우 그렇습니다!)

이제 인터페이스도 정의했으니 다음 단계로 넘어가겠습니다!

4. Retrofit 객체 생성

Retrofit 객체는 객체가 여러개일 필요가 없고, 어디서든 참조가 가능해야하기 때문에 object로 한번 생성하여 계속해서 사용할 수 있도록 합니다!

object NetworkManager {
    private val retrofit =
        Retrofit.Builder()
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("https://api.github.com/")
            .build()
    val githubApi = retrofit.create<GithubApi>()
}

다음과 같이 작성하면 외부에서 NetworkManager.githubApi.으로 시작하여 Retrofit을 이용할 수 있습니다!
RxJava를 사용하기 위해서 반드시 CallAdapterFactory에 RxJava3CallAdapterFactory를 create 해줘야합니다.
그리고, Retrofit은 Http body로 들어오는 OkHttp's의 ResponseBody 형식만 역직렬화 할 수 있습니다. 그래서 ConverterFactory를 통해 JSON 타입의 응답결과를 객체로 매핑해줍니다!

마지막으로 세팅해둔 retrofit 객체를 create로 생성합니다! (여기서 retrofit에 내장되어 있는 create를 사용합시다!)

이를 통해 Retrofit의 세팅은 모두 끝났습니다! 이제 사용하기만 하면 됩니다!

5. 사용하기

private fun getRepository(userName: String) {
        NetworkManager.githubApi
            .getRepository(GITHUB_TOKEN, userName)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ it ->
                Log.d(TAG, "getRepository Success: ${it.onEach { println(it) }}")
            }, {
                Log.d(TAG, "getRepository Error: ${it.message}")
            })
            .addTo(compositeDisposable)

    }

subscribeOn에서 백그라운드 쓰레드를 이용해 작업도록 만들어주며, 변경은 메인 쓰레드에서 할 수 있도록 합니다. 통신 성공과 에러시에 작업을 분기해주고, compositeDisposable에 추가하여 마지막에 모두 구독을 취소해줄 수 있도록 합니다!

6. 결과

예상대로 Repository가 잘 넘어왔습니다! 혹시 잘 실행이 되지 않는다면 에러 코드를 통해 디버깅을 해보거나, Interceptor를 통해 에러 코드를 분기해줄 수도 있습니다!

ex) 401 Unauthorized Error = 권한 오류 등...

정리

요새는 Coroutine을 이용하여 Retrofit을 이용하는 경우가 많지만, 아직도 기존 코드에 있는 RxJava를 이해해야하거나, RxJava를 사용할 때 필요하다고 생각돼 정리해봤습니다!
도움이 되셨으면 좋겠고, 저도 정리하며 정리가 됐습니다. 시간이 된다면 POST나 DELETE도 해보는 것도 도움이 될 것 같네요!!

profile
뜻을 알고 코딩하기

0개의 댓글