Retrofit은 REST API로, 서버와 클라이언트간 Http 통신을 위한 인터페이스를 뜻한다.
쉽게 말해, 클라이언트에서 서버로 어떠한 요청을 보내면 서버는 그 요청에 대한 응답을 클라이언트로 보내주게 되는데, 이 일련의 과정들을 쉽게 사용 할 수 있도록 도와주는 역할을 하는 것이 바로 Retrofit이다.
Retrofit은 TypeSafe한 HttpClient라이브러리 이다.
Http개발의 어려움
보통 Http를 개발한다면, 아래의 것들을 고려해야 한다.
HttpURLConnection
HttpURLConnection은 가장 원시적인 방법의 HttpClient이다.
장점
단점
Retrofit 은 안드로이드 앱에서 필요한 데이터를 서버로부터 가져오고 서버에 데이터를 전송하기 위한 코드를 작성할 때 사용하는 라이브러리이다.
즉, 개발자가 서버와 통신하기 위한 코드를 작성하기 쉽게 라이브러리로 만들어 놓았기 때문에 사용
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)
}
인터넷 사용 권한 추가
통신을 위해서는 인터넷 사용 권한이 필요
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 객체 초기화
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();
}
}
인터페이스 정의
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()로 들어오게 된다.
데이터 파싱
이제 받아온 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()을 통해 변환해주시면 된다.
// 이후에는, 원하시는 모양으로 데이터를 가져다가 사용