Retrofit

Cloud0·2021년 11월 25일
0
post-thumbnail

Retrofit?

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

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

Retrofit은 TypeSafe한 HttpClient라이브러리 이다.

  • Retrofit2는 Square사에서 만든 http통신을 간편하게 만들어주는 라이브러리 입니다.
  • 구글 샘플에서도 네트워크 통신에 대한 예제를 보여줄 때는 retrofit2를 이용하는 것을 보면 비공식적으로 인정했다고 생각합니다.

HttpClientLibrary 사용이유

  1. Http개발의 어려움

    보통 Http를 개발한다면, 아래의 것들을 고려해야 한다.

    • 연결
    • 캐싱
    • 실패한 요청의 재시도
    • 스레딩
    • 응답 분석
    • 오류 처리
  2. HttpURLConnection

    HttpURLConnection은 가장 원시적인 방법의 HttpClient이다.
    
    장점
    
    
    * Java.net에 포함된 클래스로 별도의 라이브러리 추가가 필요없다.
    * 자신이 원하는 방식으로 커스텀하여 사용할 수 있다.(단점이기도 하다.)
    단점
    
    * 자유도가 높은 대신, 직접 구현해야하는 것들이 많다.

    Retrofit 은 안드로이드 앱에서 필요한 데이터를 서버로부터 가져오고 서버에 데이터를 전송하기 위한 코드를 작성할 때 사용하는 라이브러리이다.

즉, 개발자가 서버와 통신하기 위한 코드를 작성하기 쉽게 라이브러리로 만들어 놓았기 때문에 사용

Retrofit 사용

Retrofit 을 사용하기 위해서는 다음의 세 가지 클래스가 필요

  • JSON 형태의 모델 클래스 (kotlin 에서는 data class 를 사용)
  • HTTP 작업을 정의하는(onSuccess/onFail) 인터페이스
  • Retrofit.Builder를 선언한 클래스 (baseUrl과 Converter등을 선언한다. Interceptor를 추가하여 응답을 가공할수도 있다.)
  1. 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)
  }
  1. 인터넷 사용 권한 추가

    통신을 위해서는 인터넷 사용 권한이 필요

    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>
  1. 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();
   } 
}
  1. 인터페이스 정의

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

RetrofitAPI.java

public interface RetrofitAPI {
   @GET("/movie.json")
   Call<String> getMovieList();
}

//Http Method만을 정의하였으나, 필요에 따라 변수들을 포함하여 정의 하면 됨
  1. 통신 요청 및 응답 콜백 구현

    다시 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()로 들어오게 된다.

  1. 데이터 파싱

    이제 받아온 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()을 통해 변환해주시면 된다.
//  이후에는, 원하시는 모양으로 데이터를 가져다가 사용
profile
이...사...중......

0개의 댓글