본문 바로가기
Android 개발/Retrofit, OKHttp, Moshi, RxAndroid

OKHttp 의 Application Interceptor 와 Network Interceptor

by Developer88 2017. 5. 22.
반응형

안드로이드 앱을 만들면서 네트워크 라이브러리로 무엇을 쓰시나요?

물론, 구글 개발자사이트에서 코드까지 제공해주는 Volley Library도 있긴하지만,

실제로 구글도 많이는 않쓴다고 하지요.

저와 제 주변에서는 OKHttp가 많이 쓰이는 것 같은데요.

 

오늘은 이 OKHttp를 사용하면서 쓰게되는 Interceptor라는 것에 대해서 정리해보고자 합니다.

Interceptor는 말 그대로 낚아채는 것인데요.

 

네트워크 통신을 하는 중간에, 무언가를 공통적으로 실어보내거나 받아서 써야 할때 사용합니다.

크게 두가지가 있는데, Application Interceptor와 Network Interceptor가 있습니다.

 

1. Intercept는 두번 한다.

두가지 Interceptor에 대해서 알아보기 전에, 언제 Intercept를 하는지에 대해서 정리해볼 필요가 있는데요.

square사의 wiki 사이트에 들어가보면 아래 이미지와 같은 그래픽을 볼 수 있습니다.

 

만약, OkHttp를 앱이 네트워크통신을 하기위해, 지나가는 다리라고 본다면,

이 다리를 건너오고, 건너갈때, 한 번씩 가로채기(intercept)를 행한다는 건데요.

 

애플리케이션에서 OkHttp다리로 건너갈 때는, Application Intercept를 하고,

OkHttp다리에서 네트워크로 건너갈 때는 network Intercept를 할 수 있다는 거지요.

 

어떤 Intercept를 해야하는 것은, OkHttp core를 기점으로 어느 시점에 intercept를 할 것인지에 따라 정하면 되는 것이지요.

 

 

 

 

2. NetworkInterceptor

그럼, 먼저 OkHttp에서 Network까지의 request와 response를 intercept하는 NetworkInterceptor를 보겠습니다.

여기는 OkHttp 와 Network가 상대하는 곳이므로, Network의 상태 및 서버의 값에 따라서, retry하는 등의 로직을 넣는 곳이구요.

앱의 콘텐츠와 직접적 관계가 없는 로직을 놓는 곳입니다.

 

LogInterceptor라는 리퀘스트와 리스판스의 로그를 볼수 있도록 해주는 interceptor를 만들어 볼텐데요.

클래스를 만들고, 제일먼저 해야할 것은, Interceptor interface를 implement하는 것입니다.

구현해야할 메소드는 intercept이구요,

 

intercept를 하는 대상은 request와 response이므로, 이들을 구해서 로그를 찍어보면 되는데요.

이들은 chain.request()와 chain.proceed(request)를 통해서 각각 얻을 수 있습니다.

아래와 같이 Network Interceptor를 통해서 request와 response를 intercept해보겠습니다.

 

 

 

이렇게 만든 Interceptor는 OkHttp의 builder에 메소드로 추가할 수 있는데요.

(Retrofit과 OKHttp를 같이 사용하는 환경입니다.)

아래와 같이 추가하고 앱을 실행해서, 네트워크 과업을 실행해보면, 로그를 볼 수 있습니다.

 

 

 

이번에는 클라이언트의 요청에 대해서, 서버의 response를 얻어보고,

401이 나오거나, 500이 나올경우에 대해서 간단하게 구현해보겠습니다.

 

 

3.  ApplicationInterceptor

이번에는 ApplicationInterceptor를 보도록 하겠습니다.

 

이 곳은 앱과 OkHttp core가 상대하는 곳이므로,  응답받은 콘텐츠의 내용이나 request 콘텐츠와 관련된 로직을 넣는곳인데요.

여기서는 앱에서 생성한 testID를 서버와 약속한 헤더네임으로 받을 수 있도록 Interceptor에 헤더를 붙여보겠습니다.

 

request를 intercept해서, newBuilder()라는 메소드를 가지고 빌드를 하는데요.

addHeader()라는 메소드를 통해서, 헤더를 붙여주고,

최종적으로 chain.proceed에 인자로 이 response를 주어서 return해주면 됩니다.

 

 

이제, 서버와 통신을 주고받으면서, 특정 header에 ID를 붙일 수 있게 되었습니다.

서버에서는 이제, 어떤 클라이언트가 접근했는지 알 수 있게 되는 거구요.

 

이런식으로 서버와 Header에 데이터를 주고 받을 수 있다면, 클라이언트와 서버사이에서 할 수 있는 일이 많이 늘어날 수 있을 것 같네요.

 

728x90

댓글