본문 바로가기
  • 개발하는 곰돌이

WebClient5

[WebClient] Spring WebClient로 HTTPS 통신하기(sun.security.provider.certpath.SunCertPathBuilderException 해결) 목차 시작하기 전에 이전에 Spring WebClient로 HTTPS를 사용하는 웹사이트에 연결을 시도할 때 SunCertPathBuilderException이 발생하는 것을 해결하기 위해 자바에서 신뢰하는 인증서 목록에 해당 서버의 인증서를 추가하는 것으로 해결하는 글을 작성한 적이 있다. 그 당시에는 WebClient를 사용하는 방법에 익숙치 않다보니 서버마다 인증서를 추출해서 신뢰하는 인증서 목록에 추가하는 비효율적인 방법을 사용했는데, 모든 환경에서 이런 복잡한 절차 없이 WebClient를 사용한 HTTPS 통신이 가능하다는 것을 알게 되어 정리하려고 한다. 주의사항 : 이 방법은 검증 없이 모든 인증서를 신뢰하게 만들기 때문에 실제 제품에서 함부로 사용하면 안된다. 아무 설정을 하지 않은 경우.. 2023. 7. 6.
[Spring] WebClient로 외부 API를 호출하여 받은 JSON을 객체로 역직렬화할 때 대문자 필드가 바인딩되지 않는 문제 문제의 배경 기존에 WebClient로 외부 API를 호출하여 받은 JSON을 Gson 라이브러리를 통해 JsonObject로 받아서 사용하고 있던 것을 좀 더 객체지향스럽게(?) 변경하기 위해 자바 객체로 받아서 처리하도록 리팩토링하는 작업을 하고 있었다. 아래는 API의 응답으로 받는 JSON과 기존에 JSON을 JsonObject로 받아서 사용하던 코드의 일부이다. { "status": "success", "error": null, "listData": [ { "CLIENT_CODE": "123456", "DATE": "2023-06-01", "AMOUNT": 12345 }, ... ] } public Mono apiResponse(Map params) { MultiValueMap formData .. 2023. 6. 29.
[WebClient] Mono에 담긴 List를 하나로 합치기 문제 상황 Spring WebClient를 통해 외부 API를 호출하는 과정에서 파라미터만 바꿔서 동일한 API를 여러 번 호출할 일이 있었다. 이 과정에서 각 API 호출 응답으로 받은 JSON을 DB에 저장하기 위해 엔티티 형태에 맞게 변경하여 엔티티의 리스트로 만들었다. 문제는 모든 API 호출을 비동기로 진행했기 때문에 실제 반환값은 엔티티의 리스트가 담긴 Mono 객체였다. 평범한 리스트였다면 그냥 List.addAll()을 통해 합칠 수 있겠지만 Mono 객체라서 불가능했다. 해결 방법 그렇게 방법을 찾던 중에 Stack Overflow에서 방법을 찾았다. Mono의 flatMapMany()와 Flux의 fromIterable()을 사용하면 Mono 객체를 Flux 객체로 변환할 수 있다. M.. 2023. 5. 14.
[WebClient] WebClient를 사용하여 외부API 호출 후 처리할 비즈니스 로직을 비동기로 처리해보기 목차 문제의 상황 프로젝트를 진행하다 보면 여러 개의 외부 API를 호출하고 그 응답을 토대로 어떤 동작을 수행하는 경우가 있다. 일반적으로 많이 사용하던 RestTemplate의 경우에는 스프링 5.0부터 사소한 변경이나 버그 수정만 반영된다고 하길래 사실상 deprecated된게 아닌가 생각한다. 마침 스프링 5.0에 새로 추가된 WebClient가 비동기 방식도 지원한다고 하여 RestTemplate 대신 사용하고 있었다. WebClient를 사용하여 외부 API를 비동기 방식으로 호출하는 예제는 찾기 쉬웠지만 정작 외부 API의 응답을 토대로 추가적인 로직을 수행하는 예제는 사실상 없다시피 했다. 그래서 비동기 방식을 지원한다는 WebClient의 특성이 무색하게 CompletableFuture를.. 2023. 4. 12.
[WebFlux] WebClient를 사용하여 외부 API를 호출할 땐 인코딩을 주의해야 한다 문제의 배경 프로젝트 진행 중에 입력값의 유효성을 검사하기 위해 외부 API를 호출할 일이 있었다. 그런데 포스트맨이나 크롬 개발자 도구에서는 문제 없이 잘 호출되는 API가 막상 WebClient를 사용한 자바 프로덕션 코드로 호출을 하려고 해보니 자꾸 등록된 키가 아니라며 400 에러를 뿜어대서 일단은 동작하게 만들기 위해 Unirest로 구현을 한 상태였다. 원인 파악 return WebClient.create() .post() .uri("외부 API url") .body(BodyInserters.fromValue(param)) .retrieve() .BodyToMono(String.class) .block(); 에러 로그에서 계속 문제가 발생한다고 했던 부분이다. 처음에는 문제될 것이 없는데 왜 .. 2023. 2. 19.