Retrofit VS Spring WebClient

WebClient를 쓸 수 있는 환경이라면 굳이 Retrofit을 쓸 이유가 없음.

 

Retrofit 사용하면서 치명적으로 불편했던 점은,

multipart || x-www-form-urlencoded 요청 시 String 타입 파라미터의 value를 알아서 escape한다는 점이다.

그래서 \n 같은 개행 문자를 보낼 수가 없다 ( \\n 가 되어 받는 쪽에서 \n이라는 문자로 인식된다... ㅡㅡ... )

이걸 비활하는 옵션도 없고...

 

반면 WebClient는 이런 문제 전혀 없음. (구조적으로도 더 짜임새 있어 보임.)

 

Android Http 통신 라이브러리의 변천사

Android 통신 라이브러리의 변천사

HttpUrlConnection이 제일 raw하다고 보면 되고,

그걸 좀 더 래핑한게 OkHttp

거기서 좀 더 래핑한게 Retrofit이라고 보면 된다.

OkHttp는 직접 jackson 사용해서 json<>object mapping해야 하는 반면

Retrofit은 interface에 타입 미리 명시해두고 gson, jackson같은 converter를 지정하여 자동으로 mapping하도록 만들 수 있다.

=> type-safe하다는 것.

보통 Retrofit을 사용하는게 무난하다.

 

Thread Safety? -- O

https://stackoverflow.com/questions/48532860/is-it-thread-safe-to-make-calls-to-okhttpclient-in-parallel

OkHttp가 thread safe하다. Retrofit도 thread safe. 재사용 가능.

medium.com/@leandromazzuquini/if-you-are-using-okhttp-you-should-know-this-61d68e065a2b

 

Retrofit

https://dev-juyoung.github.io/2017/11/10/android-retrofit-basic/

https://futurestud.io/tutorials/retrofit-synchronous-and-asynchronous-requests

synchronous requests trigger app crashes on Android 4.0 or newer. You’ll run into the `NetworkOnMainThreadException` error.

 

그래서 그냥 비동기식을 쓰고 응답이 올 때 까지 pending을 거는 식으로 사용해야 한다.

 

logging interceptor

github.com/square/okhttp/tree/master/okhttp-logging-interceptor  

charles 같은게 SSL 문제로 잘 안될 때가 있으니...

 

한 API에서 response로 수신하는 data type이 여러개 일 때

예를 들어 HttpStatus [200..300)이면 A데이터클래스, else B데이터클래스. 이라면

retrofit은 이런 경우를 대비해서 response.errorBody()는 무조건 okHttp3.ResponseBody 타입으로 고정해두었음.

 

response.errorBody().string()을 ObjectMapper에 넣고 돌려 구체적 데이터 타입으로 바꾸면 된다.

어차피 내부적으로도 json string -> object 변환하는거니 괜찮음.

retrofit.Converter를 사용하는 방법도 있는데, 그냥 jackson 써도 된다.