[TIL] #41 Retrofit

Yeon·2023년 9월 18일
0

내일배움캠프 - Kotlin

목록 보기
54/58
post-thumbnail

1. Retrofit?

  • Square Inc.에서 개발한 HTTP 클라이언트 라이브러리
  • API 통신을 위해 구현된 OkHTTP의 HTTP 통신을 간편하게 만들어주는 라이브러리를 뜻함
  • 안드로이드 앱 개발에서 주로 활용되지만, 다른 플랫폼에서도 사용할 수 있음

2. Features

1) 간결한 코드

  • Retrofit을 사용하면 RESTful API 통신을 위한 코드를 간결하게 작성할 수 있음
  • 인터페이스를 정의하고, 해당 인터페이스를 통해 HTTP 요청을 만들고 응답을 처리할 수 있음

2) 동기 및 비동기 지원

  • Retrofit은 동기 및 비동기 방식으로 HTTP 요청을 처리할 수 있음
  • 이를 통해 UI 스레드에서 블로킹되지 않고 효율적으로 네트워크 요청을 관리할 수 있음

3) 다양한 서버와의 통신 지원

  • Retrofit은 JSON, XML, Protocol Buffers와 같은 다양한 데이터 형식을 처리할 수 있음
  • 다양한 서버와 통신하기 위한 다양한 HTTP 클라이언트 구성 옵션을 제공함

4) 인터셉터

  • 인터셉터를 사용하여 요청 및 응답을 중간에서 가로채고 수정할 수 있음
  • 인증 토큰 추가, 로깅, 캐싱 등의 작업을 수행하기에 용이함

3. Elements

1) DTO

  • Data Transfer Object
  • 서버와 클라이언트 간에 데이터를 주고받을 때 사용하는 객체
    • 서버 응답의 구조와 동일한 필드를 갖음
  • Gson 같은 컨버터를 사용하여 JSON 데이터를 DTO 객체로 변환

2) Interface

  • API Interface
  • 서버 API의 엔드포인트 및 HTTP 요청 메서드를 정의
    • 각 엔드포인트의 경로와 요청 메서드(GET, POST, PUT, DELETE 등)를 어노테이션을 사용하여 지정
  • 메서드의 매개변수와 반환 형식을 정의하여 Retrofit이 요청을 처리하고 응답을 파싱할 수 있게 함

3) Retrofit 클래스

  • Retrofit을 초기화하고 설정함
  • 서버와 통신할 기본 URL을 설정함
  • 컨버터 팩토리를 추가하여 데이터 변환을 지원함
  • 인터셉터를 추가하여 요청과 응답을 가로채고 수정할 수 있음
  • API 인터페이스와 실제 HTTP 요청을 수행하는 객체를 생성함
  • Retrofit 객체를 초기화하는 단계에서 서버의 기본 설정을 지정하므로 앱에서 전반적인 통신 구성을 제어할 수 있음

4. Example

Retrofit을 사용하여 GET 요청을 보내고 응답을 처리하는 예제!

1) build.galde.kts

implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")

2) AndroidManifest.xml

인터넷 권한 설정!

    <uses-permission android:name="android.permission.INTERNET" />

3) DTO

// 카카오 이미지 검색 API 사용 예시
data class KakaoImage(
    val collection: String,
    @SerializedName("thumbnail_url")
    val thumbnailUrl: String,
    @SerializedName("image_url")
    val imageUrl: String,
    @SerializedName("display_sitename")
    val siteName: String,
    @SerializedName("doc_url")
    val docUrl: String,
    val datetime: String
)
  • 속성명을 수정하고 싶다면 아래 예시처럼 @SerializedName에 원래 속성명을 쓰고 바꾸면 됨!
      @SerializedName("thumbnail_url")
      val thumbnailUrl: String,\
    (JSON 데이터만 사용해봐서 XML도 똑같은지는 잘 모르겠음...)

4) Interface

interface KakaoApi {
    @GET("v2/search/image")
    fun searchImage(
        @Query("query") query: String
    ): Call<KakaoImageList>
}
  • 카카오 이미지 API의 엔드포인트 경로를 @GET에 써줌

5) Retrofit 객체

private val retrofit = Retrofit.Builder()
    .baseUrl(Constants.BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(networkClient)
    .build()
  • Constants.BASE_URL은 카카오 API URL을 상수로 설정해놓은거!

6) 비동기적으로 요청 보내고 응답 처리

try {
    val response = kakaoApi.getPosts()
    if (response.isSuccessful) {
        val posts = response.body()
        // 응답 데이터(posts)를 처리하는 로직 작성
    } else {
        // 오류 처리
    }
} catch (e: Exception) {
    // 네트워크 오류 처리
}



[참고 사이트]

'[Kotlin] Retrofit 사용한 API 통신 방법', 나의 개발 해방 일지
'[kotlin][Android] retrofit2 (레트로핏) 사용방법', 챠니의 코딩일기

0개의 댓글