Nuke Olaf - Log Store
레트로핏 (Retrofit) 이란? (Kotlin 으로 레트로핏 사용) 본문
1. retrofit 의 뜻
안드로이드에서 retrofit 이 무엇인지 알아보기 전에, retrofit 이라는 단어의 사전적인 의미부터 알아보자.
(1) 기존에 사용할 수 없었던 필요하다고 간주되는 새 부품이나 개조된 장비를 갖추다
(2) 이전에 제조되거나 건설된 것에 설치하다
(3) 새로운 목적이나 필요에 순응하다
" retrofit " 은 개조라는 단어로 번역할 수 있다.
기계 속에 원래 없던 부품을 새로 장착/제공한다는 의미를 갖고 있으며,
이전 시스템에 새로운 기술 또는 기능을 추가하는 것을 말한다고 한다.
https://en.wikipedia.org/wiki/Retrofitting
그렇다면 안드로이드에서의 retrofit 이란 무엇일까?
2. android 에서의 retrofit 이란?
retrofit 은 안드로이드 애플리케이션에서 통신(networking) 기능에 사용하는 코드를 사용하기 쉽게 만들어놓은 라이브러리이다. REST 기반의 웹 서비스를 통해 JSON 구조의 데이터를 쉽게 가져오고 업로드할 수 있다.
* REST 란? : https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
sqaure 에서 개발했다.
square 의 retrofit 소개 글 링크 : https://square.github.io/retrofit/
" Retrofit is a REST Client for Java and Android. It makes it relatively easy to retrieve and upload JSON (or other structured data) via a REST based webservice. In Retrofit you configure which converter is used for the data serialization. Typically for JSON you use GSon, but you can add custom converters to process XML or other protocols. Retrofit uses the OkHttp library for HTTP requests. "
" Retrofit은 Java 및 Android 용 REST 클라이언트이다. REST 기반 웹 서비스를 통해 JSON (또는 기타 구조화 된 데이터)을 검색하고 업로드하는 것이 비교적 쉽다. Retrofit에서는 데이터 직렬화에 사용되는 변환기를 구성한다. 일반적으로 JSON의 경우 GSon을 사용하지만 XML 또는 기타 프로토콜을 처리하기 위해 사용자 지정 변환기를 추가 할 수 있다. Retrofit은 HTTP 요청에 OkHttp 라이브러리를 사용한다. "
3. Retrofit 을 왜 사용할까?
Retrofit 은 안드로이드 앱에서 필요한 데이터를 서버로부터 가져오고 서버에 데이터를 전송하기 위한 코드를 작성할 때 사용하는 라이브러리이다.
즉, 개발자가 서버와 통신하기 위한 코드를 작성하기 쉽게 라이브러리로 만들어 놓았기 때문에 사용한다.
최신 개봉 영화 리스트를 보여주는 어플리케이션이 있다고 생각해보자.
어플리케이션의 로컬 저장소에 최신 개봉 영화 데이터를 저장해놓고 보여주는 방식을 사용한다면 어떻게 될까? 사용자가 어플리케이션을 업데이트 해야지만 최신 영화 데이터를 가져올 수 있을것이다. 하지만 최신 개봉 영화 데이터를 서버에 저장해놓고 필요할때마다 가져와 보여주는 방식을 사용한다면, 어플리케이션이 인터넷에 접속만 할 수 있다면 언제든지 최신 개봉 영화 데이터를 서버로부터 가져올 수 있을것이다.
초기 안드로이드에서는 서버와의 통신을 구현하기 위해 HttpClient 를 사용했다. 그러나 HttpClient 가 Android 5.1 이후로 deprecated 된 후, OkHttp 와 OkHttp 의 상위구현체인 Retrofit 이 서버 통신을 위해 사용할 수 있는 유일한 라이브러리가 되었다.
앱-서버 통신을 Okhttp 라이브러리로 AsyncTask를 사용하여 구현했다고 할 수도 있다. 하지만 AsyncTask 로 서버와 통신을 구현하는 것은 어렵고 시간이 많이 들 뿐만 아니라(비동기 처리 코드를 개발자가 하나하나 작성), AsyncTask 자체가 안드로이드에서 deprecated 되었다. 그래서 이제 AsyncTask 를 사용하여 서버 통신을 구현하는 것은 좋은 생각이 아니다.
그대신, retrofit 을 사용하는 것이 가독성도 좋고 훨씬 간편하고 쉽고, 빠르기 때문에 retrofit 을 사용한다.
4. Rdtrofit 을 사용하는 방법
Retrofit 을 사용하기 위해서는 다음의 세 가지 클래스가 필요하다
-
JSON 형태의 모델 클래스 (kotlin 에서는 data class 를 사용)
-
HTTP 작업을 정의하는(onSuccess/onFail) 인터페이스
-
Retrofit.Builder를 선언한 클래스 (baseUrl과 Converter등을 선언한다. Interceptor를 추가하여 응답을 가공할수도 있다.)
1. Retrofit 라이브러리를 Gradle 에 추가한다
implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-gson:2.7.2'
2. Manifest 파일에 인터넷 permission 을 추가한다
<uses-permission android:name="android.permission.INTERNET"/>
3. JSON 형태의 모델 클래스를 작성한다
data class ResponseDTO ( var result: String )
서버 통신시 request body 또는 response body 에서 사용할 JSON 형태의 모델 클래스를 작성하는 것이다.
Java 에서는 모델 클래스를 작성하기 위해 따로 getter, setter 등 여러 추가적인 코드를 작성해야 하지만, Kotlin 의 경우 "data class" 형태로 프로퍼티의 이름과 타입을 지정하기만 하면 된다.
data class 로 모델 클래스를 작성할 경우, 프로퍼티의 변수명은 실제 서버에서 사용하는 값과 똑같이 작성해야 한다.
앱내에서는 변수명을 다르게 사용하고 싶은 경우 @SerializedName 어노테이션을 사용하면 된다.
4. RetrofitService interface 를 작성한다
interface RetrofitService{
//post1
// 매개변수를 미리 정해두는 방식
@POST("/test")
fun postRequest(
@Field("id") id: String,
@Field("pw") pw: String
): Call<ResponseDTO>
//post2
// 호출하는 곳에서 매개변수를 HashMap 형태로 보내는 방식
@POST("/{path}")
fun testRequest(
@Path("path")path: String,
@Body parameters: HashMap<String, Any>
): Call<ResponseDTO>
}
5. Retrofit.Builder 로 Retrofit 객체를 초기화한다
val retrofit = Retrofit.Builder()
.baseUrl("https://server-url.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val server: RetrofitService = retrofit.create(RetrofitService::class.java)
baseUrl -> Api 서버의 기본 Url 주소
6. Retrofit 객체에 enqueue() 를 사용하여 서버와 통신했을때 콜백을 작성하여 사용한다.
//post1
// 매개변수를 미리 정해두는 방식
server.postRequest("userid","asd1234").enqueue(object : Callback<ResponseDTO>{
override fun onFailure(call: Call<ResponseDTO>?, t: Throwable?) {
Log.e("retrofit", t.toString())
}
override fun onResponse(call: Call<ResponseDTO>?, response: Response<ResponseDTO>?) {
Log.d("retrofit", response?.body().toString())
}
})
//post2
// 호출하는 곳에서 매개변수를 HashMap 형태로 보내는 방식
var params:HashMap<String, Any> = HashMap<String, Any>()
params.put("id", "hello")
params.put("pw", 123123)
server.testRequest("test", params).enqueue(object : Callback<ResponseDTO>{
override fun onFailure(call: Call<ResponseDTO>?, t: Throwable?) {
Log.e("Retrofit", t.toString())
}
override fun onResponse(call: Call<ResponseDTO>?, response: Response<ResponseDTO>?) {
var res: ResponseDTO? = response?.body()
Log.d("Retrofit", res?.result)
}
})
enqueue 란, Queue 에 삽입한다는 뜻이다.
Queue(대기열) 의 가장 뒤에 줄을 서는 것. Queue 는 선입선출이다.
참고 사이트>>>
Retrofit 깃헙 sample : https://github.com/HwangEunmi/Retrofit-Sample
https://medium.com/mindorks/understand-how-does-retrofit-work-c9e264131f4a
https://www.vogella.com/tutorials/Retrofit/article.html
https://velmm.com/retrofit-android-example-with-recyclerview/
'Android' 카테고리의 다른 글
[Android] 안드로이드 리사이클러뷰 무한 스크롤 - RecyclerView OnScrollListener (1) | 2020.03.25 |
---|---|
[Android] Android Keystore 보안 시스템 (0) | 2020.03.19 |
안드로이드 앱 아키텍처 가이드 (1) | 2020.03.07 |
[Android] 안드로이드 - event logging (firebase) (0) | 2020.01.19 |
[Android] 안드로이드 - 버튼을 눌렀을 때의 이벤트에 대한 고찰 (입력 이벤트) (0) | 2020.01.19 |