Android와 서버간의 REST API 통신을 보조하는 Library로 서버로부터 xml, json, text, rss 등의 데이터를 제공받을 때 사용한다. OkHTTP을 토대로 가장 자주 쓰이는 통신 Library로 Volley, AsyncTask 등의 다른 통신 Library 존재하지만 Retrofit이 그중에서 성능이 좋다.
👉 Volley, AsyncTask Library에 비해 빠른 성능
👉 Annotation으로 HTTP Method를 정의함으로써 특정 Code의 구현이 쉬워지고, 개발자들의 입장에서 해당 Code의 사용 목적을 직관적이고 빠르게 이해 가능
👉 서버와 JSON, XML 등의 데이터를 주고받을 때 자동으로 Parsing해주는 Converter 연동 지원
❇️ converter-gson: JSON 데이터를 객체로 자동 Parsing해주는 Library
implementation 'com.squareup.retrofit2:retrofit:{버전 정보}'
implementation 'com.squareup.retrofit2:converter-gson:{버전 정보}'
<uses-permission android:name="android.permission.INTERNET" />
👉 서버에서 받은 JSON 데이터를 converter가 자동으로 Parsing해서 정의한 Class 내의 변수에 할당해줌
data class inform(
val name: String,
val age: Int,
val birth: String,
)
👉 Annotation으로 HTTP Method를 정의하고, 서버에 전송할 데이터를 추가하면 그 정보에 맞게 서버를 연동할 수 있는 Call 객체를 자동으로 생성해줌
interface custom {
@GET("v1/users")
suspend fun getUser(): UserResponse
@Multipart
@POST("v1/users")
suspend fun postUser(
@Part("createDto") user: UserDto,
@Part file: MultipartBody.Part
)
@PUT("v1/users/{userId}")
suspend fun putUser(
@Path("userId") userId: Int,
@Body userPutBody: UserPutBody
)
@DELETE("v1/users/{userId}")
suspend fun deleteUser(@Path("userId") userId: Int)
}
class RetrofitUtil {
companion object {
val userApi: UserApi = ApplicationClass.retrofit.create(UserApi::class.java)
}
}
class ApplicationClass : Application() {
companion object {
const val SERVER_URL = "서버 URL 정보"
lateinit var retrofit: Retrofit
lateinit var sharedPreferencesUtil: SharedPreferences
const val USER_INFO = "userInfo"
}
override fun onCreate() {
super.onCreate()
sharedPreferencesUtil = SharedPreferences(applicationContext)
val loggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
val okHttpClient = OkHttpClient.Builder()
.readTimeout(5000, TimeUnit.MILLISECONDS)
.connectTimeout(5000, TimeUnit.MILLISECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.addInterceptor { chain ->
val originalRequest = chain.request()
// 저장된 JWT 토큰을 가져옵니다.
val token = sharedPreferencesUtil.getAccessToken()
// JWT 토큰을 Authorization 헤더에 첨부합니다.
val requestBuilder = originalRequest.newBuilder()
.header("Authorization", "Bearer $token")
.method(originalRequest.method, originalRequest.body)
val request = requestBuilder.build()
chain.proceed(request)
}
.addInterceptor(loggingInterceptor)
.build()
retrofit = Retrofit.Builder()
.baseUrl(SERVER_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.build()
}
private val gson: Gson = GsonBuilder()
.setLenient()
.create()
}