안녕하세요. 점냥입니다:)
이번 포스팅에서는 Android HTTP 통신 라이브러리인 Retrofit
의 기본 사용 방법에 대해서 정리하고자 합니다.
Retrofit
퀄리티가 있는 앱을 개발하려면 네트워크 통신은 빠질 수가 없는 기능입니다. 여러분은 어떤 방식으로 네트워크 통신을 구현하시나요? Java에서 기본적으로 제공해주는 HttpURLConnection
을 사용하시나요? Google에서 개발한 Volley
라이브러리를 사용하시나요?
저는 Retrofit
을 사용하는 것을 추천드립니다. Retrofit이 속도 측면에서 여러 다른 네트워크 라이브러리와 비교했을 때 가장 빠르고 효율적이다라는 자료를 쉽게 찾아보실 수 있습니다. 라이브러리를 사용하는 개발자 입장에서 네트워크 호출 시 처리해주어야 하는 보일러 플레이트 코드들을 작성하지 않아도 되고, 비교적 적은 코드로 원하는 기능을 쉽게 구현할 수 있습니다.
추가적으로 Retrofit은 여러 가지 기능을 제공해줍니다.
Converters - 앱에서 네트워크 통신의 결과는 보통 JSON으로 많이 전달받습니다. 그렇다면 클라이언트 개발자는 해당 JSON을 DTO class, VO class로 변경하는 작업을 진행해야 합니다. Retrofit은 이 과정을 코드 1~ 2줄만 추가하면 내부적으로 자동으로 수행할 수 있습니다.
Adapters - 비동기 반응형 라이브러리인 RxJava를 사용하는 경우, 네트워크 통신 결과를 Single, Mayby 등으로 포맷팅 해주는 Adapter를 제공해줍니다.
@GET("/sample/api")
fun getAPI(
@Query("query") query: String,
): Single<Result>
Retrofit 설정 방법
<manifest ...>
...
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
Retrofit은 네트워크 통신으로 따라서 INTERNET 퍼미션 권한이 필요합니다.
Android Pie 부터 https 프로토콜을 이용한 통신만 강제하고 있어서, 만약 개발하는 앱에서 http 통신 사용한다면 허용하는 것을 알아보세요.
dependencies {
...
implementation 'com.squareup.retrofit2:retrofit:[last_version]'
implementation 'com.squareup.retrofit2:converter-gson:[last_version]'
//optinal - if you using Rxjava
implementation 'com.squareup.retrofit2:adapter-rxjava2:[last_version]'
}
Retrofit 사용 방법
809회 차 로또번호를 가져오는 API로 Retrofit을 구현해보도록 하겠습니다.
[REQUEST]
http://www.nlotto.co.kr/common.do?method=getLottoNumber&drwNo=809
[RESPONSE]
{
"totSellamnt":74214104000,
"returnValue":"success",
"drwNoDate":"2018-06-02",
"firstWinamnt":2921372750,
"drwtNo6":40,
"drwtNo4":17,
"firstPrzwnerCo":6,
"drwtNo5":23,
"bnusNo":39,
"firstAccumamnt":17528236500,
"drwNo":809,
"drwtNo2":11,
"drwtNo3":15,
"drwtNo1":6
}
Retrofit은 JSON 응답 결과를 파싱 해주는 GSON를 제공하기 때문에, 파싱 된 결과를 저장할 Data Class를 만듭니다.
[LottoData]
data class LottoData (
val totSellamnt:Int,
val returnValue:String,
val drwNoDate:String,
val firstWinamnt:Int,
val drwtNo6:Int,
val drwtNo4:Int,
val firstPrzwnerCo:Int,
val drwtNo5:Int,
val bunsNo:Int,
val firstAccumamnt:Int,
val drwNo:Int,
val drwtNo2:Int,
val drwtNo3:Int,
val drwtNo1:Int,
)
ex)
추가로 만약 JSON 결과에 JSONObject가 있다면 아래와 같이 구현하면 됩니다.
[Response]
{
"test": {
"test_1":"ok",
"test_2":"x"
},
"exam": 60
}
[Data Class]
data class A(
val test:testData,
val exam:Int
)
data class testData(
val test1:String,
val test2:String
)
Retrofit Interface 생성
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Query
interface RetrofitService {
@GET("common.do")
fun requestLottoNumber(
@Query("drwNo") drwNo: Int,
@Query("method") method: String = "getLottoNumber",
): Call<Image>
}
Retrofit은 어노테이션을 통해 HTTP 통신 방법을 요청할 수 있습니다.
REST HTTP Method
@GET : 리소스 조회 및 획득
@POST: 리소스 생성
@PUT : 리소스 수정
@DELETE: 리소스 삭제
Retrofit은 URL 파라미터가 있는 경우 Query 어노테이션을 통해 값을 지정합니다.
@Query("drwNo") drwNo: Int,
@Query("method") method: String = "getLottoNumber",
https://sample.com/jum/name?
https://sample.com/nyang/name?
위처럼 주소 안의 특정 부분이 다른 경우 Path 어노테이션을 사용합니다.
@GET("{user}/name")
fun getUserName(@Path("user") userName: String): Call<Address>
Retrofit 호출
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object SearchRetrofit {
// 위에서 만든 RetrofitService를 연결해줍니다.
fun getService(): RetrofitService = retrofit.create(RetrofitService::class.java)
private val retrofit =
Retrofit.Builder()
.baseUrl("https://www.nlotto.co.kr") // 도메인 주소
.addConverterFactory(GsonConverterFactory.create()) // GSON을 사용하기 위해 ConverterFactory에 GSON 지정
.build()
}
SearchRetrofit.getService().requestLottoNumber(drwNo = 809).enqueue(object : Callback<LottoData> {
override fun onFailure(call: Call<LottoData>, t: Throwable) {}
override fun onResponse(call: Call<LottoData>, response: Response<LottoData>) {
if (response.isSuccessful) {
val image = response.body()
...
}
}
})
참고
'Android > Common' 카테고리의 다른 글
[Android] 면접에서 헷갈릴수 있는 Activity Lifecycle (0) | 2020.03.05 |
---|---|
[Android]Keybard Show/Hide 감지하기 (0) | 2020.02.12 |
[Android] RecyclerView의 최상단 최하단 감지하기 (0) | 2020.02.10 |
[Android] ripple Effect 커스텀하기 (0) | 2020.02.09 |
[Android] Android Settings.Panel 사용해보기 (0) | 2019.12.13 |