[Android] Retrofit2 정리

HJTN·2023년 11월 4일
0

Android App 개발

목록 보기
4/5

Retrofit2 이미지

Retrofit이란?


Android와 서버간의 REST API 통신을 보조하는 Library로 서버로부터 xml, json, text, rss 등의 데이터를 제공받을 때 사용한다. OkHTTP을 토대로 가장 자주 쓰이는 통신 Library로 Volley, AsyncTask 등의 다른 통신 Library 존재하지만 Retrofit이 그중에서 성능이 좋다.

Retrofit 특징


1. 빠른 성능

Performance 차이
👉 Volley, AsyncTask Library에 비해 빠른 성능

2. 가독성

👉 Annotation으로 HTTP Method를 정의함으로써 특정 Code의 구현이 쉬워지고, 개발자들의 입장에서 해당 Code의 사용 목적을 직관적이고 빠르게 이해 가능

3. 유지보수성

👉 서버와 JSON, XML 등의 데이터를 주고받을 때 자동으로 Parsing해주는 Converter 연동 지원

사용 예제


1. build.gradle에 Dependencies 추가

❇️ converter-gson: JSON 데이터를 객체로 자동 Parsing해주는 Library

implementation 'com.squareup.retrofit2:retrofit:{버전 정보}'
implementation 'com.squareup.retrofit2:converter-gson:{버전 정보}'

Library 버전 정보 확인

2. AndroidManifest.xml에 네트워크 통신에 필요한 인터넷 권한 부여

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

3. DTO Class 생성

👉 서버에서 받은 JSON 데이터를 converter가 자동으로 Parsing해서 정의한 Class 내의 변수에 할당해줌

data class inform(
	val name: String,
    val age: Int,
    val birth: String,
)

4. Interface 정의

👉 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)
    }
}

Retrofit HTTP Method 참고

  1. [Android Library] Retrofit2 #2 - HTTP Method
  2. [안드로이드] Retrofit2 기본 사용법2 -'GET/POST/PUT/DELETE'
  3. [Android] Retrofit2 Multipart사용하기 (Java)

5. Retrofit 객체 생성 (예시)

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()
}

HTTP 응답 코드 참고


  1. 200 : Client의 요청을 정상적으로 수행
  2. 201 : Client의 생성 요청을 정상적으로 수행
  3. 301 : Client가 요청한 리소스에 대한 URL이 변경됨
  4. 400 : Client가 부적절한 요청함
  5. 401 : Client가 인증되지 않은 상태에서 요청함
  6. 403 : 적절하지 않은 리소스를 Client가 요청함
  7. 404 : 페이지를 찾을 수 없음
  8. 405 : Client가 요청한 리소스에서 사용할 수 없는 Method를 사용함
  9. 500 : 서버에 문제 발생
profile
Hello~

0개의 댓글