ANDROID/Android 앱 프로그래밍

[Android] Retrofit2를 사용한 API 통신

주 녕 2021. 7. 4. 23:45
반응형

OkHttp3를 사용해 본 경험만 있었는데, 요즘엔 Retrofit2 라이브러리를 사용한다고 해서 공부해보았다.

네트워킹을 공부하기도 했고, 예전에 진행했던 프로젝트에서 사용했던 라이브러리를 복습을 위해 정리한다! 

 

Retrofit2 라이브러리

Square에서 제공하고 있는 Type-safe HTTP 통신을 위한 라이브러리
  • Rest API : 서버와 클라이언트 간 HTTP 통신을 위한 라이브러리
  • Type safe : 어떤 연산을 통해서도 예측 불가능한 결과가 나오지 않는 것
  • AsyncTask 없이 Background Thread에서 실행되며 콜백을 통해 Main Thread에서의 UI 업데이터를 간단하게 할 수 있도록 제공함
  • OkHttp와 함께 사용됨

 

Retrofit을 사용하는 이유?

  • AsyncTask로 구현된 통신 방식이나 Volley에 비해 응답 속도가 매우 빠름
  • 동기/비동기 방식을 선택할 수 있음
  • Call의 요청을 취소할 수 있음

→ 성능과 간단한 구현 방법

 

Retrofit의 구성

  • POJO(Plain Old Java Object) 형태의 Java Model 파일
    • JSON으로 이루어진 API 결과 값을 어노테이션이나 getter/setter를 이용하여 자동으로 담기는 객체를 생성함
    • API를 호출할 때 변수 값을 객체 형태로 생성하여 전달할 때도 사용
  • Interface 형태의 Service 파일
    • 기본 API 주소 + [상세 경로 / 파라미터] 형태의 API의 구성
    • [상세 경로]와 [파라미터] 부분을 어노테이션 형태로 기술하여 API를 호출
  • Interceptor
    • OkHttp 라이브러리에 의존성이 있는 만큼 OkHttp의 Interceptor를 이용하여 어플리케이션과 네트워크 종류의 중간 상태 값을 알 수 있음
    • 어플리케이션은 처음 한 번만 감지하여 정보를 확인할 수 있음
    • 네트워크는 통신이 있을 때마다 감지하여 정보를 확인할 수 있음

 

Retrofit의 실행

  • JSON 형태의 모델 클래스
  • HTTP 작업을 정의(onSuccess/onFail)하는 인터페이스
  • Retrofit.Builder를 선언한 클래스(baseUrl, Converter 등을 선언)

1. build.gradle에 추가

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

현재 버전은 github.com/square/retrofit 의 README.md의 Download를 확인!

 

2. JSON 형태의 모델 클래스를 생성

 

3. HTTP 요청을 수행하는 Call 메소드가 있는 API 인터페이스(API Service)를 생성

    ex) @GET("/posts/{userId}")

  • @GET : 리소스 조회 및 획득
  • @POST : 리소스 생성
  • @PUT : 리소스 수정
  • @DELETE : 리소스 삭제
  • @PATH, @HEAD

    ex) Call<Data> getData(@Path("userId") String userId);

    == String 타입의 userId가 1이라고 하면 "/posts/1"이라는 경로를 나타내어 API를 호출

 

@Path
  •  동적으로 경로를 사용하기 위한 어노테이션
@Query, @QueryMap
  • @GET에서 사용, 조건 파라미터를 설정
@Field, @FieldMap
  • @POST에서 사용, 조건 파라미터를 설정
    • 단일 데이터 : @Field - ContentType을 form-encoded로 지정하여 데이터를 전송해야
      하므로 @FormUrlEncoded 어노테이션을 지정해주어야 함
    • 여러 데이터 : @FieldMap - Map 보다 HashMap이 권장됨.
      마찬가지로 @FormUrlEncoded 어노테이션을 지정해 주어야 함
@Part, @PartMap
  • Multipart 요청 시 사용
    • Multipart : 이미지같은 파일은 RequestBody에 넣고
      MultipartBody.Part로 한번 더 감싸서 따로 @Part를 부여해야 함
    • @Multipart 어노테이션을 사용함으로써 multipart로 지정해 줌
    • 단일 데이터 : @Part, 여러 데이터 : @PartMap
@Body
  • Request로 넘겨주는 값이 JSON 형식일 경우 사용
@Header
  • 헤더 설정

 

4. Retrofit.Builder 클래스를 생성

final Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
           .baseUrl(MyConstant.Url.BASE_URL + "/") // 뒤에 / 를 꼭 붙여야 한다.
           .addConverterFactory(ScalarsConverterFactory.create());

 

5. APIService의 Call 메소드 객체를 선언하고 동기/비동기로 실행

Retrofit retrofit = retrofitBuilder.build();
APIService apiService = retrofit.create(ApiService.class);
Call<User> call1 = apiService.getInfo("주녕리").enqueue();

 

 


참고

반응형