안드로이드 토이 프로젝트#4 - Rtrofit2 적용

정리 할 것


  • Retrofit2사용해서 http통신하기

Retrofit2 란?


  • Square사에서 제공하는 오픈소스 라이브러리

  • Retrofit을 이용하기 위해서 필요한 것들

    • DataModel클래스

      • 서버로 부터 JSON형식으로 통신하기 위해

    • Interface

      • HTTP 동작들을 정의해놓은 인터페이스

    • Retrofit.Builder 클래스

      • 인터페이스를 사용하는 인스턴스

      • Builder는 Base URL을 설정

시작하기


implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

Module 단 gradle에 위의 내용을 추가 해준다. Retrofit2와 okHttp3관련 라이브러리 들이다.

DataModel Class 만들기


네이버 개발자 센터에서 제공하는 Response 데이터 정보를 바탕를 바탕으로 DataClass를 만들어 보겠다. 네이버 개발자 센터에서는 아래와 같이 데이터를 제공하여 준다.

요청 변수설명
rss-디버그를 쉽게 하고 RSS 리더기만으로 이용할 수 있게 하기 위해 만든 RSS 포맷의 컨테이너이며 그 외의 특별한 의미는 없다.
channel-검색 결과를 포함하는 컨테이너이다. 이 안에 있는 title, link, description 등의 항목은 참고용으로 무시해도 무방하다.
lastBuildDatedatetime검색 결과를 생성한 시간이다.
totalinteger검색 결과 문서의 총 개수를 의미한다.
startinteger검색 결과 문서 중, 문서의 시작점을 의미한다.
displayinteger검색된 검색 결과의 개수이다.
item/items-XML 포멧에서는 item 태그로, JSON 포멧에서는 items 속성으로 표현된다. 개별 검색 결과이며 title, link, description을 포함한다.
titlestring검색 결과 문서의 제목을 나타낸다. 제목에서 검색어와 일치하는 부분은 태그로 감싸져 있다.
linkstring검색 결과 문서의 하이퍼텍스트 link를 나타낸다.
imagestring썸네일 이미지의 URL이다. 이미지가 있는 경우만 나타납난다.
authorstring저자 정보이다.
priceinteger정가 정보이다. 절판도서 등으로 가격이 없으면 나타나지 않는다.
discountinteger할인 가격 정보이다. 절판도서 등으로 가격이 없으면 나타나지 않는다.
publisherstring출판사 정보이다.
isbnintegerISBN 넘버이다.
descriptionstring검색 결과 문서의 내용을 요약한 패시지 정보이다. 문서 전체의 내용은 link를 따라가면 읽을 수 있다. 패시지에서 검색어와 일치하는 부분은 태그로 감싸져 있다.
pubdatedatetime출간일 정보이다.

해당 정보들을 아래와 같이 클래스화 시켜 구현 하였다.

data class Book(
   val lastBuildDate: String,
   val total: Int,
   val start: Int,
   val display: Int,
   val items: ArrayList<Item>
) {
   data class Item (
       val title: String,
       val link: String,
       val image: String,
       val author: String,
       val price: String,
       val discount: String,
       val publisher: String,
       val isbn: String,
       val description: String,
       val pubdate: String
  )
}

Interface 정의


interface RetrofitService {

   @GET("v1/search/book.json")
   fun getBookList(
       @Header("X-Naver-Client-Id") clientId: String,
       @Header("X-Naver-Client-Secret") clientPw: String,
       @Query("query") query: String
  ): Call<Book>

}
  • Call<Book>을 리턴하는 함수 getBookList() 생성

  • 어노테이션에 의한 파라미터를 지정할 수 있다

    • Get / post

    • Header

    • Query

    • 이외에 Path, Body등이 있다.

Retrofit Builder class


class NetRetrofit {

   fun createService(): RetrofitService {
       val baseUrl = BASE_URL
       val httpLoggingInterceptor = HttpLoggingInterceptor()
       httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
       val okHttpClient : OkHttpClient? = OkHttpClient().newBuilder()
          .addInterceptor(httpLoggingInterceptor)
          .build()

       val retrofit = Retrofit.Builder()
          .client(okHttpClient)
          .addConverterFactory(GsonConverterFactory.create())
          .baseUrl(baseUrl)
          .build()

       return retrofit.create(RetrofitService::class.java)
  }
}

Retrofit으로 Http 통신하기


아래 함수로 위에서 구현한 retrofit을 이용하여 http통신을 할 수 있다.

fun getBookList(q : String) {
       netRetrofit.getBookList(CLIENT_ID, CLIENT_SECRET, q).enqueue(object : Callback<Book> {
           override fun onResponse(call: retrofit2.Call<Book>, response: Response<Book>) {
               if (response.isSuccessful) {
                   response.body()?.let {
                       mainAdapter.setBookList(it.items)
                       mainAdapter.notifyDataSetChanged()
                  }
              }
          }
           override fun onFailure(call: retrofit2.Call<Book>, t: Throwable) {
               Log.d("getBookList()", "onFailure() called. ${t.message}")
          }
      })
  }
  • enqueue()

    • 비동기로 Request를 보내고 Response가 돌아 왔을 때 콜백으로 앱에게 알려준다.

    • 아래 두개의 메소드를 구현 해야 한다.

      • onResponse()

        • Http response를 받는다.

        • 서버가 오류메시지를 리턴하는 경우 404또는 500일때도 호출. isSuccessful()로 성공적으로 reponse되었는지 확인 가능함

      • onFailure()

        • 서버와 통신하는 중 네트워크 예외가 발생하거나 예기치 않은 예외 발생했을 때 호출

참고



이 글을 공유하기

댓글

Designed by JB FACTORY