Retrofit
- Rtrofit은 스퀘어에서 만든 HTTP 통신을 간편하게 만들어 주는 라이브러리이다.
- 버전은 1, 2가 있으나 현재 쓰이는 버전은 대부분 Retrofit2 이다.
Retrofit 구조
- Retrofit은 네트워크 통신 정보만 주면 그대로 네트워크 프로그래밍을 대신 구현해 준다.
- Retrofit은 다음의 구조를 가진다.
- A() 인터페이스
- Retrofit
- 서비스 객체 -> 콜백 호출
- 인터페이스로 네트워크 정보를 전달하고, Retrofit 객체를 생성해 이를 통해서 데이터 통신 메소드를 호출한다.
- interface의 함수는 통신할 때 필요로 한다.
- 통신을 할 때, 각 함수를 호출하여 수행하겠음을 의미함
- 즉, Interface로 통신을 위한 정보를 담아둔다.
- 위에서 만든 interface를 Retrofit에 알려주면 인터페이스 정보를 읽고 실제 통신할 때 필요한 코드를 담은 서비스 객체를 생성한다.
- 그렇게 만들어진 서비스 객체를 통해 함수를 호출하면 Call 객체를 반환해 준다.
- 그 Call 객체의 enqueue() 함수를 통해 통신을 수행하게 된다.
동작 방식 정리
- 통신용 함수를 선언한 인터페이스를 작성
- Retrofit에 인터페이스를 전달
- Retrofit이 통신용 서비스 객체를 반환
- 서비스의 통신용 함수를 호출 후 Call 객체를 반환
- 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>