• Home
  • About
    • Zzu-h photo

      Zzu-h

      주니어 Android 개발자입니다.

    • Learn More
    • Email
    • Instagram
    • Tistory
    • Github
  • Posts
    • All Posts
    • All Tags
    • All Categories
  • Projects

Android: Retrofit

19 May 2022

Reading time ~2 minutes

Retrofit

  • Rtrofit은 스퀘어에서 만든 HTTP 통신을 간편하게 만들어 주는 라이브러리이다.
  • 버전은 1, 2가 있으나 현재 쓰이는 버전은 대부분 Retrofit2 이다.

Retrofit 구조

  • Retrofit은 네트워크 통신 정보만 주면 그대로 네트워크 프로그래밍을 대신 구현해 준다.
  • Retrofit은 다음의 구조를 가진다.
    1. A() 인터페이스
    2. Retrofit
    3. 서비스 객체 -> 콜백 호출
      • 인터페이스로 네트워크 정보를 전달하고, Retrofit 객체를 생성해 이를 통해서 데이터 통신 메소드를 호출한다.
  • interface의 함수는 통신할 때 필요로 한다.
    • 통신을 할 때, 각 함수를 호출하여 수행하겠음을 의미함
    • 즉, Interface로 통신을 위한 정보를 담아둔다.
  • 위에서 만든 interface를 Retrofit에 알려주면 인터페이스 정보를 읽고 실제 통신할 때 필요한 코드를 담은 서비스 객체를 생성한다.
  • 그렇게 만들어진 서비스 객체를 통해 함수를 호출하면 Call 객체를 반환해 준다.
    • 그 Call 객체의 enqueue() 함수를 통해 통신을 수행하게 된다.

동작 방식 정리

  1. 통신용 함수를 선언한 인터페이스를 작성
  2. Retrofit에 인터페이스를 전달
  3. Retrofit이 통신용 서비스 객체를 반환
  4. 서비스의 통신용 함수를 호출 후 Call 객체를 반환
  5. Call 객체의 enequeue() 함수를 호출하여 네트워크 통신을 수행

Retrofit Annotation

HTTP 메서드 정의 어노테이션

  • @GET
  • @POST
  • @PUT
  • @DELETE
  • @HEAD
  • ()안에 URL 경로를 정의해주면 baseURL 뒤에 추가되어 최종 서버 요청 URL을 완성시킨다.

@PATH

  • URL의 경로를 동적으로 지정해야 할 때가 있다.
  • {baseURL}/albums/1과 같이 경로를 동적으로 바꾸어 주기 위해 사용된다.
    • {baseURL}/albums/{idx} 처럼 중괄호로 감싸주고 함수의 매개변수에 PATH를 선언한다.
  • 사용
@GET("/albums/{id}")
fun getAlbum(@Path("id") albumId: Int): Call<BsideTracks>

@Query

  • 경로에 ?를 이용해 쿼리를 직접 담을 수도 있지만, 함수의 매개변수 값을 통해 전달할 수도 있다.
  • 사용
@GET("/albums/{id}")
fun getAlbum(
    @Path("id") albumId: Int
    @Query("title") title: String
    @Query("singer") singer: String
): Call<BsideTracks>

@QueryMap

  • 담아야 할 Query의 양이 많다면 일일이 선언하기도 버겁다.
  • QueryMap을 통해 Map 타입의 매개변수로 받아 전달하자
  • 사용
@GET("/albums/{id}")
fun getAlbum(
    @Path("id") albumId: Int
    @QueryMap("albumData") data: Map<String, String>
): Call<BsideTracks>

@Body

  • 서버에 전송할 데이터를 Body에 담고 보내기 위해서는 이 어노테이션을 사용한다.
  • @Body로 선언한 매개변수는 모델 객체 타입이며
    • 이 객체의 Property 명을 key로, data를 값으로 하여 JSON 문자열을 만들어 서버에 전송한다.
  • 사용
@POST("/users/login")
fun login(@Body user: User): Call<AuthResponse>

@FormUrlEncoded와 @Field

  • @FormUrlEncoded은 데이터를 URL 인코딩 형태로 만들어 전송할 때 사용한다.
    • 이는 서버 전송 데이터를 ‘키 = 값’ 형태의 URL 인코딩으로 전송한다.
  • @Field이 추가된 데이터를 인코딩해서 전송한다.
    • 이는 FormUrlEncoded 어노테이션을 사용할 때만 사용이 가능함
  • 사용
@FormUrlEncoded
@POST("/users/login")
fun login(
    @Field("email") email: String,
    @Field("password") password: String
): Call<AuthResponse>

@Header

  • 서버 요청에서 헤더값을 조정하기 위해 사용
  • 사용
@GET("/users/auto-login")
fun autoLogin(@Header("X-ACCESS-TOKEN") jwt: String): Call<AuthResponse>

@Url

  • base url을 무시하고 전혀 다른 url을 지정하고 싶을 때 사용
  • 사용
@GET
fun getData(@Url url: String): Call<Unit>


UMCRetrofitAndroid Share Tweet +1