본문 바로가기
공부하는 하스씨/안드로이드

[펌] Retrofit - 쉽고 빠른 Android HTTP REST 인터페이스 라이브러리

by 박하스. 2015. 9. 11.
728x90
반응형

원글 링크 - http://m.blog.daum.net/creazier/15310035#




Retrofit은 Square에서 만든 쉽고 간단한 HTTP REST 인터페이스입니다.
Android에서 HTTP 요청을 하려면 복잡한 과정을 거쳐야 할 뿐만 아니라 URL을 문자열로 지정하여 요청하기 때문에 지속적인 관리를 하기 어렵기 때문에 처음 Android 어플리케이션을 만드는 사람들에게 불편하게 느껴집니다.

 

Sqaure Retrofit은 Android HTTP 요청을 라이브러리화 하여 사용자가 메소드 호출을 통해 HTTP 요청을 수행할 수 있게 해줍니다. 다음은 구글 Places에 Retrofit을 사용하여 POI 정보를 받아온 예제입니다.

 

public interface GooglePlacesService {

 

    public static final String ROOT = "https://maps.googleapis.com";

   

    public static final String POI_SEARCH_QUERY =

        "/maps/api/place/textsearch/json?" +

        "language=ko&sensor=true&key=YOUR_KEY";

 

    @GET(POI_SEARCH_QUERY)

    Object textSearch(@Query("query") String query);

   

    @GET(POI_SEARCH_QUERY)

    void textSearchAsync(

        @Query("query") String query,

        Callback<Object> callback

    );

 

Retrofit은 요청하려는 대상의 정보를 담은 자바 interface를 선언하여 HTTP 요청 정보를 메소드로
선언합니다. 위와 같이 만든 interface는 구글 Places를 사용하여 POI 검색을 수행하는 GET요청을 만듭니다.

 

첫번째 메소드 textSearch는 POI검색을 동기화 통신으로 수행합니다. 동기화 통신이기 때문에

위 메소드를 수행하면 HTTP 응답이 올 때까지 어플리케이션이 동작을 멈춥니다.

Android는 HTTP 요청으로 인한 어플리케이션 중지를 피하기 위해 AsyncTask를 사용할 것을

권장/강제 합니다.

 

두번째 메소드 textSearchAsync는 비동기 통신으로 POI검색을 수행합니다.

Callback<Object> callback은 비동기 통신이 종료된 후 실행 될 콜백 함수를 담은 리스너 객체입니다.

 

다음 코드를 수행하여 Retrofit을 사용한 HTTP 요청을 만들어보겠습니다.

 

public class SomeActivity extends Activity {

    ...

   

    private GooglePlacesService mService;

 

    public void foo()

    {

        /* RestAdapter는 특정된 HOST에 대한 RESTful 서비스를 준비합니다 */

        RestAdapter restAdapter = new RestAdapter.Builder()

                .setServer(GooglePlacesAPI.ROOT)

                .build();

 

        /* 미리 구현한 interface를 Retrofit 어댑터로 객체화 합니다 */

        mService = restAdapter

                .create(GooglePlacesAPI.class);

 

        /* 검색 쿼리를 만들어 POI 검색을 수행합니다 */

        String query = "query to execute";

        new poiTask().doSearch(query);

    }

 

    /* Blocking HTTP 요청을 실행하기 위한 AsyncTask 클래스를 구현합니다 */

    private class SearchTask extends AsyncTask<String, Void, Object>

    {

        @Override

        protected Object doInBackground(String ... params) {

            Object ret = mService.textSearch(params[0]);

            return ret;

        }

 

        @Override

        protected void onPostExecute(Object result) {   

            /* do something with your result */

        }
    }

}

 

위와 같은 동기화 메소드의 경우 AsyncTask를 상속한 클래스를 만들어 HTTP 요청에 대한 응답을
처리하게 합니다. 이렇게 만든 AsyncTask 객체는 여러 클래스에서 손쉽게 불러와 호출할 수 있으며
코드 재사용이
상대적으로 쉬워 같은 요청에 대하여 동일한 후처리를 하는 API에 적합합니다.

다음은 비동기 메소드를 호출하여 HTTP 요청을 수행하는 예제입니다.

 

 public class SomeActivity extends Activity {
    ...

    private GooglePlacesService mService;

    public void foo() {

        /* RestAdapter는 특정된 HOST에 대한 RESTful 서비스를 준비합니다 */
        RestAdapter restAdapter =
            new RestAdapter.Builder()
                .setServer(GooglePlacesAPI.ROOT)
                .build();

        /* 미리 구현한 interface를 Retrofit 어댑터로 객체화 합니다 */
        mService = restAdapter
            .create(GooglePlacesAPI.class);

        /* 검색 쿼리를 만들어 POI 검색을 수행합니다 */
        String query = "query to execute"; 
        mService.textSearchAsync(query, new Callback<Object>() {

            @Override
            public void success(Object ret, Response resp) {
                /* do something you want with result */
            }  

            @Override
            public void failure(RetrofitError error) {
                /* Error! */
            }  
        });
    }
}

 

비동기 메소드의 경우 HTTP 요청을 만든 클래스에서 함수를 직접 실행하기 때문에 요청을 만든 상황과

조건에 따라 다른 후처리를 할 수 있다는 점에서 유용합니다. 물론

AsyncTask를 사용하여 코드 재사용을 할 수 있는 것처럼 Callback 리스너를 별도의 클래스로 구현하여 
필요할 때마다 호출할 수 있습니다.
그리고 일반적인 웹 어플리케이션을 만들 때도 좋고, 안드로이드 어플리케이션에서도 사용 가능합니다.
 
 

 

 

[기존 AsyncTask를 사용할 경우와 Volley 그리고 Retrofit 라이브러리 성능 측정 결과]

 출처 : http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit/

 

Retrofit 라이브러리는 예전부터 즐겨 사용되어왔던 라이브러리로 자세한 장단점은

http://blog.daum.net/creazier/15309920 에 두번째 포스트를 참조하세요.


728x90
반응형