개인적인 정리를 위해 요즘 한창 유행하고 있는 통신 라이브러리인 Square 사의 Retrofit 에 대한 내용을 정리합니다.
내용이 부족할수도 있으니 수정할 내용이 있다면 가차 없이 코맨트 부탁드립니다.
시스템 환경
- 운영 체제 : macOS Mojave
- Tool : AndroidStudio
- Android, Java
설정
-
build.gradle(app) 을 엽니다.
-
dependencies 에 다음과 같이 코드를 추가합니다.
-
123456789dependencies {...//Retrofitimplementation 'com.squareup.retrofit2:retrofit:2.6.2'implementation 'com.squareup.retrofit2:converter-gson:2.6.2'}
cs
구성
-
POJO(Plain Old Java Object) 형태의 Java Model 파일
- JSON 으로 이루어진 API 결과 값을 어노테이션이나 getter/setter 를 이용하여 자동으로 담기는 객체를 생성합니다.
- API 를 호출할때 변수값을 객체 형태로 생성하여 전달할때도 사용합니다.
-
Interface 형태의 Service 파일
-
기본 API 주소 + [상세 경로 및 파라미터] 형태의 API 의 구성에서
[상세 경로] 와 [파라미터] 부분을 어노테이션 형태로 기술하여 API 를 호출 합니다.
-
개인적으로 호출 대상만 틀렸지 Spring 의 Service 와 유사한 형태라고 생각했습니다.
-
-
Interceptor
-
OkHttp 라이브러리에 의존성이 있는 만큼 OkHttp 의 Interceptor 를 이용하여
Application 과 Network 종류의 중간 상태 값을 알수 있습니다.
-
Application 은 처음 한번만 감지하여 정보를 확인 할 수 있습니다.
-
Network 는 통신이 있을때 마다 감지하여 정보를 확인 할 수 있습니다.
-
실행
##RetrofitService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public interface RetrofitService {
/**
* GET 방식, URL/posts/{userId} 호출.
* Data Type의 JSON을 통신을 통해 받음.
* @Path("userId") String id : id 로 들어간 String 값을, 첫 줄에 말한
* {userId}에 넘겨줌.
* userId에 1이 들어가면
* "http://jsonplaceholder.typicode.com/posts/1" 이 최종 호출 주소.
* @param userId 요청에 필요한 userId
* @return Data 객체를 JSON 형태로 반환.
*/
@GET("/posts/{userId}")
Call<Data> getData(@Path("userId") String userId);
}
|
cs |
인터페이스를 구성합니다.
여기에서는 간단한 테스트를 위해 하나의 API 호출만 구성했습니다.
하나씩 살펴보자구요.
@GET("/posts/{userId}")
@GET 은 통신 방식을 나타내는 어노테이션이다. @GET, @POST, @PUT, @PACH, @HEAD 의 종류가 있습니다.
{userId} 는 앞으로 설명할 @Path 와 매칭되는 동적인 변수역할을 합니다.
Call<Data> getData(@Path("userId") String userId);
String 타입의 userId 가 1이라고 하면 "/posts/1" 라는 경로를 나타내며 2 라고하면 "/posts/2" 로 변경되어 API 를 호출할 것입니다.
파라미터에 사용되는 어노테이션의 종류는 @Path, @Query, @QueryMap, @Field, @FieldMap, @Body, @Header 가 있으며
다른 종류가 있으면 코맨트 부탁합니다.
파라미터 어노테이션에 대한 기능을 간략하게 기능을 정리해봤습니다.
@Path - 동적으로 경로를 사용하기 위한 어노테이션
@Query, @QueryMap - @GET 에서 사용하며 조건 파라미터를 설정
@Field, @FieldMap - @POST 에서 사용하며 조건 파라미터를 설정
@Body - 객체를 이용하여 조건 파라미터를 설정
@Header - 해더 설정
##RetrofitActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://jsonplaceholder.typicode.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
OkHttpClient client = new OkHttpClient().newBuilder().addInterceptor(
new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
return null;
}
}
).build();
|
cs |
Retrofit 을 이용하기 위해 초기화 해줍니다.
테스트는 http://jsonplaceholder.typicode.com 라는 사이트에서 진행합니다.
인터셉터 설정은 테스트에서는 임시적으로 클래스 안에서 객체를 생성하여 추가해 주었으나
실제 개발에서는 별도로 파일을 분리하는 것을 권장합니다. (코드가 복잡, 재사용성 떨어짐, 유지보수가 힘듬)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
RetrofitService retrofitService = retrofit.create(RetrofitService.class);
retrofitService.getData("1").enqueue(new Callback<Data>() {
@Override
public void onResponse(@NonNull Call<Data> call, @NonNull Response<Data> response) {
if (response.isSuccessful()) {
Data body = response.body();
if (body != null) {
Log.d("data.getUserId()", body.userId + "");
Log.d("data.getId()", body.id + "");
Log.d("data.getTitle()", body.title);
Log.d("data.getBody()", body.body);
Log.e("getData end", "======================================");
}
}
}
@Override
public void onFailure(@NonNull Call<Data> call, @NonNull Throwable t) {
}
});
|
cs |
위와 같이 설정하여 API 를 호출 합니다.
최종 API 호출 주소는 "http://jsonplaceholder.typicode.com/posts/1" 가 되고
호출 성공시 onResponse 에 실패시 onFailure 에서 응답과 결과과 결과를 받을수 있습니다.
Retrofit 사용시 (개인적으로 생각하는) 주의사항
- Get 방식일때 @Query 와 @QueryMap 을 사용한다.
- Post 방식일때 @Field 와 @FieldMap 을 사용한다.
- Interceptor 개념은 OkHttpClient 라이브러리가 적용된 프로젝트에만 국한된 개념이다.
- Interceptor 는 크게 Applicaion 과 Network 로 나눌수 있다.
참고 블로그
- https://jongmin92.github.io/2018/01/29/Programming/android-retrofit2-okhttp3/
- https://gun0912.tistory.com/50
- http://devflow.github.io/retrofit-kr/
- https://square.github.io/okhttp/interceptors/
'Android' 카테고리의 다른 글
[Android/Error] aidl 컴파일 오류 (0) | 2019.12.13 |
---|---|
[Android/Error]error: illegal character: '\ufeff' ( illegal character 65279) (0) | 2019.12.13 |
[Android] 주소록에서 연락처 창 노출 후 선택시 문자 전송 (1) | 2019.11.12 |
[Kotlin/Android] 갤러리 이미지 갱신 (0) | 2019.08.29 |
[Android/Kotlin] 정적 검사를 사용해보자 1 - 소나큐브(Sonarqube) (0) | 2019.07.31 |