Retrofit

똘이주인·2021년 8월 9일
0

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)
    }
  2. 인터넷 사용 권한 추가

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

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

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

    RetrofitAPI.java
    
    public interface RetrofitAPI {
       @GET("/movie.json")
       Call<String> getMovieList();
    }
    
    //Http Method만을 정의하였으나, 필요에 따라 변수들을 포함하여 정의 하면 됨
  5. 통신 요청 및 응답 콜백 구현

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

  6. 데이터 파싱

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

0개의 댓글