Thursday, November 9, 2017

Retrofit 커스텀 사용법: Retrofit + Realm + Gson 활용 예제

오늘은 제가 개인적으로 커스텀하여 사용하는 Retrofit 구조에 대해 설명하려 합니다. Retrofit은 Square사에서 개발한 통신 라이브러리로서, REST API를 편리하게 이용할 수 있도록 개발되었습니다. 이 글에서는 저의 경험을 바탕으로 1.9버전부터 조금씩 변경하여 사용중인 유용한 방법을 소개하려 합니다.

Retrofit, Realm, 그리고 Gson을 활용한 Github 유저 리스트 업데이트 예제

이 예제에서는 Retrofit과 Realm 그리고 Gson 라이브러리를 함께 사용하여 Github 유저 리스트를 받아와 갱신하는 방법을 살펴보겠습니다.

앱 구조

앱 구조

dependency

의존성 그래프

위의 이미지들은 전반적인 앱의 자료 구조와 의존성을 보여줍니다.

Retrofit 작업 흐름(WorkFlow)

간략하게 작업 흐름을 설명해보면,

  1. 앱 런치시 MainActivity 실행
  2. MainActivity에서 메인 UI 세팅 및 Retrofit으로 API 요청
  3. API 응답 시 Realm DB로 리스트 업데이트

Retrofit 구성 중 주요 부분은 network 패키지에 위치해 있으며, 특히 APICallAdapter에 주목해야 합니다.

APICallAdapter 코드 예시

public class APICallAdapter<T> implements APICall<T> {
    private final Call<T> call;

    APICallAdapter(Call<T> call) {
        this.call = call;
    }

    @Override
    public Response<T>, execute() throws IOException {
        Response<, T>, response = call.execute();
        if (response.code() != 200) {
            //정의된 코드로 분기
        }
        return response;
    }

    @Override
   public void cancel() {
       call.cancel();
   }

   @Override
   public void enqueue(final APICallback<, T>, callback) { 
       // 이하 생략...
}

위의 코드는 Retrofit을 사용하여 API 호출을 관리하는 기본적인 클래스인 'APICallAdapter'의 예입니다.

APICallAdapter는 APICallAdapterFactory에서 생성되며, 커스텀 팩토리를 사용하기 위해 레트로핏 생성시 팩토리를 추가해야 합니다.

APIServiceGenerator와 MainActivity에서의 사용 예제

private static Retrofit retrofit = new Retrofit.Builder()
.baseUrl(APIService.baseUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(new APICallAdapterFactory())
.build();
APIServiceGenerator.createService(APIService.class)
.getUsers()
.enqueue(new ErrorHandlingCallBack<JsonArray>() {
@Override
protected void onError(String errMsg) { /* 에러 처리 */ }

@Override
public void success(Response<JsonArray> response) {
final JsonArray userJsonArray = response.body();
if (userJsonArray != null) {
GitHubUser user;
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
for (JsonElement userElement : userJsonArray) {
user = GsonSingleton.getInstance().fromJson(userElement, GitHubUser.class);
realm.copyToRealm(user);
}
realm.commitTransaction();
realm.close();
}
}
});

Retrofit에서 팩토리를 이용하여 서버와 통신하는 객체(call 객체)를 받아와서 동기 및 비동기 통신을 위한 메소드(execute(), enqueue())를 구현합니다. 여기서는 비동기 통신에 대해서만 설명하겠습니다. 요청이 실패할 경우에는 에러 핸들링을 하고, 성공시 응답 코드에 따라 미리 정의된 callback으로 분기합니다.

이렇게 설정을 마치면 APICallback을 이용하여 서버와 추가로 응답 코드를 정하거나 예외처리하기가 매우 편해집니다. 성공시에는 Realm과 Gson을 이용하여 객체를 담고 자동으로 갱신합니다.

예제소스 다운로드

요약: Retrofit 커스텀 사용법의 장점

이런 설정을 통해 APICallback에 분기할 항목들을 추가하고, APICallAdapter에서 응답에 따른 분기를 하면 레트로핏 사용시 매우 유용한 방식입니다.


0 개의 댓글:

Post a Comment