[트러블 슈팅] Spring MVC에서 WebFlux 기반 WebClient 사용해보기(실패...)

holyPigeon·2024년 2월 28일
0

트러블 슈팅

목록 보기
1/1
post-thumbnail

Intro

최근 개인적인 프로젝트를 진행하면서 공공 API를 통해 날씨와 대기오염정보를 받아올 일이 있었다. 이 과정에서 자바 측의 대표적인 HTTP 클라이언트 툴중 하나인 RestTemplate 대신 Spring WebFlux의 WebClient 를 사용하게 되었다.

그런데 WebClient 를 사용하여 API 요청 로직을 짜던 중 계속해서 문제가 발생하게 되어 이에 대한 해결과정 및 느낀 점에 대한 썰을 풀어보려 한다.

RestTemplate과 WebClient

보통 자바에서 API 요청을 할 때는 RestTemplate을 쓰는 것이 일반적이며 WebClient는 잘 사용하지 않는다. 그 이유로는, 물론 동기/비동기적 구조에서 오는 차이도 있지만 가장 중요한 것은 WebClient가 Spring WebFlux에서 동작하기 때문이다.

Spring WebFlux는 스프링 5.0부터 나온 반응형/비동기적 웹 어플리케이션 개발 모듈인데, 실무에서는 아직 전통적인 서블릿 기반의 Spring MVC를 주요 사용하고 있기 때문에 이에 따라 RestTemplate을 사용하고 있다.

왜 WebClient 사용을 선택했는지?

사실 그렇게 커다란 이유는 없었는데, 굳이 꼽아보자면 아래와 같은 이유가 있었다.

  • 최신 기술에 대한 로망이 있었다. 뭔가 이후에 나온 기술이니까 더 좋겠지?라는 막연한 생각이 있었다.
  • 전에 진행했던 프로젝트에서 API 요청을 할 때 WebClient를 사용했었기 때문에 해당 코드를 그대로 가져왔다.

사실 WebClient 자체가 애초에 서블릿 기반 스프링을 위한 툴이 아니어서, 혹시 충돌이 일어날 수도 있겠다고 생각하고 그 부분에 대해 미리 검색을 해보긴 했는데, 최신 기술이라 레퍼런스가 많이 없기도 했고 이전 프로젝트에서도 별 문제는 없었기 때문에 그냥 사용하기로 했다.

사실 GPT한테도 물어봤는데, Spring WebFlux를 전체 도입하는 게 아니라 WebClient만 도입하는 거면 괜찮을 거라는 답변이 있어서 비교적 안심을 하고 사용하게 됐다.

여기서 안심을 했으면 안됐다...

문제 발생

XML 처리 관련 문제 발생

그렇게 코드를 짜던 도중 에러가 발생했는데, 아래와 같은 로그가 올라왔다.

Content type 'text/xml;charset=UTF-8' not supported for bodyType=...
at ... ~[spring-webflux-6.1.3.jar:6.1.3]

text/xml not supported, webflux 와 같은 키워드들을 중심으로 해석해보았을 때, WebFlux가 사용되는 어떤 로직에서 XML 타입의 데이터를 처리하지 못하는 에러가 발생한 것으로 보였다.

근데 나 XML을 가져온 적이 없는데?

WebFlux가 사용된 곳은 API 요청 로직밖에 없었기에 그 곳을 수정하려고 했는데, 뭔가 이상했다. 나는 XML이 아닌 JSON 타입의 데이터를 요청했는데, XML을 처리할 수 없다고 말하는 로그가 이해가 가지 않았다.

가끔 파라미터를 잘못 넣으면 기본 응답 타입이 XML인 API들이 XML 응답을 보내는 경우도 있기 때문에 파라미터를 제일 먼저 체크했고, 다음으로는 HTTP 요청 헤더에 역시 미디어 타입이 JSON임을 명시했다. 하지만 문제는 해결되지 않았다.

마지막으로 공공데이터포탈로부터 도착한 것이 정말 XML 데이터가 맞을까?라는 생각에 도착한 데이터를 객체로 변환하지 않고 문자열 그대로 로그를 찍어보았는데 역시 XML이 아닌 JSON이었다.

{"statusCode":"OK","message":"Success","data":{"dateTime":"2024-02-27T20:00:00",
"sidoName":"경기","mangName":"도시대기"...}}

간헐적인 정상 작동

정말 답답했던 부분은 5번의 요청을 하면 4번 정도는 에러가 나다가도 한 번씩은 정상적으로 응답을 받을 수 있었다는 것이다. 아예 작동이 안되면 빠르게 포기하고 다른 방법을 찾았을텐데, 됐다 안됐다 하는 상황이어서 계속 코드를 건드려보다가 결국 WebClient를 버리고 RestTemplate을 사용해보기로 했다.

문제 해결

RestTemplate 도입

동일한 HTTP 요청 로직을 RestTemplate을 이용해 다시 작성하였고, 포스트맨을 통해 테스트를 해보니 마침내 JSON 응답이 정상적으로 들어왔다. 앞에서 온갖 시도를 다 해본지라, 문제가 해결된 순간 안도하면서도 WebClient에 대한 아쉬운 생각이 계속 떠올랐다.

WebClient로는 왜 실패했을까?

사실 잘 모르겠다... 처음에는 메시지 컨버터에 차이가 있을 거라 생각했는데, 나중에 찾아보니 WebClient나 RestTemplate이나 동일한 Jackson 라이브러리를 사용한다고 해서 그런 이유는 아닌 것 같았다.

정확히는 모르겠지만 간헐적으로 JSON 데이터가 잘 객체로 변환되었던 것을 생각하면, 아무래도 비동기적으로 작동하는 WebClient와 동기적으로 작동하는 Spring MVC 사이의 정체모를 충돌이 있지 않았을까...? 라는 생각이 들었다.

느낀점

신기술은 그냥 검증된 후에 사용하자

가장 크게 느낀 건 신기술이라고 아무거나 주워쓰지 말자... 라는 생각이었던 것 같다.

애초에 서블릿 기반의 스프링 위에서 WebFlux 기반의 WebClient를 사용해보겠다는 발상 자체도 충격적이었지만, 문제가 발생했는데 온갖 검색을 다 해봐도 레퍼런스가 없으니 도저히 해결할 수가 없었다.

역시 다들 오래된 기술과 버전을 사용하는 데는 이유가 있는 것 같다. 안전하고 검증되었기 때문에... 앞으로는 쓸데없는 걸로 씨름할 일 없도록 기술을 잘 골라서 사용해야할 것 같다 🤣

profile
언젠가 전설이 될 남자... 피존입니다.

0개의 댓글