Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

COCSOS - guitar, computer, etc

181002 Retrofit2 설명, 차이와 사용법 본문

Computer/android

181002 Retrofit2 설명, 차이와 사용법

COCSOS 2018. 10. 4. 19:50

글을 작성하던 중 계획이 바뀌었다.


서버에서 받아올 필요가 생김.


이래서 기획이 중요한건데... 기획만 하는 사람들은 이걸 모르겠지 휴


아무튼 원래대로 Retrofit2  + RxAndroid2를 공부하기로 한다.



Retrofit2?

REST api에 특화된 CRUD 방식의 서버연결을 편하게 구현할 수 있는 라이브러리.

이며, 장점은


http://meansoup.blogspot.com/2017/05/retrofit.html

에 따르면


1. annotation 방식으로 구현이 쉽다. 

2. 성능좋음

3. 가독성, 유지보수, 재사용성 좋음.


AsyncTask에 비해서 1. 미리 interface를 정의해놓고, 2. 객체를 생성한뒤, 3. 연결하면 끝.


ex)

//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 인터페이스 정의


public interface GitHubService {

  @GET("/users/{user}/repos")

  Call<List<Repo>> listRepos(@Path("user") String user); //함수 정의


//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 객체 생성


Retrofit retrofit = new Retrofit.Builder()

    .baseUrl("https://api.github.com")

    .build();


GitHubService service = retrofit.create(GitHubService.class);


//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 서버 연결


Call<List<Repo>> repos = service.listRepos("octocat");

동기적 사용방법은 repos.exceute, 비동기로는 repos.enqueue 

Main Thread(UI thread)에서는 네트워크 연결을 할 수 없다고 한다.
그럼 왜 동기적 사용방법이 있지? 

우선 사용상의 차이점은, 동기적 방식은 바로 변수를 받아서 사용할 수 있다.
함수 내에서 
String body = execute().body().toString();
return body 혹은 처리 로직 진행...

비동기적 방식은 바로 변수를 받아서 사용할 수 없고 대신 callback을 받아서 진행해야한다.
enqueue(new Callback(){통신 성공시 함수내에서 처리 / 실패시 함수 내에서 처리});
 
동기적 방식은 '현재 스레드에서 진행'
 -> 백그라운드에서는 동기적 방식을 사용하는 편이 편할 수 있다.

비동기적 방식은 '백그라운드에서 진행'
 -> mainThread에서는 비동기적 방식이 편할 것이다. 백그라운드에서 또 백그라운드로 진행할 필요는 없다.


이 부분에서 RxAndroid의 편함이 등장할 차례인가보다.


암튼 AsyncHttpClient를 사용하면서
GET 방식을 사용하려고 하는데 body 태그에 데이터가 들어가지 않는 버그?가 있었는데
Retrofit은 잘 먹혔으면 좋겠다.


GET에는 body를 추가할 수 없다고 되어있다 : https://tosslab.github.io/android/2016/04/16/migration-to-retrofit2.html

ㅠㅠ delete는 get과 같았으나 따로 annotation을 이용해서 사용가능한가보다.


일단 user-permission 인터넷 필요.



gradle의 적용에는 다음을 참고했다 


https://dev-juyoung.github.io/2017/11/10/android-retrofit-basic/


  compile "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion"

  compile "com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion"

  compile "com.squareup.okhttp3:okhttp:$rootProject.okhttpVersion"



왜 retrofit2하나만 추가하는데 라이브러리를 세줄이나 추가를 하냐면 DI(의존성 주입)를 위해서.

이전에 써진 포스트가 있으므로 용어는 패스


근데 okHttp도, retrofit2도 연결하는 라이브러리인데 왜 가져오라그러지?

하고 찾아봤더니

okhttp는 low-level 처리를 하고...

retrofit2는 high-level 에 적합하며 okhttp와 결합도가 높아서 많이 의존하여 내부에서 이미 ohHttp를 사용한다는 듯하다.

내부에서 사용하면 안가져와도 되는거 아니냐?

고 한다면, 안가져와도 실행은 된다고한다.


그러나 okHttp는 http통신을 하고, retrofit은 json등의 데이터 위주의 api통신을 하기때문에

홈페이지를 로딩하든가 하는 부분은 okHttp를 사용해서 하는 것 같다.


Retrofit 은 API 인터페이스를 호출 가능한 객체로 바꿔줍니다. 

위엔 세줄을 추가했지만 나는... 일단 두줄만 추가해야겠다ㅎ






이곳도 설명이 잘 되어있음

http://devflow.github.io/retrofit-kr/

아하, gradle에 추가한 두번째 gson 등의 변환기를 컨버터라고 하고, GSON, jackson,moshi,simple XML 등이 있구나.

단, deserialization(역직렬화)만 가능하니까 객체를 string?글줄로 변환(직렬화)하려면 gson.toJson()등으로 직접 해줘야하는듯.


컨버팅해서 받아오려면 retrofit 객체 생성시 .build() 이전에

    .addConverterFactory(GsonConverterFactory.create())

를 추가하면 되는것 같고...
헤더관리, mulit-part관리, 등에 대해 알 수 있었다.

개발상에 팁이 되는 사이트 

이 정도면 각종 이슈에 대해서는 어느정도 사용가능할 듯 하다.


'Computer > android' 카테고리의 다른 글

220405 애니메이션 훑기  (0) 2022.04.05
191205 App Widget 정리 - 1  (0) 2019.12.05
181004 RxJava2+Retrofit2+lambda정리  (0) 2018.10.05
Comments