본문 바로가기

개발/Android 개발 주저리

[Android] retrofit2 + gson 을 이용한 네트워크 처리하기




안드로이드에서 네트워크(API)를 처리할떄는 여러가지 방법이 있습니다.

기본 지원하는 urlconnection 를 사용하는 방법이 있고 외부 서드파티 라이브러리를 사용하는 방법이 있습니다.


예전에는 httpClient를 사용했으나 현재는 안드로이드에서는 공식적으로 지원하지 않습니다.

그래서 그 대용으로 사용하는 서드파티 라이브러리는 okHttp가 있습니다.


그중 오늘 소개할 retrofit(일명 레트로핏) 은 2.0부터는 okHttp를 사용하고 있습니다.

( 뭐 둘다 같은 회사에서 개발한거죠, 스퀘어사 만세! )


저같은 경우는 3가지 방식 모두 사용하는데 오늘은 레트로핏2 를 통해 간단하게 API통신하는걸 기록해봅니다.



1. 먼저 Gradle에 아래와 같은 dependencies 를 추가해줍니다

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.3.1'



2. RestClient<T> 를 생성합니다.

RestClient 에서 Base URL을 설정하며, OkHttp 및 데이터를 파싱 GsonConverter 를 지정해줍니다.

public class DefaultRestClient<T> {

private T service;
private String baseUrl = "http://api.sample.com";

public T getClient(Class<? extends T> type) {
if (service == null) {
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {

Request original = chain.request();

Request request = original.newBuilder()
.header("ex-hader", "sample")
.method(original.method(), original.body())
.build();

return chain.proceed(request);
}
}).build();

Retrofit client = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
service = client.create(type);

}
return service;
}

}


3. API 결과를 파싱할 Model 을 만듭니다. ( GSON )

- getter , setter 을 생성해주세요

@SerializedName("response")
private String response;

@SerializedName("name")
private String name;

@SerializedName("age")
private String age;



4. API 를 정의하고 호출할 interface 를 하나 만들어줍니다

- retrofit 은 기본적으로 GET,POST,PUT 등을 모두 지원합니다.

- 아래 예시에서는 주로 많이 사용하는 GET/POST만 설명하도록 하겠습니다.

- GET 으로 인자값을 넘길때는 @Path("version") int version 형식으로 해주시면 {version값} 이 넘어가게 됩니다

- GET의경우 {} 에 인자값을 넘길때는 @Path 로 하지만 &파라메터=값 형식으로 넘기실때는 @Query 를 사용해야 합니다

// GET URL자체에 param
@GET("app/{version}/{uuid}")
Call<Appinfo> getAppinfo(@Path("version") int version, @Path("uuid") String uuid);


// GET
@GET("notice")
Call<AppNotice> getAppNotice();

// POST
@FormUrlEncoded
@POST("update")
Call<Account> postUpdateProfile(@Field("test_a") String test_a,
@Field("test_b") String test_b);




5. API 호출 및 응답

retrofit 은 API호출시 동기/비동기 모두 제공합니다.

- 동기의 경우 메인쓰레드 에서 처리할 수 없기 때문에 별도의 Async 나 쓰레드를 만들어서 처리해주어야 합니다

- 여기서는 주로 사용하는 비동기 방식만 설명하겠습니다. retrofit2 부터는 Callback 을 받지 않을경우 동기로 처리되기 때문에 큰차이는 없습니다

// Rest Client, api service 선언
DefaultRestClient<TestService> mowaDefaultRestClient;
TestService mTestService;

// init
mowaDefaultRestClient = new DefaultRestClient<>();
mTestService = mowaDefaultRestClient.getClient(TestService.class);

Call<Appinfo> call = mTestService.getAppinfo(value1, "value2");
call.enqueue(new Callback<Appinfo>() {
@Override
public void onResponse(Call<Appinfo> call, Response<Appinfo> response) {

if (response.isSuccessful()) {
// 호출성공
// 결과는 response.body() 에 Appinfo Model 형식으로 담겨집니다.
// Appinfo test = response.body(); 식으로 받으면 됩니다.

}else{
MowaLogWriter.d("##### 호출 실패 ##### ");
MowaLogWriter.d("##### errorBody() " + response.errorBody());

}
}

@Override
public void onFailure(Call<Appinfo> call, Throwable t) {
MowaLogWriter.d("오류 발생");
t.printStackTrace();
}
});

위와 같이 4 에서 만든 interface 의 api 를 호출하여 결과를 받을 수 있습니다.

1 에서 addConverterFactory 를 통해 GSON 파싱을 사용하도록 선언해주었기 때문에 response 는 Appinfo Model 형태로 받게됩니다.


retrofit1.x 에 비하면 retrofit2.x 는 좀더 사용하기 편해졌고 그동안 불편했던 것들이 많이 개선되었습니다.

이 글에서 설명한건 간한하게 호출/응답 만 하고 있으며 더 자세한 기능들은 retrofit 공식 문서를 참고하시면 됩니다.



공식 가이드는 아래를 참고하세요 :)

http://square.github.io/retrofit/



감사합니다.