Retrofit에 대해 Naver API 사용

Retrofit

Retrofit은 Square사에서 제공하는 오픈 소스 라이브러리 입니다. REST API통신을 위한 라이브러리 입니다. 이번 포스팅에서는 Retrofit을 사용하는 방법에 대해 알아 보겠습니다.

 

Retrofit Dependencies 추가 및 ConverterFactory Dependencis 추가

 

Module단의 gradle 파일에 아래와 같이 dependencies를 추가 해 줍니다. Converter로 Gson도 많이 이용하나 이번 프로젝트에서는 moshi라는 라이브러리를 사용했습니다.

 

implementation "com.squareup.retrofit2:retrofit:2.5.0"
implementation "com.squareup.retrofit2:converter-moshi:1.8.0"

 

Retrofit Build 하기 (MovieService.kt)

Retrofit을 사용하기 위해 Builder를 사용하여 retrfoit 설정과 객체생성 하는 방법에 대해 알아 보겠습니다.

  • baseURL() - 어떤 서버로 네트워크 통신을 요청할 것 인지
  • addContverterFactory() - 통신이 완료된 후, 어떤 converter를 이용하여 데이터를 파싱할 것인지
  • build() - Retrofit.Builder 객체에 설정한 정보를 이용하여 실질적으로 Retrofit 객체를 만들어 줌.

 

private const val BASE_URL = "https://openapi.naver.com/v1/"
private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
    .build()

 

Interface 정의 하기 (MovieService.kt)

해당 단계에서는 API 규격에 맞는 Interface들을 선언해야 합니다.

  • @GET - HTTP 통신에 사용되는 METHOD중 GET 요청을 하겠다라고 명시하는 Annotation
  • @Path는 URL의 부분 중 일부 경로가 필요에 따라 동적으로 바인딩 되어야 하는 경우 지정한다. {type} 부분에서 동적으로 바인딩 된다.
  • @Header들을 파라미터로 받아 지정
  • @Query 또한 파라미터로 받아 지정
interface MovieService {
    @GET("search/{type}")
    fun getMovies(
        @Header("X-Naver-Client-Id") clientId: String,
        @Header("X-Naver-Client-Secret") clientPw: String,
        @Path("type") type: String,
        @Query("query") query: String
    ): Call<Movie>
}

 

Interface 객체 생성 (MovieService.kt)

Retrofit의 create()와 위에서 정의한 interface를 사용하여 실질적으로 사용할 retrofit 클라이언트 객체를 생성합니다.

 

object MovieApi {
    val retrofitService: MovieService by lazy {
        retrofit.create(MovieService::class.java)
    }
}

 

Http요청을 보내고자 한다면 이 객체의 getMovies()를 호출 해 주면 됩니다. enqueue()를 이용하여 비동기 처리를 합니다.

 

fun getMovieList(query : String) {
        MovieApi.retrofitService.getMovies(CLIENT_ID, CLIENT_SECRET, "movie", query).enqueue(
            object : retrofit2.Callback<Movie> {

                override fun onResponse(call: Call<Movie>, response: Response<Movie>) {
                    size.value = response.body()?.items?.size
                    items.value = response.body()?.items
                }

                override fun onFailure(call: Call<Movie>, t: Throwable) {
                    Log.d("MovieFragment", "onFailure()  message : " + t.message)
                }

            }
        )
    }

 

댓글



Designed by JB FACTORY