LAINO의 개발노트

자바,안드로이드 Retrofit2 사용방법 / 깔끔하고 이쁜 비동기 처리 비즈니스 로직 구성하기 본문

안드로이드/선진 문물

자바,안드로이드 Retrofit2 사용방법 / 깔끔하고 이쁜 비동기 처리 비즈니스 로직 구성하기

Laino 2018. 3. 26. 02:22



오늘은 나름 선진 문물이라고 느꼈던 자바8의 이것저것을 이용하여 엄청 깔끔한 비동기 처리 로직을 구현하는 Retrofit을 통한 네트워킹 처리를 구현해보고자 한다.


일단 먼저 Gradle 부터 세팅해보자 오늘의 주인공인 레트로핏과 그의 하수인 Gson, 비동기처리 로직을 구성하는 핵심인 킹 어뎁터 Guava다.


1
2
3
4
5
6
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.retrofit2:retrofit:2.4.0'
compile 'com.squareup.retrofit2:converter-gson:2.4.0'
compile 'com.squareup.retrofit2:converter-guava:2.4.0'
compile 'com.squareup.retrofit2:adapter-guava:2.4.0'
    
cs

 

일단 로직의 구성부터 설명해야할것같다. 4개 클래스로 깔끔하게 구성해보자.


  • 인터페이스
    • 레트로핏 api 인터페이스
  • 네트워킹 처리
    • 레트로핏 팩토리
    • 레트로핏 리턴(?)
  • 자바 오브젝트
    • POJO
일반적인 레트로핏 에서의 사용과 크게 다르지 않아 보이는 클래스 구성이라고 할수있다. 스텝 바이 스텝으로 먼저 설명하고 전체적으로 한번 설명하고자 한다.

1. POJO 구성하기.
Gson을 사용하기 때문에 어느 레트로핏이 그렇듯 POJO를 구성하고자 한다. 머리가 아픈 중생들을 위해 http://www.jsonschema2pojo.org 이라는 매우 좋은 사이트가 있으니 모른다면 한번쯤 사용해보자 (JSON을 주면 POJO로 구성해준다 정말 편하다)

여기서 가장 중요한것은 지금은 이해가 안될수도 있고 후술 하겠지만, POJO(Plain Old Java Object) 내부에 네트워킹이 정상적으로 처리되지 않았을시 오류가 났다는 것을 알리는 오브젝트를 포함한 반환되는 스테틱 메소드를 구현해야한다. 예시는 RSS 피드 데이터를 처리하는 POJO였는데 이런식으로 리스트형으로 반환해줬다. 반환되는 타입은 레트로핏의 반환타입을 써야겠다.

1
2
3
4
5
public static List<ComulApiModel> failed() {
    List<ComulApiModel> data = new ArrayList<>();
    data.add(new ComulApiModel("error!"""""""""""));
    return data;
}
cs


2. 레트로핏 API 인터페이스 구성하기
이건 그냥 레트로핏 쓰는거랑 거의 동일하다. 단, 반환타입을 유심히 지켜볼 필요가 있다.

1
2
3
4
public interface ComulApiInterface {
    @GET("news.php")
    ListenableFuture<List<ComulApiModel>>getXml();
}
cs

ListenableFuture가 뭐하는놈이냐면 http://haviyj.tistory.com/31 이곳을 참조해도 좋을것 같다. 비동기처리를 말끔하게 끝내주는 우리의 친구다. 사실 남에게 설명할 만큼 내가 안다라고 하는놈은 아니여서 나중에 날잡고 공부해서 이놈에 대한 글을 써보는 기회를 가져야할듯 하다. 여튼 좋은 친구다. 나의 블로그를 구독하시는분들께서 설명해주실수 있는 분이 계시면 참 좋을것같다.


3. 레트로핏 객체를 열심히 만들기

레트로핏 객체는 생성할때마다 자원을 엄청소모한다고 들었다. 따라서 단일객체를 생성해서 싱글톤으로 접근하여 불필요한 잉여객체의 생성을 막고 깔끔하게 숨겨줄 필요가 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class RetrofitFactory {
    public static final String URL = "https://king.king/king/";
 
    private static ComulApiInterface comulAPI = new Retrofit.Builder()
            .baseUrl(URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(GuavaCallAdapterFactory.create())
            .addConverterFactory(GuavaOptionalConverterFactory.create())
            .build()
            .create(ComulApiInterface.class);
 
    private RetrofitFactory() {
    }
 
    public static ComulApiInterface getComulAPI() {
        return comulAPI;
    }
}
cs


여기서 구아바를 열심히 물려준다.


4. 인터페이스에 있는 메소드 구현해주기

이제 실질적인 파싱 로직을 구성할때이다. 레트로핏 리턴(?) 이라는 이름을 지어줬는데 다른 더 좋은 이름이 있다면 공유해주시면 감사히 사용 하겠습니다 :)


1
2
3
4
5
6
7
8
9
10
11
public class RetrofitReturn {
    public static List<ComulApiModel> getXml() {
        try {
            return RetrofitFactory.getComulAPI()
                    .getXml()
                    .get();
        } catch (Exception e) {
            return ComulApiModel.failed();
        }
    }
}
cs

여기서 네트워킹이 실패했을때 예외처리를 해주는데 이때 아까 POJO에서 구현했던 failed() 메thㅗ드를 통하여서 에러가 열심히 났다는걸 알려주자. 빈객체던 뭐던 내가 알아보고 구현하고자 하는 목표에 맞춰서 에러객체를 POJO에서 구성하면 되겠다.

5. 이쁜 사용

이제 다구현했다. 그냥 쓰면된다.


실제 구현체에서 사용되는 로직

1
List<ComulApiModel> kingNews = getXml();
cs


한줄 이상 긴말하지 않는다.



나름 친구가 알려준 이쁜 패턴들을 적용해 보았습니다. 

한줄 이상 긴말하지 않는다고 위에 말해두었으니, 궁금한 부분이 있으시거나 문의가 있으신경우 댓글이나 지체없이 훅훅 laino@laino.ml로 연락주시면 정말 감사할듯 합니다.

Comments