[Kotlin] Retrofit이란?

hyenni·2025년 2월 27일

Kotlin

목록 보기
1/2
post-thumbnail

안드로이드에서 서버와 데이터를 주고 받을 때 HTTP 요청을 쉽게 처리하는 라이브러리가 필요하다. 이때 가장 많이 사용되는 라이브러리가 Retrofit이다.



Retrofit 이란?

  • Square에서 개발한 안드로이드용 HTTP 클라이언트 라이브러리 이다.
  • Retrofit을 사용하면 API 요청을 쉽고 간결하게 처리할 수 있다.



Retrofit을 사용해야 하는 이유

  • 코드가 간결해짐 -> URL 요청, 응답을 쉽게 처리
  • JSON을 자동으로 객체로 변환 -> Gson과 함께 사용 가능
  • 인터페이스 기반 API 호출 -> 유지보수 및 가독성이 뛰어남
  • 비동기/동기 요청 지원 -> 다양한 방식으로 데이터 요청 가능



기존 방법과 Retrofit의 차이점

  • 기존의 HttpURLConnection이나 OKHttp를 직접 사용하면 네트워크 요청을 처리하는 코드가 길어지고 JSON 파싱도 직접 해야하는 불편함이 있다.
  • 하지만 Retrofit을 사용하면 이 과정을 자동으로 처리할 수 있다.

HttpURLConnectionRetrofit 사용
네트워크 요청, 응답을 직접 처리해야 함인터페이스로 쉽게 API 호출 가능
JSON 데이터를 직접 파싱해야함Gson을 이용해 자동 변환
동기/비동기 호출을 직접 구현해야 함, 콜백코루틴으로 간결한 코드 작성



Retrofit 사용법

1. Retrofit 라이브러리 추가

build.gradle.kts(Module) 에 아래 코드를 추가한다.

// dependencies 안에 입력
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0") // JSON 변환을 위한

2. 인터넷 권한 추가

Retrofit을 사용하여 API 요청을 하려면 인터넷 권한을 설정해야 한다.
AndroidManifest.xml 파일에 아래 코드를 추가한다.

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

3. Retrofit 인스턴스 생성

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 객체를 반환한다.

4. API 인터페이스 정의

Retrofit은 인터페이스를 이용해 API 요청을 정의한다.
아래 코드는 코인 가격 데이터를 가져오는 GET 요청이다.
Api.kt 에 아래 코드를 추가한다.

interface Api {

    @GET("public/ticker/ALL_KRW")	//API의 엔드포인트
    suspend fun getCurrentCoinList() : CurrentPriceList	
}
  • @GET -> API의 엔드포인트를 지정한다.
  • suspend fun getCurrentCoinList() -> 비동기 API 요청 함수(코루틴, 다음 글에서 다룰 예정)
  • CurrentPriceList -> 서버 응답을 매핑할 데이터 모델

5. 데이터 모델 정의

API에서 받아오는 JSON 응답을 Kotlin 데이터 클래스로 매핑한다.
CurrentPriceList.kt 에 아래 코드를 추가한다.

data class CurrentPriceList (
    val status : String,
    val data : Map<String, Any>
)
  • status -> API 응답 상태
  • data -> 코인의 가격 정보가 들어있는 Map 형태의 데이터

-> Retrofit은 JSON 데이터를 CurrentPRiceList 객체로 자동 변환해준다. (Gson 사용)


6. API 요청을 관리하는 Repository

API 요청을 처리하는 Repository 클래스이다.
ViewModel에서 API 요청을 쉽게 사용할 수 있도록 도와준다. -> 코드가 훨씬 깔끔해짐
NetWorkRepository.kt 에 아래 코드를 추가한다.

class NetWorkRepository {

    private val client = RetrofitInstance.getInstance().create(Api::class.java)

	//coroutine 함수로 다음 글에서 다룰 예정
    suspend fun getCurrentCoinList() = client.getCurrentCoinList()
}
  • client -> RetrofitInstance 에서 API 인터페이스를 가져와 생성
  • suspend fun getCurrentCoinList() -> 코인 가격 데이터를 가져오는 함수

7. ViewModel에서 API 호출

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를 통해 데이터를 관찰할 수 있다.



정리 : Retrofit을 사용하면?

  • API 요청이 훨씬 간단해진다.
  • 코드가 간결하고 유지보수하기 쉽다.
  • JSON 자동 변환으로 개발 속도가 향상된다.
  • 비동기 요청을 쉽게 처리 가능하다.





다음 편에서는 Retrofit을 코루틴과 사용하는 방법을 다루겠습니다 :)

"Kotlin | Coroutine" 글 보러가기

profile
안녕하세요

0개의 댓글