본문 바로가기

Android

[Android]Retrofit2 간단 사용법

반응형

안드로이드에서 http 통신을 하기 위해서는 웹서버와의 통신을 위한 HttpUrlConnection이 필요하고, 추가적으로 메인쓰레드에서는 네트워크 작업을 할 수 없기에 추가적으로 AsyncTask가 필요했습니다.


HttpUrlConnection을 수행하는 별도의 클래스는 한번 작성 후 두고두고 Ctrl+C, Ctrl+V 를 통해 재활용할 수 있지만,

통신을 할 때마다 비동기 작업을 위한 AsyncTask를 만드는 작업은 수고스럽습니다.


하지만 Retrofit을 이용하면 웹서버와의 통신이 간편해집니다.


자잘한 설명 대신 사용법으로 바로 넘어가겠습니다.

해당 소스코드는 github 아이디를 검색하여 해당 아이디의 repository 리스트를 가져오는 코드입니다.


먼저 gradle에 추가합니다.


1
2
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
cs


Retrofit2과 json 파싱을 위해 Retrofit에서 제공해주는 converter를 추가하였습니다.




Retrofit을 추가하였으니 이제 필요한 소스코드를 작성하겠습니다.

작성할 코드는 아래 2개입니다.





우선 웹서버와의 통신을 위한 API를 정의하기 위한 interface와 해당 interface를 이용하여 Retrofit을 생성할 Class가 필요합니다.

여기서 저는 RetrofitService과 NetRetrofit이라고 이름을 정했습니다.

소스 코드는 아래와 같습니다.


1
2
3
4
5
public interface RetrofitService {
    @GET("users/{user}/repos")
    Call<ArrayList<JsonObject>> getListRepos(@Path("user") String id);
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class NetRetrofit {
    private static NetRetrofit ourInstance = new NetRetrofit();
    public static NetRetrofit getInstance() {
        return ourInstance;
    }
    private NetRetrofit() {
    }
    
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create()) // 파싱등록
            .build();
    
    RetrofitService service = retrofit.create(RetrofitService.class);
    
    public RetrofitService getService() {
        return service;
    }
}
cs



NetRetrofit은 싱글톤으로 생성하였습니다.

baseUrl을 정하고 파싱을 위한 컨버터를 추가해준 후 Retrofit을 생성합니다.

그리고 API 통신을 위해 정의한 RetrofitService를 Retrofit에 초기화 해줍니다.

이후부터는 service를 통해 Retrofit을 사용하고 작성한 API을 이용합니다. 



RetrofitService에서는 Repository 리스트를 가져오는 API이기에 'GET' Request를 사용하는 API를 작성하고 응답형식은 JsonObject를 담는 ArrayList로 설정했습니다.

POST, DELETE, PUT 등 다양한 Request Method들을 당연히 제공하므로 https://square.github.io/retrofit/ 여기를 참고하시면 되겠습니다.



여기까지 왔으면 통신을 위한 초기작업이 다 끝났습니다.


이제 실제로 통신을 해보겠습니다.



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
32
33
34
35
36
public class MainActivity extends AppCompatActivity {
    EditText editText;
    TextView textView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        editText = (EditText) findViewById(R.id.editText);
        textView = (TextView) findViewById(R.id.textView);
    }
 
    public void onSearch(View view) {
        String id = editText.getText().toString();
 
        if (!id.isEmpty()) {
            Call<ArrayList<JsonObject>> res = NetRetrofit.getInstance().getService().getListRepos(id);
            res.enqueue(new Callback<ArrayList<JsonObject>>() {
                @Override
                public void onResponse(Call<ArrayList<JsonObject>> call, Response<ArrayList<JsonObject>> response) {
                    Log.d("Retrofit", response.toString());
                    if (response.body() != null)
                        textView.setText(response.body().toString());
                }
 
                @Override
                public void onFailure(Call<ArrayList<JsonObject>> call, Throwable t) {
                    Log.e("Err", t.getMessage());
                }
            });
        } else
            Toast.makeText(this"아이디를 입력하세요.", Toast.LENGTH_SHORT).show();
    }
}
 
cs



EditText, Button, TextView를 각각 하나씩 갖는 메인액티비티입니다.


1
Call<ArrayList<JsonObject>> res = NetRetrofit.getInstance().getService().getListRepos(id);
cs

싱글톤으로 생선된 NetRetrofit에서 service를 가져온 후 작성한 'getListRespos' API를 사용합니다.
통신이 정상적으로 되었다면 onResponse에서, 뭔가 에러가 발생했다면 onFailure에서 처리하면 됩니다.

위의 소스코드에서는 정상적으로 응답이 날라오면 textview에 날라온 response의 body, 즉 ArrayList<JsonObject>를 입력하게했습니다.



실제 사용화면은 아래와 같습니다.



저의 Github 아이디를 검색을 요청하면 Json형식의 응답으로 제가 가진 repository에 대한 정보들이 날라오는 것을 확인할 수 있습니다.





해당 소스코드는 https://github.com/NewLand-Ju/RetrofitStudy 에서 확인하실 수 있습니다.




반응형