안드로이드에서 서버와 데이터를 주고 받을 때 HTTP 요청을 쉽게 처리하는 라이브러리가 필요하다. 이때 가장 많이 사용되는 라이브러리가 Retrofit이다.
| HttpURLConnection | Retrofit 사용 |
|---|---|
| 네트워크 요청, 응답을 직접 처리해야 함 | 인터페이스로 쉽게 API 호출 가능 |
| JSON 데이터를 직접 파싱해야함 | Gson을 이용해 자동 변환 |
| 동기/비동기 호출을 직접 구현해야 함, 콜백 | 코루틴으로 간결한 코드 작성 |
build.gradle.kts(Module) 에 아래 코드를 추가한다.
// dependencies 안에 입력
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0") // JSON 변환을 위한
Retrofit을 사용하여 API 요청을 하려면 인터넷 권한을 설정해야 한다.
AndroidManifest.xml 파일에 아래 코드를 추가한다.
<uses-permission android:name="android.permission.INTERNET"/>
Retrofit 객체를 생성한다.
API 요청을 보낼 때마다 재사용되므로 싱글톤으로 관리하는 것이 좋다.
RetrofitInstance.kt 에 아래 코드를 추가한다.
object RetrofitInstance {
private const val BASE_URL = "base url 입력"
private val client = Retrofit
.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create()) //JSON, 객체 자동 변환
.build()
fun getInstance() : Retrofit {
return client
}
}
BASE_URL -> API의 기본 URL을 설정한다.addConverterFactory(GsonConverterFactory.create()) -> JSON을 객체로 변환하기 위한 Gson 설정getInstance() -> Retrofit 객체를 반환한다.Retrofit은 인터페이스를 이용해 API 요청을 정의한다.
아래 코드는 코인 가격 데이터를 가져오는 GET 요청이다.
Api.kt 에 아래 코드를 추가한다.
interface Api {
@GET("public/ticker/ALL_KRW") //API의 엔드포인트
suspend fun getCurrentCoinList() : CurrentPriceList
}
@GET -> API의 엔드포인트를 지정한다.suspend fun getCurrentCoinList() -> 비동기 API 요청 함수(코루틴, 다음 글에서 다룰 예정)CurrentPriceList -> 서버 응답을 매핑할 데이터 모델API에서 받아오는 JSON 응답을 Kotlin 데이터 클래스로 매핑한다.
CurrentPriceList.kt 에 아래 코드를 추가한다.
data class CurrentPriceList (
val status : String,
val data : Map<String, Any>
)
-> Retrofit은 JSON 데이터를 CurrentPRiceList 객체로 자동 변환해준다. (Gson 사용)
API 요청을 처리하는 Repository 클래스이다.
ViewModel에서 API 요청을 쉽게 사용할 수 있도록 도와준다. -> 코드가 훨씬 깔끔해짐
NetWorkRepository.kt 에 아래 코드를 추가한다.
class NetWorkRepository {
private val client = RetrofitInstance.getInstance().create(Api::class.java)
//coroutine 함수로 다음 글에서 다룰 예정
suspend fun getCurrentCoinList() = client.getCurrentCoinList()
}
RetrofitInstance 에서 API 인터페이스를 가져와 생성suspend fun getCurrentCoinList() -> 코인 가격 데이터를 가져오는 함수ViewModel에서 API 데이터를 가져와 LiveData로 관리한다.
SelectViewModel.kt 에 아래 코드를 추가한다.
class SelectViewModel : ViewModel() {
private val netWorkRepository = NetWorkRepository()
private lateinit var currentPriceResultList : ArrayList<CurrentPriceResult>
// 데이터변화를 관찰 LiveData
private val _currentPriceResult = MutableLiveData<List<CurrentPriceResult>>()
val currentPriceResult : LiveData<List<CurrentPriceResult>>
get() = _currentPriceResult
fun getCurrentCoinList() = viewModelScope.launch {
val result = netWorkRepository.getCurrentCoinList()
currentPriceResultList = ArrayList()
for(coin in result.data) {
try{
val gson = Gson()
val gsonToJson = gson.toJson(result.data.get(coin.key))
val gsonFromJson = gson.fromJson(gsonToJson, CurrentPrice::class.java)
val currentPriceResult = CurrentPriceResult(coin.key, gsonFromJson)
currentPriceResultList.add(currentPriceResult)
}catch (e: java.lang.Exception){
Timber.d(e.toString())
}
}
_currentPriceResult.value = currentPriceResultList
}
}
viewModelScope.launch -> API 호출을 비동기적으로 실행한다.NetWorkRepository().getCurrentCoinList() -> API에서 코인 가격 정보를 가져온다.MutableLiveData에 결과 저장 -> UI에서 LiveData를 통해 데이터를 관찰할 수 있다.