개발/Android

[안드로이드] OkHttp vs Retrofit vs Volley

Eun 2021. 8. 13. 14:41

개발을 하다가 HTTP 통신을 위해서 Volley을 앞서 사용했는데,

Volley말고 Retrofit이 더 많이 사용한다고 하여 정리를 해보았다.

 

도대체 왜 Retrofit이 더 대중적이고 많이 사용하는가?

 

그럼 차근차근 공부해보자.

 

OkHttp, Retrofit, Volley의 등장

그러면 Retrofit과 Volley는 도대체 왜 나타난 것이며 무엇을 하는 애들인지부터 살펴보자.

 

초기에 안드로이드에서 통신은 HTTPClient를 사용하는 것이었다.

통신을 하기위해서 HttpURLConnection이 권장되었고 이러한이 HttpsURLConnection을 NetworkManager class에 넣고 AsyncTask로 접근하는 방식을 사용했었다고 한다. 이것은 Java.net에 내장되어 있기때문에 별도의 라이브러리 없이 사용가능하다.

하지만 이 방법은 HttpUrlConnection을 이용하여 연결하고, Buffer를 통한 입출력을 하고 예외처리, 재시도 등등... 개발자가 구현해야 할일이 너무 많아 실수할 가능성이 컸다.

 

이러한 실수를 줄이고자 OkHttp, Retrofit, Volley가 등장하게 되었다!! 

Retrofit을 살펴보기전에 OkHttp부터 알고 시작해야한다.

 

OkHttp3

OKHttp는 REST API, HTTP 프로토콜 통신을 위한 다양한 기능을 제공하는 라이브러리이다.

그리고 OkHttp 위에서 Retrofit이 동작한다.

이말은 OKHTTP의 베이스로 Retrofit이 만들어졌다는 얘기이다.

 

Retrofit

  • Retrofit은 HTTP REST API 구현을 위한 라이브러리이다.
  • 간단하게 GET, POST, PUT, DELETE 등을 전달하면 서버에서 처리 후, XML, JSON으로 응답을 제공받을 수 있다. 
  • 대표적으로 RDBMS에서 요청이 오면 CRUD 기능 요청을 할 수 있게 제공한다.
  • Retrofit은 type-safe한 HTTP 클라이언트 라이브러리이다. 

여기서 type-safe란 무엇인가?

어떠한 연산/오퍼레이션도 정의되지 않은 결과를 내놓지 않는 것. 즉, 예측가능한 결과만 내는 것을 말한다.

 

이건 또 무슨 말..? 더 찾아보니

타입에 불안정이다라고 하는 것은 타입을 판별하지 못해 RunTime시 타입으로 인한 문제가 발생하는 것이고,

타입에 안정하다라고 하는 것은 타입을 판별할 수 있어 RunTime시가 아닌 컴파일시 문제를 잡을 수 있는 것이다.

 

예를 들어서 1+"1" 의 연산은 비 논리적이다. 이와같이 연산이나 조작에 있어서 논리적이지 않은 것을 체크하여 RunTime시 오류가 발생하지 않게 하는 것이 type-safe하다고 한다.

 

Retrofit에는 4가지 기능이 있다. 

  • 네트워크 통신 연결/해제에 대해 체계적인 관리
  • 각종 에러처리를 원활하고 쉽게 함
  • 데이터를 가져와 각종 파싱 라이브러리를 통해 원하는 요구에 맞게 사용 가능
  • 서버로 연결된 후 요청을 데이터 포맷에 맞춰 요청하고, 데이터를 파싱하여 응답을 받을 수 있음

그리고 아까 Retrofit은 OkHttp위에서 동작한다고 하였다.

그 내부 코드를 살펴보면서 어떻게 동작하는지 알아보자.

APIClient.java(왼), Retrofit.java(오)

APIClient.java의 build 메소드를 잘보면 OkHttpClient로 연결하는 것을 볼 수 있다..

 

Volley

Volley는 구글 IO 2013에서 공개한 Android 앱의 네트워킹을 더 쉽고 더 빠르게 만드는 HTTP 통신 라이브러리이다. 

 

안드로이드 개발 초기 당시에는 HTTPClient를 사용하여 통신을 했지만 신경쓸 것이 많다는 이유로 사용되지 않았다. 하지만 Volley가 이러한 HTTPClient에 의존하는 라이브러리라고 한다.

따라서 Square에서 만들어진 라이브러리인 OkHttp와 Retrofit을 권장하고 개발자들이 많이 쓰는 라이브러리가 되었다.

 

다음과 같은 기능을 제공한다.

  • 네트워크 요청의 자동 스케줄링
  • 동시 네트워크 연결
  • 요청 우선순위 지원
  • 디버깅 및 추적 도구
  • JSON, XML, Image 등 다양한 Response 형식을 처리하도록 확장 가능

 

Retrofit를 쓰는 이유

1. 속도차이

Retrofit이 속도가 빠른 것을 아래의 그림으로 확인할 수 있다.

왜 Retrofit이 속도가 더 빠를까?

 

OkHttp는 Asynctask를 통해서 비동기로 실행되는데 Asyntask는 성능상 느리다.

Retrofit에서는 Asynctask를 사용하지 않고 자체적인 비동기 실행과  스레드 관리를 통해 속도가 빠르다.

 

2. 가독성

Retrofit은 Interface 내에 annotation을 사용하여 호출할 함수를 파라미터와 함께 정의해놓고, 네트워크 통신이 필요한 순간에 구현없이 해당 함수를 호출하기만 된다. annotation으로 HTTP 메소드를 정의하기때문에 행위를 한눈에 알아보기 쉬워서 가독성이 높다.

public interface ApiInterface {

    @GET("/app/setVote")
    Call<Vote> getVote(@Query("placeid") String placeid, @Query("candidateid") String candidateid,@Query("UserNumber") String UserNumber );
    
    @FormUrlEncoded
    @PUT("/app/put/{id}")
    Call<PlaceInfo> putFunc(@Path("id") String id, @Field("data") String data);

    @DELETE("/app/delete/{id}")
    Call<PlaceInfo> deleteFunc(@Path("id") String id);
}

 

반면에 Volley는 요청에 우선순위를 부여하는 등 추가적인 기능이 더 있지만 간편하고 REST API에 적합한 라이브러리는 Retrofit이라고 한다. 


나는 간단하게 졸업 프로젝트만을 하고 있는 학부생 입장으로는 Retrofit이 더 적합한 것 같다. Volley만을 알고 Volley만 쓰고 있다가

Retrofit의 존재를 알게 되고 쓴 결과 Retrofit이 에러처리하고 오류를 파악하기에 좋고 가독성이 더 좋다고 판단했다.

 

 


참고

[Volley와 Retrofit]

[Android retrofit]

[Retrofit과 Volley에 대하여]

[OkHttp vs Retrofit]