안드로이드/Network

OkHttp Interceptor in Android Kotlin

Moimeme Futur 2022. 6. 8. 09:00
반응형

개요

Interceptors란 API 통신에서 요청에 대해 monitor, rewrite 그리고 retry 할 수 있는 강력한 메커니즘이다. Interceptor를 통해서 우리는 API 통신을 만들 때, 통신 과정을 모니터링 하거나 특별한 작업을 수행할 수 있다. 쉽게 말해서, Interceptor 기능은 공항 보안 요원이 보안 검사하는 과정과 비슷하다. 그들은 먼저 탑승권을 확인하고, 승인한 다음에서야 우리가 지나갈 수 있도록 하는 것처럼 말이다.

Interceptor는 중앙에서 API 호출들을 모니터링 하는 것처럼 다양하게 사용된다. 일반적으로 우리는 각각의 network 호출에 대해 logger를 달아야 할 필요가 있다. 하지만 Interceptor를 이용한다면 하나의 logger를 추가하여 모든 network 호출에 대해 동작하도록 할 수 있다. 다른 경우로는 offline-first app의 build를 위해 network 요청의 response를 캐싱하기도 한다.

Interceptor 종류

Interceptors에는 2가지 타입이 있다.

  1. Application Interceptors: Application Code(우리가 작성한 코드)OkHttp Core Library 사이에 추가된 Interceptors.
  • 이런 Interceptor들은 addInterceptor()를 이용한다.
  1. Network Interceptor: OkHttp Core Libraryserver 사이에 추가된 Interceptors
  • 이런 Interceptor들은 addNetworkInterceptor()를 이용한다.

OkHttpClient에 interceptors 추가하기

fun devgeekHttpClient(): OkHttpClient {
    val bulder = OkHttpClient().newBuilder()
        .addInterceptor(/*my interceptor*/)
    return builder.build()
}

위에 코드를 보면 addInterceptor에 내가 만든 Interceptor를 추가할 수 있는데, 이론적인 것보다는 실제로 어떻게 Android 개발에서 Interceptor가 사용되는지 살펴보도록 하자.

Error-Interceptor

class devgeekInterceptor: Interceptor{
    override fun intercept(chain: Interceptor.Chain): Response {  
        val request = chain.request()  
        val response = chain.proceed(request)  

        when (response.code()) {  
            400 -> {  
                // Show Bad Request Error Message 
        }  
            401 -> {  
                // Show UnauthorizedError Message  
        }  
            403 -> {  
                // Show Forbidden Message  
           }  
          404 ->{
        // Show NotFound Message
        }
        // ... and so on
        }  

        return response  
    }  
}
  1. 먼저, chain.request()로부터 request를 받는다.
  2. chain.proceed()request를 담아 보내, 서버로 부터 온 response를 저장한다.
  3. proceed(request) 여기서, response code를 확인하고 원하는 동작을 수행한다.

예를 들어 401 Error(Unauthroized)를 받는다면, 로그아웃과 같은 동작을 수행하면 된다.

Adding a Header, such as an Access Token, in a central location

만약 API 통신을 구현해야 하는데 모든 API 통신에 Authorization Header를 포함해야 한다면, 각각의 API에 넣어줄 수도 있고 Interceptor를 이용할 수 있다.

class UserAuth: Interceptor{  
    override fun intercept(chain: Interceptor.Chain): Response {  
        val requestBuilder = chain.request().newBuilder()  
        var auth = ""  // get from localStorage

    requestBuilder.addHeader("Auth", auth)  
        requestBuilder.addHeader("User-Agent", "Plz-Sample-App")  

        return chain.proceed(requestBuilder.build())  
    }  
}
  1. 먼저 chain.request()로 부터 request를 받아 .newBuilder() requestBuilder를 생성한다.
  2. 다음 local storage에서 header token을 읽어온다.
  3. requestBuilderaddHeader(K, V)를 이용하여 헤더 정보를 담는다.
  4. chain.proceed()requestBuilder를 담아 요청보낸다.
👉 개발자로 취업을 준비 중이시라면,  
제가 직접 정리한 취업용 전략 전자책(PDF)도 참고해보세요.

📘 [개발자로 취업하는 법, 현실적인 모든 이야기]

이 책에는 제가 직접 취업 준비를 하며 겪은 시행착오와,  
실제 취업 후 주변 동료들에게 공유했던 실전 꿀팁이 담겨 있어요.

특히, 실무 중심의 내용을 담았습니다.

 

참고 자료

OkHttp Interceptor in Android

반응형