[Android/Kotlin] Retrofit 사용하기

핸디·2021년 6월 28일
1

안드로이드

목록 보기
1/9
post-custom-banner

1. Retrofit 이란?

모바일에서 HTTP API 통신을 할 때 사용하는 라이브러리
-> 안드로이드 애플리케이션에서 통신 기능에 사용하는 코드를 사용하기 쉽게 만들어놓은 라이브러리이다. REST기반의 웹서비스를 통해 JSON 구조를 쉽게 가져오고 업로드할수 있다.

2. Retrofit을 사용하는 이유

개발자가 서버와 통신하기 위한 코드를 작성하기 쉽게 라이브러리로 만들어놓았기 때문!

3. 사용방법

TIP) Postman사용하기

Postman을 통해 api요청 반환결과값을 편하게 볼 수 있다.

1. Retrofit 라이브러리를 build.gradle(app)에 추가

 implementation 'com.squareup.retrofit2:retrofit:2.9.0'
 implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    

converter-gson 은 JSON 을 object형식으로 변환하도록 도와준다.

2. Manifest 파일에 Internet permission 을 추가한다.

http통신을 하기 때문에 인터넷 사용권한 추가 필요

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

3. JSON 형태의 모델 클래스(반환할 data class) 작성

서버 통신시 request body 또는 response body에서 사용할 JSON형태의 모델 클래스 작성 -> Kotlin에서는 data class 형태로 작성한다!

  • Book 하나하나에 대한
data class Book ( 
    @SerializedName("itemId")val id:Long, //서버에서는 itemId라는 값을 가져와서,  app에선 id라는 값으로
    @SerializedName("title")val title:String,
    @SerializedName("description")val description:String,
    @SerializedName("coverSmallUrl")val coverSmallUrl:String

)
  • BestSeller 목록
data class BestSellerDto (
    @SerializedName("title") val title:String,
    @SerializedName("item") val books:List<Book>

    )
  • 책검색 목록
data class SearchBookDto (
    @SerializedName("title") val title:String,
    @SerializedName("item") val books:List<Book>
)

변수명은 원래 서버에서 사용하는 값과 똑같이 작성해야 된다.
만약 앱 내에서 다른 변수명으로 사용하고 싶다면 위의 코드처럼
' @SerializedName("서버에서 변수명") val 앱내변수명:자료형 ' 을 사용한다.

4. Retrofit Service interface를 작성한다.

레트로핏에서 Service는 API를 정의하는 인터페이스를 말한다.
어떤 형태와 방식으로 통신을 할지 어노테이션과 파라미터를 지정하면 된다.
Service는 기본적으로 Call<> 객체를 반환한다.
서버의 api가 String을 반환한다고 가정하면
클라이언트는 Retrofit을 통해 Call<String.>을 받게 된다.

interface BookService {

    @GET("/api/search.api?output=json")
    fun getBookbyName(
        @Query("key") apiKey:String, //요구하는 기본인자를 @Query형태로
        @Query("query") keyword: String

        ): Call<SearchBookDto> //반환하는 값SearchBookDto

    @GET("/api/bestSeller.api?output=json&categoryId=100")
    fun getBestSeller(
        @Query("key") apiKey:String

    ):Call<BestSellerDto>
    }
  • get vs. post?

5. Retrofit.Builder 로 Retrofit 객체 초기화

서비스가 인터페이스 형식 -> API를 call할때 BookService를 이용할 수 없다. 따라서, retrofit 구현체가 필요하다.

val retrofit= Retrofit.Builder()
                .baseUrl("https://book.interpark.com")
                .addConverterFactory(GsonConverterFactory.create()) // Json데이터를 사용자가 정의한 Java 객채로 변환해주는 라이브러리
                .build() //레트로핏 구현체 완성!

        val bookService=retrofit.create(BookService::class.java) //retrofit객체 만듦!

baseUrl에는 API서버의 기본URL주소를 넣어준다!

6. Retrofit 객체에 enqueue()를 사용하여 서버와 통신했을 때 콜백을 작성하여 사용한다.

        bookService.getBestSeller("38845BE9BD0EBEDF271A2D5BC770C5BEEBB2D38910F504545CE384C6692DA6D4")
                .enqueue(object: Callback<BestSellerDto>{
                    override fun onFailure(call: Call<BestSellerDto>, t: Throwable) {
                        //todo 실패처리
                        Log.d(TAG,t.toString())
                    }

                    override fun onResponse(call: Call<BestSellerDto>, response: Response<BestSellerDto>) {
                        //todo 성공처리

                        if(response.isSuccessful.not()){
                            return
                        }
                        response.body()?.let{
                            //body가 있다면 그안에는 bestSellerDto가 들어있을것
                            Log.d(TAG,it.toString())

                            it.books.forEach{ book->
                                Log.d(TAG,book.toString())
                            }
                        }
                    }

                })

    }

    companion object{
        private const val TAG="MainActivity"
    }
}

실행시 다음과 같은 결과가 나온다.

post-custom-banner

0개의 댓글