HttpConnection 객체를 생성하고, AnsyncTask를 Implement하고,
비동기 통신을 10개 이상 쓰다보면 객체를 계속 생성하느라 불편했다.
Json 방식으로 보내주려면 Gson으로 한번더 묶어야 하기도 했고..😂😂😂😂
그래서 이참에 retrofit으로 바꿔보기로 했다. 어떤 장점이 있을까?
🍎 RetroFit02의 장점
1. TYPE-Safety
type-safe: 어떠한 연산/오퍼레이션도 정의되지 않은 결과를 내놓지 않는 것. 즉, 예측가능한 결과만 내는 것을 말한다.
제너릭 타입을 이용하여 내가 받고싶은 타입을 지정할수있다 심지어 DTO까지도.
2. Converter(변환)
가장큰장점이다!😁
RetroFit은 변환을 지원한다.
HttpConnection을 이용할 경우, 서버에서 Json 데이터를 String으로 받아 Gson을 이용해 변환했다.
하지만 RetroFit을 이용할 경우, 서버에서 데이터를 받아올때 변환해서 가져올수있다.
3. 로그(OkHttp 이용)
통신의 로그를 찍어볼수있다.
이외에도 RxJava를 엮는다던지(아직 몰라..), 속도의 빠름이라던지 다양한 이점이 있다.
자 이만큼이면 당신도 RetroFit를 사용할때가 온것이다.
build.gradle에 등록하자
//Retrofit2
implementation group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.9.0' //레트로핏
implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.9.0'//json
implementation group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.9.0'//string
public class RetrofitBuilder {
public static RetrofitBuilder retrofitBuilder = new RetrofitBuilder();
// 싱글톤 객체를 이용한다.
public static RetrofitBuilder getInstance() {
return retrofitBuilder;
}
/깜빡해서 생성자를 만들어도 어떠한것도 만들어지지않게 생성자에 빈값.
private RetrofitBuilder() {
}
Gson gson = new GsonBuilder().setLenient().create();
//Gson일 경우 오류가 나도 컨버터가 되는경우가 있으므로 Gson은 맨뒤에 놓도록 한다.
//데이터를 받아왔을때, 컨버터로 변환해준다! 놀라운기능이다.
Retrofit retrofit = new Retrofit.Builder()
//api의 baseURL
.baseUrl(anyctaskdev)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
//실제 api Method들이선언된 Interface객체 선언
ApiService apiService = retrofit.create(ApiService.class);
public ApiService getService() {
return apiService;
}
스프링 같이 주입식인것 같다.
멀티파트
Content-Type
레트로핏 공식
public interface ApiService {
//String으로 받을경우, ScalrsConverterFactory가 작동한다.
//Query는 서버에서 request.getParam으로 불러올수있다.
@POST("mobile/오예쓰.do")
Call<String> 오예쓰(@Query("mem_hp") String mem_hp,
@Query("mem_mail") String mem_mail);
//@FormUrlEncoded데이터로 전송
//key-value pair의 key는 어노테이션 값,
//value는 @Field의 매개변수 값 .
@FormUrlEncoded
@POST("/user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
//Path : 치환 가능한 매개 변수
//QueryMap: 동적이며 다양한 쿼리 매개변수들은 Map 으로도 사용
@GET("/group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
}
Call<KworksVO> getKworksMemberCall = kworksService.loginKworks(isUUID);
getKworksMemberCall.enqueue(new Callback<KworksVO>() {
//응답데이터 -> 200, 400이든 뭐든지 오므로 아래에 SuccessFul을 쓴다.
@Override
public void onResponse(Call<KworksVO> call, Response<KworksVO> response) {
if (response.isSuccessful()) {
}
}
//아예 안될때
@Override
public void onFailure(Call<KworksVO> call, Throwable t) {
loadingFailed();
}
});