Retrofit / OkHttp

HTTP 통신 라이브러리

Retrofit / OkHttp

Retrofit / OkHttp


Square 사에서 만든 HTTP 통신 라이브러리이다.

Retrofit 을 사용하면 어노테이션(Annotation) 사용으로 코드의 가독성이 좋고 직관적인 설계가 가능하다.

하지만 RetrofitHTTP 통신을 할 때 OkHttp 에 의존하고 있으며, 네트워크 Interceptor 를 통해 API 가 통신되는 모든 활동을 모니터링 할 수 있고, 서버와의 통신 시간을 조절할 수 있다는 장점이 있다.

이처럼 두 라이브러리 모두 각각 이점을 가지고 있기 때문에 최고의 성능을 내기 위해서 함께 사용하는 것이 보편적이다.


Request


RetrofitbaseUrl() 에 인자를 전달해서 객체를 생성하고, 네트워크 호출을 할 때마다 미리 정의해놓은 인터페이스 메소드에 필요한 데이터들을 전달해서 호출하는 형식으로 구성된다.

Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl(URL)
    .build()
  • JSON 은 안드로이드 개발 환경에서 바로 사용 가능한 데이터 형식이 아니기 때문에 데이터 클래스로 변환해줄 컨버터를 사용해야 하는데, GsonConverterFactory 를 사용하면 별도의 변환 과정 없이 바로 사용할 수 있다.

인터페이스를 생성하고 원하는 요청 방식과 파라미터에 대해 정의한 후, 인터페이스 메소드에 필요한 데이터를 전달해서 호출할 수 있다.

interface ApiServe{
    /*  
        HTTP Methods
        @GET - 조회
        @POST - 등록
        @PUT - 갱신
        @PATCH - 수정
        @DELETE - 삭제
    */
    @GET(END_POINT)
    fun ApiCall(
        @Query(PARAM_ACTION) action: String,
    ): Call<Model>
}


OkHttp 는 수동으로 요청을 구성해야 하며, 그렇기에 코드 가독성이 좋지 않다.

val request = Request.Builder()
        .url("$URL$PATH/?$PARAM_ACTION=$VALUE_QUERY")
        .build()



Response


JSON 은 안드로이드 개발 환경에서 바로 사용 가능한 데이터 형식이 아니기 때문에 데이터 클래스로 변환해줄 컨버터를 사용하거나 직접 변환해서 사용해야 한다.

Retrofit 은 객체 생성 시 GsonConverterFactory 를 연결했다면 응답 객체의 body 를 별도의 변환 과정 없이 바로 사용할 수 있다.

call?.enqueue(
    object: Callback<Model> {
        override fun onFailure(call: Call<Model>, t: Throwable) {
            /* ... */
        }
    
        override fun onResponse(
            call: Call<Model>, 
    	    response: Response<Model>
        ) {
            response.body()?.let { /* ... */ }
        }
    }
)


OkHttp 에서는 반환 받은 JSON 객체를 데이터 클래스로 바로 변환해주지 못하기 때문에 별도의 과정을 통해 직접 변환해서 사용해야 한다.

대표적으로 자바 ObjectJSON 으로 변환해주거나, 반대로 JSON 을 자바 Object 로 변환해주는 GSON 라이브러리를 사용하는 방법이 있다.

client.newCall(request).enqueue(
    okhttp3.Callback {
        override fun onFailure(call: okhttp3.Call, e: IOException) {
            /* ... */
        }

        override fun onResponse(
            call: okhttp3.Call, 
            response: okhttp3.Response
        ) {
            response.body()?.let { 
                val result = Gson().fromJson(it.string(), Model::class.java)
                /* ... */
            }
        }
    }
)
essential