코틀린(Kotlin)/TIL

[코틀린(Kotlin)] 레트로 핏(Retrofit)

초보왕보초 2024. 1. 29. 21:59
728x90

1. 레트로핏(Retrofit) 이란?

  • Retrofit은 Square Inc. 에서 개발한 안드로이드 및 자바를 위한 타입-세이프한 HTTP 클라이언트 라이브러리이다.
  • REST API의 HTTP 요청을 자바 인터페이스로 변환하는 것을 주목적으로 한다.

 

 

2. Retrofit의 장점

  1. 코드의 간결성
    - 복잡한 HTTP API 요청을 쉽고 간결하게 만들 수 있다
    - 간단한 어노테이션을 통해 요청 메서드와 URL을 정의할 수 있다
  2.  안정성과 확장성
    - 내부적으로 OkHttp 라이브러리를 사용하여 통신, 이를 통해 안정적인 통신이 가능하다.
    - 인터셉터를 사용하여 요청/응답 프로세스를 확장하거나 수정할 수 있다.
  3. 다양한 플러그인과 컨버터 지원
    - 다양한 데이터 형식(Json, XML 등)에 대해 데이터 변환 컨버터를 제공한다
    - RxJava, Coroutines와 같은 비동기 프로그래밍 라이브러리와 연동 가능하다

 

 

3. Retrofit 시작하기

3-1. Gradle에 Retrofit 라이브러리 추가

dependencies {
	...
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0") // Gson 컨버터 추가
}

 

3-2. API 인터페이스 정의

interface NetWorkInterface {
    @GET("(요청주소)get~~~~")
    // User는 서버 응답으로 받아올 예시 데이터 모델 클래스
    suspend fun getUser(@QueryMap param: HashMap<String, String>): User
}

 

3-3. Retrofit 인스턴스 생성

private val dustRetrofit = Retrofit.Builder()
        .baseUrl("API 서비스 URL")
        .addConverterFactory(GsonConverterFactory.create())
        .client(createOkHttpClient())
        .build()
        
val apiService = retrofit.create(ApiService::class.java)

이제 apiService 객체를 통해 정의된 API 요청을 사용할 수 있다

 

 

4. 응답 처리하기

동기식 vs 비동기식 요청하기

동기식 요청
: 현재 스레드에서 실행되며, 응답이 올 때까지 다음 코드의 실행이 중단된다

val response: Response<User> = apiService.getUser(id).execute()


비동기식 요청
: 콜백을 사용하여 백그라운드에서 실행되며, 응답이 오면 해당 콜백이 호출된다

apiService.getUser(id).enqueue(object: Callback<User>{
	override fun onResponse(call: Call<User>, response: Response<User>){
    	// 처리
    }
    
    override fun onFailure(call: Call<User>, r: Throwable){
    	// 오류 처리
    }
})

 

응답 객체 사용하기

Response 객체를 통해 HTTP 응답의 여러 정보에 접근할 수 있다

if(response.isSuccessful) {
	val user: User? = response.body()
} else {
	// 오류 메시지 처리
    val error: String = response.errorBody()?.string() ?: "Unknown error"
}

 

오류 처리하기

Retrofit의 onFailure 콜백은 네트워크 오류나 데이터 변환 오류 등에서 호출된다

override fun onFailure(call: Call<User>, t: Throwable) {
	// 오류 메시지 표시
    Log.e("API_ERROR", t.message ?: "Unknown error")
}

 

728x90