Android Studio

[Android] Retrofit이란?

혁준 2022. 1. 4. 17:47

 

Retrofit은 Android Studio에서 사용할 수 있는 서버와 클리이언트 간에 http 통신이 가능하게 도와주는 라이브러리입니다.

 

 

HttpClient, Volley, OKhttp와 같은 통신을 위한 다양한 라이브러리 존재하였지만, 현재 가장 많이 쓰이는 것은 Retrofit입니다. 추가적으로 Retrofit은 OKhttp는 기반으로 하여 만든 것이 Retrofit입니다. 그렇기에 Retrofit에서도 OKhttp의 method를 사용하는 것이 가능합니다!

 

 

OKhttp는 비동기작업(Async Task)이 수반되어야 합니다. 그렇지만 Retrofit은 비동기작업(Async Task) 없이 Background Thread의 실행이 가능합니다. 그 후 Callback을 통해 Main Thread에서 UI 업데이트를 합니다.

그렇기에 조회(GET), 생성(POST), 수정(PUT, PATCH), 삭제(DELETE)를 사용할 수 있습니다. 조회, 생성, 수정, 삭제 중에서 수정만 2가지 method가 있는 것을 확인할 수 있습니다. 이는 PUT, PATCH가 명확한 차이점을 갖기 때문입니다. PUT은 전체 자원(resource)에 관여하며, PATCH는 부분적인 자원(resource)만 관여합니다.

 

 

http method  기능
GET 자원(resource)의 표시를 요청합니다. (읽거나 검색)
POST 자원(resource)을 생성할 때 사용합니다.
PUT 자원(resource)의 전체 수정을 수정하는 기능을 갖습니다.
PATCH 자원(resource)의 부분만 수정하는 기능을 갖습니다.
DELETE 선택된 자원(resource)의 제거를 위해 사용됩니다.

*만약에 PATCH를 사용해야 하는 경우에 PUT을 쓴다면, 큰 혼란을 유발할 수 있기에, PUT, PATCH를 사용하는 경우에 한 번 더 확인하고 사용한다면 좋을 것 같습니다 🙂

 

이러한 Retrofit을 사용하게 된다면, 직접 구현하는 것과 비교하였을 때에 훨씬 편하게 구현을 할 수 있기 때문에 많은 사용자들이 Retrofit의 사용을 선호하고 있습니다.

 

 

 

Retrofit은 DTO(POJO), Interface, RetrofitBuilder로 구성되어 있습니다.

 

  • Retrofit.Builder : Interface를 사용할 instance. Base URL과 Converter 설정
  • Interface : 사용할 http method를 정의해둡니다. (GET, POST, PUT, PATCH, DELETE)
  • DTO (Data Transfer Object) : JSON 타입 변환이 사용되며, response로 받아오는 json을 원하느 형태의 object로 변환할 수 있게 도와주는 data class입니다. 

 


이제 retofit을 직접 사용해보려 합니다. 

 

 

1. 기본 설정

우선 retrotit을 사용하기 이전에 Android Studio를 설정해주어야 합니다. 

 

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

▲build.gradle(app)에 위의 코드를 추가해줍니다. 

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

▲Manifest에 위의 코드를 추가해줍니다.

 

 

 

2. interface 

interface BookService {
    @GET("api/search.api?output=json")
    fun getName(
        @Query("key") apiKey : String,
        @Query("query") keyword : String
    ) : Call<searchDTO>

▲ 위의 코드는 이전에 작성했던 예제입니다. interface에서 @GET 메서드를 구현하고 있습니다. 

 

 

3. DTO

data class DTO (
    @SerializedName("title") val title : String,
    @SerializedName("item") val books : String
        )

▲ DTO를 사용함으로써 계층 간의 데이터 교환을 할 수 있습니다. DTO를 통해 외부에서 넘어온 데이터 중에서 필요한 항목만 추출해서 화면에 구햔할 수 있게 됩니다. 

@SerializedName 을 사용하면, 변수명을 일치시키지 않아도 사용할 수 있습니다.

 

 

4. Retrofit 객체 생성

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

▲안드로이드의 경우 Json을 Gson으로 변환해줄 필요가 있습니다. 그렇기에 Gson Converter를 사용하여 Json을 Gson으로 바꿔주어야 합니다. 

 


val server: RetrofitService = retrofit.create(RetrofitService::class.java)

bookService.getBestSellerBooks(getString(R.string.interparkAPIKey))
            .enqueue(object : Callback<BestSellerDTO>{
                override fun onResponse(call: Call<BestSellerDTO>,
                    response: Response<BestSellerDTO>
                ){
                }
                
                override fun onFailure(call: Call<BestSellerDTO>, t: Throwable) {
                }
               }

▲ 이후에 이러한 형식으로 코드를 작성해주시면 됩니다. 

 

 

 

 

참고자료

 

https://square.github.io/retrofit/

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

 

 

https://jslee-tech.tistory.com/13

 

[Retrofit2] Retrofit2 라이브러리 - 1. 시작하기

1. Retrofit2 란? Android에서 REST API 통신을 지원하기 위한 라이브러리 Type-Safe 한 HTTP 클라이언트 라이브러리 전달받은 데이터를 Client가 필요한 형태의 객체로 전달 받을 수 있음 존재하는 HTTP 통신

jslee-tech.tistory.com

 

 

 

 

읽어주셔서 감사합니다.

 

어제 저녁을 기점으로 굉장히 날이 추워졌네요. 따듯하게 입고 다녀야겠습니다. 

 

Merry Chrismas.  🥳🎉🙏

 

++ 1월 4일 기준으로 retrofit 관련 코드들도 작성해서 업로드 하였습니다.