코딕트에 글을 투고하기에 앞서, 이 글의 원문은 http://blog.laino.ml/11 [LAINO의 개발노트] 임을 먼저 밝힌다. 사실 이거 팀블로그다. (아시는분은 다암 ㅎ)
우리 코딕트의 진준기 회원님께서 스프링과 이것저것 깔끔하게 Async를 구성할만한 도구들을 소개시켜 주셔서 생각보다 좋은 패턴인듯 하여 글을 써보고자 한다.
사실 실력 좋으신분들은 이거보다 천만배 더 좋고 이쁜 로직 쓰실거같은데 구글링 해보니까 한국어 레퍼런스는 생각보다 이런 패턴 소개하는 글이 엄청 많지는 않은듯하여 쓰면 누가 보긴보겠지라는 마음으로 글을 투고하고자한다.
결론 : 나름(제 생각에) 깔끔한 비동기 처리 로직을 구현하는 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 2 3 4 5 | public static List<ComulApiModel> failed() { List<ComulApiModel> data = new ArrayList<>(); data.add(new ComulApiModel("error!", "", "", "", "", "")); return data; } | cs |
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로 연락주시면 정말 감사할듯 합니다.