ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Retrofit 사용하기
    프로그래밍/Android 2018. 2. 19. 16:54

    이번에 포스팅에서는 Retrofit 이라는 라이브러리의 사용법에 대해 써보려 합니다.

    Retrofit은 Square에서 제공하고 있는 Http 통신을 위한 라이브러리 입니다.


    그럼 바로 시작하겠습니다.




    Retrofit?

    Retrofit은 REST API로, 서버와 클라이언트간 Http 통신을 위한 인터페이스를 뜻합니다.

    (여기서는 REST에  대한 자세한 내용은 생략하도록 하겠습니다.)

    쉽게 말해, 클라이언트에서 서버로 어떠한 요청을 보내면 서버는 그 요청에 대한 응답을 클라이언트로 보내주게 되는데, 이 일련의 과정들을 쉽게 사용 할 수 있도록 도와주는 역할을 하는 것이 바로 Retrofit 입니다.



    Gradle에 라이브러리 추가하기

    Retrofit을 사용하기 위해서 먼저, 라이브러리를 Gradle에 추가하도록 하겠습니다.


    build.gradle (Module: app)



    dependencies {

       compile 'com.squareup.retrofit2:retrofit:2.4.0

       compile 'com.squareup.retrofit2:converter-gson:2.4.0' (optional)

    }


    저는 통신 결과를 Gson 형태로 변환하기 위해 컨버터를 추가하였지만, 필요에 따라 추가하시지 안하셔도 됩니다.


    Retrofit의 최신 버전은 아래의 공식사이트에서 확인 하실 수 있습니다.

    버전 이외에도 사용법 등 자세한 설명이 되어있으므로, 한번 읽어보시길 추천드립니다.




    인터넷 사용 권한 추가하기

    통신을 위해서는 인터넷 사용 권한이 필요하겠죠? 추가합시다.


    manifests.xml



    <?xml version="1.0" encoding="utf-8"?>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="rebuild.com.retrofit">


        <!-- 인터넷 사용 권한 -->

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


    </manifest>


    이제 Retrofit 사용을 위한 준비는 끝났습니다.

    이어서, 간단한 예제를 통해 사용법을 알아보겠습니다.



    통신 데이터 준비하기

    예제에서는 미리 만들어둔 서버에 Http 요청을 보내, 영화 리스트 데이터에 대한 응답을 받아와 사용해보도록 하겠습니다.

    (예제에 사용되는 URL 및 응답 데이터는 가상입니다.)


    # 요청 Resource URL 

       - http://re-build.tistory.com/movie.json



    # 영화 리스트 데이터

    {

       "category" : "최신",

       "list: : [

          {

           "movie_no" : 0,

           "title" : "탐정",

           "thumb_url" : "https://movie.naver.com/movie/bi/mi/basic.nhn?code=159892#"

          },

          {

           "movie_no" : 1,

           "title" : "쥬라기월드:폴른킹덤",

           "thumb_url" : "https://movie.naver.com/movie/bi/mi/basic.nhn?code=154285#"

          },

          {

           "movie_no" : 2,

           "title" : "독전",

           "thumb_url" : "https://movie.naver.com/movie/bi/mi/basic.nhn?code=158178#"

          },

          {

           "movie_no" : 3,

           "title" : "미드나잇 선",

           "thumb_url" : "https://movie.naver.com/movie/bi/mi/basic.nhn?code=143416#"

          },


          .... 중략


       ]

    }



    우선 관리가 용이하도록 하기 위해 Base URL을 strings.xml에 등록해두도록 하겠습니다.


    strings.xml



    <resources>

       <string name="baseUrl">http://re-build.tistory.com</string>

    </resources>



    Retrofit 객체 초기화하기

    먼저, Retrofit 객체를 초기화 하겠습니다.


    MainActivity.java


    import retrofit2.Retrofit;


    public class MainActivity extends AppCompatActivity {

       private Retrofit mRetrofit;


       @Override

       protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

          

    setRetrofitInit();

       }


       privatate void setRetrofitInit() {

          mRetrofit = new Retrofit.Builder()

                     .baseUrl(<Base URL>)

                     .addConverterFactory(GsonConverterFactory.create())

                     .build();

       } 

    }


    위와 같이, 아까 strings.xml에 등록해두었던 Base URL을 이용하셔서 작성하시면 됩니다. 저는 json 형태의 데이터를 변환하기 위해 ConverterFactory를 추가하였습니다. 사용하시는 상황에 맞게 작성하시면 되겠습니다.



    인터페이스 정의하기

    Http Method(GET, POST, PUT, DELETE 등)와 자원의 정보를 정의 할 인터페이스를 구현해보겠습니다.


    RetrofitAPI.java



    public interface RetrofitAPI {

       @GET("/movie.json")

       Call<String> getMovieList();

    }


    예제에서는 Http Method만을 정의하였으나, 필요에 따라 변수들을 포함하여 정의 하시면 됩니다.

    자세한 사용법은 공식사이트에 잘 설명되어있으니, 설명은 생략하도록 하겠습니다.



    통신 요청 및 응답 콜백 구현하기

    다시 MainActivity로 돌아와 Retrofit 객체와 인터페이스를 연결하고, 영화 리스트 데이터를 요청해보겠습니다.


    MainActivity.java



    public class MainActivity extends AppCompatActivity {

       private Retrofit mRetrofit;

       private RetrofitAPI mRetrofitAPI;

       private Call<String> mCallMovieList;


       @Override

       protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

          

    setRetrofitInit();

    callMovieList();

       }


       privatate void setRetrofitInit() {

          mRetrofit = new Retrofit.Builder()

                     .baseUrl(<Base URL>)

                     .addConverterFactory(GsonConverterFactory.create())

                     .build();


          mRetrofitAPI = mRetrofit.create(RetrofitAPI.class);

       }


       privatate void callMovieList() {

          mCallMoviewList = mRetrofitAPI.getMoviewList();

          mCallMoviewList.enqueue(mRetrofitCallback);

       }


       private Callback<String> mRetrofitCallback = new Callback<String>() {

         

          @Override

          public void onResponse(Call<String> call, Response<String> response) {

             String result = response.body();

             Log.d(TAG, result)

          }


          @Override

          public void onFailure(Call<String> call, Throwable t) {

             t.printStackTrace();

          }

       }

    }


    생성해두었던 인터페이스를 통해, Http 요청을 보내고 응답을 받을 Callback을 지정하였습니다. 이제 통신이 정상적으로 성공할 경우 onResponse()로, 통신에 실패 한 경우에는 onFailure()로 들어오게 됩니다.

    예제에서는 Callback 타입을 String으로 하였지만, 입맛에 맞게 바꾸셔도 됩니다. 물론 인터페이스에 정의된 Call의 타입도 바꾸셔야 합니다.



    데이터 파싱하기

    이제 받아온 String 타입의 데이터를 사용하기 쉽도록 바꾸어 보도록 하겠습니다.

    우선, 응답 받을 json 데이터에 맞추어 VO(Value Object)를 작성하겠습니다.


    MovieListVO.java



    public class MovieListVO {

       private String category;

       private ArrayList<Movie> list;


       public String getCategory() {

          return category;

       }


       public void setCategory(String category) {

          this.category = category;

       }


       public ArrayList<Movie> getList() {

          return list;

       }


       public void setList(ArrayList<Movie> list) {

          this.list = list;

       }


       public class Movie {

          private String movie_no;

          private String title;

          private String thumb_url;


          public String getMovie_no() {

             return movie_no;

          }


          public void setMovie_no(String movie_no) {

             this.movie_no = movie_no;

          }


          public String getTitle() {

             return title;

          }


          public void setTitle(String title) {

             this.title = title;

          }


          public String getThumb_url() {

             return thumb_url;

          }


          public void setThumb_url(String thumb_url) {

             this.thumb_url = thumb_url;

          }

       }

    }


    작성하실 때, 중요한 점은 응답 받을 데이터 구조와 같은 구조이어야 하며 변수 명도 같아야 합니다.


    그럼 아까 응답 받은 데이터에 적용 시키면, 다음과 같습니다.


    MainActivity.java



    public class MainActivity extends AppCompatActivity {

       private Gson mGson;


       private Callback<String> mRetrofitCallback = new Callback<String>() {

         

          @Override

          public void onResponse(Call<String> call, Response<String> response) {

             String result = response.body();

             MovieListVO mMovieListVO = (MovieListVO) mGson.fromJson(result, MovieListVO.class)

          }


          @Override

          public void onFailure(Call<String> call, Throwable t) {

             t.printStackTrace();

          }

       }

    }


    Gson 객체를 초기화 시킨 후, fromJson()을 통해 변환해주시면 됩니다. 이후에는, 원하시는 모양으로 데이터를 가져다가 사용하시면 됩니다.





    간단하게 사용법을 알아보았는데요, 쓰다보니 글이 두서없이 정신없는 것 같네요...ㅠ

    사실 사용법 자체는 굉장히 간단해서 제가 설명 할게 없기도 합니다. 몇 번 해보시면 아주 쉽게 사용할 수 있도록 잘 만들어져 있습니다.


    이번 포스팅은 여기서 마치겠습니다. 다음에는 좀 더 좋은 내용으로 찾아뵙겠습니다.






Designed by Tistory.