๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] Retrofit - Logging, Timeout ๊ด€๋ฆฌ (Interceptor)

interfacer_han 2024. 6. 11. 15:37

#1 ์ด์ „ ๊ธ€

 

[Android] Retrofit - ๊ธฐ์ดˆ

#1 ์ด์ „ ๊ธ€ [Android] Retrofit - ๋ฐฐ๊ฒฝ๊ณผ ๊ตฌ์กฐ#1 Restrofit์˜ ๋ฐฐ๊ฒฝ#1-1 REST API REST API (REpresentational State Transfer Application Programming Interface)#1 ๋ฌด์—‡(What)์— ๋Œ€ํ•œ API์ธ๊ฐ€?#1-1 ๊ฐœ์š”REST(REpresentational State Transfer) ๋˜๋Š”

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์˜ ์™„์„ฑ๋œ ์•ฑ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•ด์„œ, Retrofit Instance๊ฐ€ ํ†ต์‹  ๊ธฐ๋ก(Log)์„ ๋‚จ๊ธฐ๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋˜, Retrofit Instance๊ฐ€ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํ†ต์‹ ์„ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ(Timeout)๋กœ ํŒ๋‹จํ•˜๋Š” ๊ทœ์น™์„ ๋ฐ”๊ฟ”๋ณธ๋‹ค.

 

#2 Interceptor

 

Interceptors - OkHttp

Interceptors Interceptors are a powerful mechanism that can monitor, rewrite, and retry calls. Hereโ€™s a simple interceptor that logs the outgoing request and the incoming response. class LoggingInterceptor implements Interceptor { @Override public Respon

square.github.io

Retrofit์€ OkHttp ๊ธฐ๋ฐ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  OkHttp ํด๋ผ์ด์–ธํŠธ(๋ชจ๋“ˆ)์—๋Š” Interceptor๋ฅผ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด Interceptor์˜ ์—ญํ• ์€ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฐ„ Request ๋ฐ Response๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง์ด๋‹ค.

 

#3 ์ฝ”๋“œ ์ˆ˜์ •

#3-1 ๋ชจ๋“ˆ ์ˆ˜์ค€ build.gradle ์ˆ˜์ •

plugins {
    ...
}

android {
    ...
}

dependencies {

    ...

    // Retrofit
    ...

    // Coroutines
    ...

    // ViewModel, LiveData
    ...

    // OKHttp
    implementation("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.6")
}

๋ชจ๋“ˆ ์ˆ˜์ค€ build.gradle์˜ dependencies { ... }์— Interceptor๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

#3-2 RetrofitInstance.kt ์ˆ˜์ •

// package com.example.loggingandtimeoutmanagement

import com.google.gson.GsonBuilder
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

class RetrofitInstance {
    companion object {
        val BASE_URL = "https://jsonplaceholder.typicode.com/"

        val interceptor = HttpLoggingInterceptor().apply {
            this.level = HttpLoggingInterceptor.Level.BODY // ์š”์ฒญ(Request) ๋ฐ ์‘๋‹ต(Response)์˜ ๋ชจ๋“  ๋ณธ๋ฌธ(Body) ๋‚ด์šฉ์„ ๋กœ๊ทธ๋กœ ๊ธฐ๋กํ•˜๊ฒ ๋‹ค๋Š” ์„ค์ •
        }

        val client = OkHttpClient.Builder().apply {
            this.addInterceptor(interceptor)
                .connectTimeout(30, TimeUnit.SECONDS) // 30์ดˆ๊ฐ„ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ (์—ฐ๊ฒฐ์ƒํƒœ ํ™•์ธ)์„ ์‹œ๋„, 30์ดˆ ์ดˆ๊ณผ ์‹œ ํ†ต์‹  ์‹คํŒจ๋กœ ๊ฐ„์ฃผ
                .readTimeout(20, TimeUnit.SECONDS) // ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด์˜ค๋Š” ๋ฐ์ดํ„ฐ ํŒจํ‚ท(๋‹จ์œ„) ๊ฐ„ ๋„์ฐฉ ์‹œ๊ฐ„์ด 20์ดˆ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ํ†ต์‹  ์‹คํŒจ๋กœ ๊ฐ„์ฃผ (Response ๋ฐ›๊ธฐ๋ฅผ ํฌ๊ธฐ)
                .writeTimeout(25, TimeUnit.SECONDS) // ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ฃผ๋Š” ํŒจํ‚ท ๊ฐ„ ๋„์ฐฉ ์‹œ๊ฐ„์ด 25์ดˆ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ํ†ต์‹  ์‹คํŒจ๋กœ ๊ฐ„์ฃผ (Response ๋ฐ›๊ธฐ๋ฅผ ํฌ๊ธฐ)
        }.build()

        fun getRetrofitInstance(): Retrofit {
            return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
                .build()
        }
    }
}

์ด์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. ๋จผ์ €, HttpLogginInterceptor()๋กœ ์ธํ„ฐ์…‰ํ„ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€ ํ†ต์‹ (Request ๋ฐ Response)์˜ ๋ชจ๋“  ๋ณธ๋ฌธ(Body)๋ฅผ ๊ธฐ๋กํ•˜๊ฒŒ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  OkHttpClient์— ์ด ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋‹ฌ์•„์ค€๋‹ค.

 

Client์— ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋‹ค๋Š” ๊ฒƒ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ, Client์—๋Š” connectTimeout, readTimeout, writeTimeout๋„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. Timeout์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ์„œ ํ™•์ธํ•œ๋‹ค. Timeout์€ ๊ธฐ๋ณธ๊ฐ’์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉฐ, ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ธํ„ฐ๋„ท ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋А๋ ค Timeout์„ ๋„“๊ฒŒ ์žก์•„์ค„ ํ•„์š”๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ ์ ˆํžˆ ๋„“ํ˜€์ค„ ํ•„์š”๊ฐ€ ์ƒ๊ธด๋‹ค. ๋ฐ˜๋Œ€ ๊ทน๋‹จ์œผ๋กœ Timeout์„ ์•„์ฃผ ๋„“๊ฒŒ ์žก์•„๋ฒ„๋ฆฌ๋ฉด, ์‚ฌ์‹ค์ƒ ํ†ต์‹  ๋ถˆ๋Šฅ์ธ ์ƒํ™ฉ์ž„์—๋„ ์˜ค์ง€ ์•Š์„ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ๊ณ„์† ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋Œ€๊ธฐํ•˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

#4 ์ž‘๋™ ํ™•์ธ

์œ„ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๊ฐ™์ด OkHttp์˜ ํ†ต์‹  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#5 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/retrofit/LoggingAndTimeoutManagement at master ยท Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com