안드로이드 개발 시 서버통신에 사용되는 HTTP API를 자바, 코틀린의 인터페이스 형태로 변환해 API를 쉽게 호출할 수 있도록 지원하는 라이브러리입니다.
// build.gradle (Module: app)
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson 컨버터 추가
}
// AndroidManifest.xml
<user-permission android:name="android.permission.INTERNET"/>
<application
...
// UserModel.kt (data class)
data class UserModel (
@SerializedName("first_name") // 실제 json 데이터의 키 값
var firstName: String, // 변수에 넣어줌
@SerializedName("last_name")
var lastName: String
)
val gson = Gson()
val jsonString = gson.toJson(someObject)
val myClassInstance: MyClass = gson.fromJson(jsonString, MyClass::class.java)
👀 다시 이어서
// UserListModel.kt (data class)
data class UserModel (
var data: List<UserModel>?
)
User
는 서버 응답으로 받아올 데이터 모델 클래스입니다.// ApiService.kt (interface)
interface ApiService {
@GET("api/users")
fun getUser(@Query("page") page: String): Call<UserListModel> // 콜 객체
}
apiService
객체를 통해 정의된 API 요청을 사용할 수 있습니다.// MainActivity.kt
val retrofit = Retrofit.Builder()
.baseUrl("https://reqres.in/")
.addConverterFactory(GsonConverterFactory.create())
.build()
// 인터페이스를 레트로핏에 알려줘서 객체 얻기
val apiService = retrofit.create(ApiService::class.java)
// MainActivity.kt
val response: Response<User> = apiService.getUser(id).execute()
// MainActivity.kt
// 네트워킹 객체 함수 콜하기
// enqueue 하는 순간 네트워킹 시작
apiService.getUser(page).enqueue(object: Callback<UserListModel> {
override fun onResponse(call: Call<UserListModel>, response: Response<User>) {
// 정상적으로 서버 데이터가 넘어오는 순간에 콜되는 함수 처리
val userList = response.body()
val mutableList = mutableListOf<Map<String, String>>()
userList?.data?.forEach {
val map = mapOf("firstName" to it.firstName, "lastName" to it.lastName)
mutableList.add(map)
}
val adapter = SimpleAdapter(
mutableList,
android.R.layout.simple_list_item,
arrayOf("firstName", "lastName")
intArrayOf(android.R.id.text1, android.R.id.text2)
)
listView.adapter = adapter
}
override fun onFailure(call: Call<UserListModel>, t: Throwable) {
// 서버 연동에 실패 됐을 때 콜 되는 함수란, 오류 처리
call.cancel()
}
})
결과 화면
Response
객체를 통해 HTTP 응답의 여러 정보에 접근할 수 있습니다.if (response.isSuccessful) {
val user: User? = response.body()
} else {
// 오류 메시지 처리
val error: String = response.errorBody()?.string() ?: "Unknown error"
}
onFailure
콜백은 네트워크 오류나 데이터 변환 오류 등에서 호출됩니다.override fun onFailure(call: Call<User>, t: Throwable) {
// 오류 메시지 표시
Log.e("API_ERROR", t.message ?: "Unknown error")
}
// GSON 컨버터 사용
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
// Moshi 컨버터 사용
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(MoshiConverterFactory.create())
.build()
// Moshi 컨버터 사용
val logging = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
val client = OkHttpClient.Builder()
.addInterceptor(logging)
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer YOUR_TOKEN")
.build()
chain.proceed(request)
}
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
```![](https://velog.velcdn.com/images/ouowinnie/post/8adb4683-a154-4ef3-b389-839592bb18a4/image.md)