Android

[Android/Java] Retrofit 을 사용해보자

Question영 2019. 10. 8. 10:30
반응형

 

 

 

개인적인 정리를 위해 요즘 한창 유행하고 있는 통신 라이브러리인 Square 사의 Retrofit 에 대한 내용을 정리합니다.

내용이 부족할수도 있으니 수정할 내용이 있다면 가차 없이 코맨트 부탁드립니다.

 

시스템 환경

 

  • 운영 체제 : macOS Mojave
  • Tool : AndroidStudio
  • Android, Java

 

설정

 

  1. build.gradle(app) 을 엽니다.

  2. dependencies 에 다음과 같이 코드를 추가합니다.

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
     
    dependencies {
            ...
     
        //Retrofit
        implementation 'com.squareup.retrofit2:retrofit:2.6.2'
        implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
    }
     
    cs

 

구성

 

  1. POJO(Plain Old Java Object) 형태의 Java Model 파일

    • JSON 으로 이루어진 API 결과 값을 어노테이션이나 getter/setter 를 이용하여 자동으로 담기는 객체를 생성합니다.
    • API 를 호출할때 변수값을 객체 형태로 생성하여 전달할때도 사용합니다.
  2. Interface 형태의 Service 파일

    • 기본 API 주소 + [상세 경로 및 파라미터] 형태의 API 의 구성에서

      [상세 경로] 와 [파라미터] 부분을 어노테이션 형태로 기술하여 API 를 호출 합니다.

    • 개인적으로 호출 대상만 틀렸지 Spring 의 Service 와 유사한 형태라고 생각했습니다.

  3. Interceptor

    • OkHttp 라이브러리에 의존성이 있는 만큼 OkHttp 의 Interceptor 를 이용하여

      Application 과 Network 종류의 중간 상태 값을 알수 있습니다.

    • Application 은 처음 한번만 감지하여 정보를 확인 할 수 있습니다.

    • Network 는 통신이 있을때 마다 감지하여 정보를 확인 할 수 있습니다.

Interceptor 동작

 

실행

##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&lt;Data&gt;() {
    @Override
    public void onResponse(@NonNull Call&lt;Data&gt; call, @NonNull Response&lt;Data&gt; 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&lt;Data&gt; 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 로 나눌수 있다.

 


참고 블로그

 

반응형