# webclient

36개의 포스트
post-thumbnail

[Test Code] WebClinet 외부 호출 API를 MockWebServer 사용해서 테스트하기

0️⃣ 서론 이전 게시글에서 'WebClient를 사용해서, 외부 API를 호출하기'라는 글을 작성했습니다. https://velog.io/@da_na/WebClient-WebClient-사용해서-외부-API-호출하기 저희 서비스는 크롤링 서버를 따로 분리했기 때문에 WebClient를 사용해서 Spring Boot(AWS EC2)가 외부 API인 크롤링 서버를 호출하는 방식으로 되어 있습니다. 따라서 아래의 WebClient 서비스 로직은 Spring Boot가 외부 API 크롤링 서버를 호출하는 로직입니다. 이전의 테스트 코드를 도입하기 전까지는 POSTMAN을 사용하여 직접 외부 서버와 통신하고 값을 확인했습니다. 따라서, 테스트가 외부 서버에 매우 의존적이었고 서버를 직접 호출하기 때문에 **테스트 시간

2023년 9월 15일
·
0개의 댓글
·
post-thumbnail

[WebClient] WebClient 사용해서 외부 API 호출하기

0️⃣ 서론 저희 서비스는 크롤링하는 서버를 EC2와 분리해서 서비스를 분리시켰기 때문에, Spring Boot(AWS EC2)에서 AWS Lambda 서버를 호출하는 형식으로 외부 API를 호출하고 있습니다. 따라서, 간략하게 AWS EC2에서 AWS Lambda를 호출하는 흐름을 아래의 그림과 같이 나타내었습니다. 그러면 Spring Boot에서는 어떻게 외부의 API를 호출시킬까요?? 저희는 WebClient라는 외부 호출 방식를 사용하였습니다. 그러면 도대체 WebClient가 무엇이길래 이거를 선택했고 어떻게 사용할지 소개해드리겠습니다. 1️⃣ 본론 1 ✔️ 외부 호출 방식 결정하기 먼저, 'Spring으로 외부 API 호출하기'라고 구글에 검색했을 때 가

2023년 9월 14일
·
0개의 댓글
·
post-thumbnail

백엔드에서 api 요청 보내기

구현을 하던 도중 카카오 맵에서 정보를 받아와야하는 상황이 생겼다. 하지만 백엔드에서 요청을 또 서버로 보낸다? 처음 겪는 것... 사실 이것 때문에 지난번에 카카오 로그인을 포기한 적이 있는데 드디어 방법 찾은듯? WebClient를 사용하자! > 아래의 예시는 카카오 맵에서 좌표를 통해 주소를 구하는 api를 받아온 것이다. > 상황에 맞게 커스텀하자. > 실제 로직상 받아온 json을 풀어서 사용하는 방법

2023년 9월 7일
·
0개의 댓글
·
post-thumbnail

해커톤 프로젝트 - WebClient 관련 내용 정리

😎 서울시 공공서비스 Open API 연결 😀 WebClientController 😀 WebClientService ⚽ 전체 코드 🖤 먼저 WebClientDTO 해당 Open API로부터 데이터를 가져오기 위해 맵핑을 해서 가져와야 하기 때문에 DTO 설정해줬다. json으로 요청 보내기 때문에 @JsonProperty를 통해 데이터를 이름 그대로 맵핑하면 된다 ! 🖤 개수 정해서 Open API 호출해서 데이터 가져오기 - json startIndex ~ endIndex까지의 데이터를 가져올 것. 🎈 .defaultHeader(HttpHeaders.CONTENTTYPE, MediaType.APPLICATIONJSON_VALUE) : Open API 서버로부터 json 형식의 데이터로 응답을 받아오겠다는 뜻. 위 부분에서 uri의 path 부분에 변수를 사용할 경우 최종 build

2023년 8월 31일
·
0개의 댓글
·
post-thumbnail

WebClient - xml

😎 xml형태 open api 호출 data.go.kr에서 인증키 발급까지 끝마친 이후 과정 대부분 인코딩된 인증키가 사용됨 ! 이제 인증키는 받았으니 데이터가 있는 xml 파일에 접속해야해 상세 사용 설명서에 나오는 내용을 토대로 활용해보자. data.go.kr의 예제가 매우 불친절하다. 그러기에 예제 코드를 통해 어떤 내용들을 필요로 하는지 확인하면서 !!! 나는 행정안전부_봉사참여정보서비스의 open api를 xml형태로 호출하고자 한다. 서비스URL:http://openapi.1365.go.kr/openapi/service/rest/VolunteerPartcptnService/getVltrSearchWordList 을 애초에 제공을 해줬다. 요청변수들 중에 어떤 값들을 활용하여 출력 값들을 뽑아낸 후 DB에 넣을 지 고민하다가 모집 종료일을 기준으로 데이터들을 뽑아내기로 했다. 우선 지금까지 WebClient 사용법은

2023년 8월 30일
·
0개의 댓글
·
post-thumbnail

WebClient 장점 및 비교

🖤 WebClient 설명 WebClient란 ? 웹으로 API를 호출하기 위해 사용되는 Http Client 모듈 중 하나. 여기서 말하는 HTTP 클라이언트라고 하는 것은 HTTP 프로토콜을 이용하여 서버와 통신하는 것을 의미하며 다른 말로는 서버에 API 요청을 보내는 주체라고도 말할 수 있다. WebClient는 non-blocking(비동기) 방식으로 응답을 기다리지 않고, 응답이 왔을 때 처리를 해주는 방식이다. 이 부분에서 RestTemplate와 차이가 난다. RestTemplate는 웹으로 API를 호출할 때 주로 사용하는 방법이였는데 Re

2023년 8월 30일
·
0개의 댓글
·
post-thumbnail

WebClient - json

😎 WebClient WebClient는 다양한 메서드 체인을 통해 웹 리소스에 접근하여 데이터를 가져오거나 전송할 수 있다. WebClient의 사용 이유에 대해서 간단히 알아보겠다. HTTP 요청 및 응답 처리 간소화: WebClient를 사용하면 HTTP 요청을 보내고 응답을 받는 과정이 간단해진다. URL을 기반으로 요청을 생성하고 데이터를 가져오거나 전송하는 작업을 더 쉽게 수행할 수 있다. 비동기 및 논블로킹 지원: Spring WebFlux와 함께 사용할 때, WebClient는 비동기 및 논블로킹 프로그래밍을 지원한다. 이는 대용량 트래픽과 병렬 처리에 유용하며, 블로킹되지 않고 다양한 요청을 동시에 처리할 수 있다. 클라이언트 커스터마이징: WebClient.Builder를 사용하여 클라이언트를 커스터마이징할 수 있습니다. 다양한 옵션을 설정하여 요청

2023년 8월 29일
·
0개의 댓글
·
post-thumbnail

뭐? RestTemplate이 Deprecate 된다고?

RestClient 교묘하게 Tag에 RestClient를 숨겼다. 개요 RestClient는 Spring 6.1 에 등장하는 HttpClient이다. Spring WebFlux의 WebClient는 Spring 5.0에 소개된 비동기, 리액티브 HttpClient인데, 이는 기존의 3.0에서 소개된 RestTemplate를 대신해왔다. 물론 WebClient는 동기 요청에 대해서도 block()메서드를 이용하여 아주 잘 처리할 수 있었다. 그렇다면 이미 잘 되어있는데 RestClient를 왜 도입하게 되는걸까? 등장 배경 선 요약하자면, 2가지 이유이다. RestTemplate가 너무 오래 됐다. WebClient는 spring-boot-starter-webflux dependency가 필요하다. 레스틀템플릿 스프링 3.0에 소개된 RestTemplate은 버젼이 단 3개 차이지만 2009년에 발표되어 햇수로 따지면

2023년 8월 9일
·
1개의 댓글
·
post-thumbnail

자바 스프링 서버에서 서버로 데이터 전송하고 받기

WebClient로 서버1에서 영상을 넘겨주고 서버2에서 영상 메타데이터를 서버1로 전송하는 코드를 작성해보겠습니다. 의존성 추가하기 WebClient를 사용하기 위해 build.gradle에 spring-boot-starter-webflux 추가해주세요. 서버1 코드 작성하기 메타데이터 클래스 작성 업로드 메소드 제작 WebClient 빌더를 통해 서버 url 추가 된 설정 만들어봅시다. url이 추가된 WebClient를 반환하여 새 항목을 만들어주면 WebClient를 사용할때 호스트와 경로 전체 대신 경로만 입력할 수 있습니다. 서버 2 코드 작성하기 메타데이터 클래스 작성하기 (서버1의 메타데이터와 동일) 메타데이터 가져오는 api 만들기 미디어 메타데이터 추출 메소드 만들기 ffprobe를 통하여 영상의 위치를 기입 후 메타데이터 추출합니다. 서버1에서 RestController 작성하기

2023년 7월 31일
·
0개의 댓글
·
post-thumbnail

WebClient 사용하기

0. 개요 공공데이터 포탈에서 데이터를 조회하고 그에 따른 데이터를 받기 위해 어떠한 방식으로 API요청을 보내고 데이터를 받는 것이 성능적인 측면에서 더 좋은 성능을 낼 수 있을지 고찰해보았다. 1. RestTemplate VS WebClient 1-1. Rest Template 란? HTTP 통신에서 사용하는 템플릿으로 HTTP 서버와의 단순한 통신을 위한 함수를 제공하는 클래스다. Spring 3.0부터 지원 RESTful 형식 지원 HTTP 요청을 수행하는 동기식(Synchronous) 클라이언트(Blocking I/O 기반) 1-2. WebClient 란? 웹에서 API를 호출하기 위해 사용하는 Http Client 모듈 중 하나로 기존의 동기식 API 방식 뿐만 아니라 Non-Blocking 및 비동기 방식을 지원한다. Spring 5.0부터 지원 Single Thread방식을 사용 Non-Blocking 방

2023년 7월 18일
·
0개의 댓글
·

[Java] Spring Boot에서 HTTP 요청 보내기

💡 RestTemplate vs WebClient >🔸 기존에 많이 사용한 RestTemplate과 WebClient의 가장 큰 차이점은 RestTemplate는 Blocking이고, WebClient는 Non-Blocking 방식이라는 것 Blocking은 호출되는 함수가 호출하는 함수에게 제어권을 넘기지 않고 대기하게 함 Non-Blocking은 제어권을 바로 넘김 >현재 RestTemplate는 Spring 5.0 이후부터 Deprecated되었고, WebClient는 앞서 설명하였듯 블로킹되지 않아 성능이 더 좋기 때문에 WebClient를 사용하는 것이 권장됨 ✅ RestTemplate : Spring에서 제공하는 HTTP Client로 REST API를 호출하기 위한 함수를 제공하는 클래스 🔸 특징 HTTP 요청 후 JSON, xml, String과 같은 응답을 받을 수 있는 템플

2023년 7월 6일
·
0개의 댓글
·
post-thumbnail

[스프링부트 핵심 가이드] chapter12. 서버 간 통신

1) RestTemplate이란 사전 지식 최근 서비스들은 MSA 주로 채택 1) MSA (마이크로 서비스 아키텍처 ) 2) 애플리케이션이 갖는 서비스(기능)가 하나의 비즈니스 범위만 갖는 형태 3) 자신의 서비스(기능) API로 노출하고 다른 서버가 이를 호출해 사용하도록 구성 3-1. 각 서버가 다른 서버의 클라이언트 되는 경우도 많음 4) 다른 서버로 웹 요청 송・수신 돕는 템플릿 : RestTemplate, WebClient 심화 : 스프링 인 액션 2장 - 통합된 스프링 학습 1. RestTemplate 스프링에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿 RESTful 원칙 따르는 서비스 생성 가능 기본적으로 동기 방식[1]으로 처리됨 지원 중

2023년 6월 27일
·
0개의 댓글
·
post-thumbnail

WebClient와 ObjectMapper 직렬/역직렬화 문제 해결하기

WebClient에서 역직렬화 문제 이번에 어플리케이션 서버에서 형태소를 분석해서 점수를 매기기 위해서 형태소 분석을 외부 API로 부터 호출하기로 했다. 문제는 WebClient로 호출할 API의 응답형태는 다음과 같았다. 이러한 형태를 받기위해 NlpToken이라는 타입을 만들었다. 그리고 이 타입을 응답으로 api를 호출하기 위해 다음과 같이 코드를 짯다. 문제는 이 코드를 실행시에 다음과 같은 오류가 발생했다. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.almondia.meca.card

2023년 6월 20일
·
0개의 댓글
·
post-thumbnail

API를 처음 접하는 사람들을 위한 가이드라인

Intro 포스팅을 시작하기에 앞서서 이번 포스팅의 주제는 "API에 대하여" 이다. 웹 개발을 시작한지 얼마 안 됐던 병아리 시절부터 API는 정말 자주 들었던 단어인데 사실 처음 접했을 때 나에게는 좀 모호하고 이해하기 힘든 개념이었다. 많은 초보 개발자들이 그 때의 나처럼 API에 대해 어려워하고 무서워할 것 같아서 이에 대한 쉽고 간단한 가이드라인을 만들어 소개하고자 한다. 아직 기술적으로 높은 수준의 이해를 한 것은 아니어서 내용이 100% 정확하지 않을 수는 있지만 그래도 초보자 입장에서 어떤 느낌인지 대충 감을 잡을 수 있게 열심히 정리해보도록 하겠다! API에 대한 소개 간단한 정의 API는 무엇의 약자일까? API는 "어플리케이션 프로그래밍 인터페이스(Application Programming Interface)"를 줄인 말이다. 개발 관련 용어는 대부분 처음 접하는 입장에서 단어만 봐서는 본래의 뜻을 알 수 없는 경우가 많은

2023년 6월 3일
·
0개의 댓글
·

[SpringBoot] RestTemplate 에서 WebClient로 속도 개선하기

Velog 통계 API로 HTTP Request를 보내는데 RestTemplate를 사용했었다. 문제는 Request를 게시글 수 만큼 보내야 한다는 것인데 이 부분이 상당히 오래걸렸다. RestTemplate는 Blocking방식이기 때문에 하나의 요청을 보내고 대기를 하게 되기 때문이었다. 메인페이지 로딩에 6초가 걸릴 순 없다 이 문제를 해결하기 위해 알아보던중 WebClient에 대해 알게 되었다. WebClient VS RestTemplate WebClient > RestTemplate를 대체하는 HTTP Client이다. > 싱글쓰레드 방식을 사용 Non-Blocking 방식을 사용 Reactor 기반으로 동작 향후 R

2023년 5월 10일
·
0개의 댓글
·

WebClient에 ProgressListner를 달 수는 없을까..?

상황 상황은 요렇다. 필자는 서버(SpringBoot) httpClient로 WebClient를 사용하고 있는데, 필자의 서버에는 파일을 받아서 마스터링해서 응답해주는 기능이 있는데, 이 과정에서 외부 API를 호출하는 코드가 여러군데 존재했다. 그 중 특정 외부 API를 호출하는 함수를 시행하는 데 시간이 평균적(100MB 기준) 으로 4 ~ 6 초가 소모된다. 파일을 넘겨주고 마스터링한 파일을 응답받는 API로 대략적인 구조는 Client => My Server => 외부 Server => My Server => Client 로 이어지는 순서였다. 프론트단은 Vue.js를 사용했다. Axios를 이용해서 나의 서버를 호출하는데, 사용자에게 직접적으로 노출되는 페이지에서의 상호작용이었고, 동기적으로 처리하기에는 시간이 너무 오래 걸리기 때문에, 대부분의 서버로직은 비동기로 이루어졌다. 비동기 로직이므로, 이 부분에서 내 서버는 프론트 사이드에게 마스터링 진행률을

2023년 5월 9일
·
0개의 댓글
·
post-thumbnail

[북스터디]스프링 부트 핵심 가이드 ch12를 공부해 보았다.(10편) ch12 서버 간 통신

ch12. 서버 간 통신 MSA(마이크로 서비스 아키텍처) 현재 개발의 트렌드는 단연 MSA다. 이전에도 설명한 적이 있는 MSA는 비즈니스를 작은 단위로 쪼개 만드는 것을 말한다. 그렇다면 지금에 이르러서 다시 이야기를 꺼낸 이유는, 앞에서도 이야기한 부분이지만, 작은 서비스들로 나누어 놓은 것이 어떻게 거대한 하나의 서비스를 이루느냐가 이번 장에서 다루어진다. 서버 간 통신을 통해, MSA는 진정한 API로서 가치를 지닌다. 그렇다면, 구체적으로 어떤 것이 있는지 알아 보자. 크게 2가지를 다룬다. RestTemplate과 WebClient다. RestTemplate RestTemplate은 스프링에서 HTTP 통신 기능을 손쉽게 사용할 수 있게 설계된 템플릿이다. HTTP 서버와의 통신을 단순화한 이 템플릿을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있다. RestTemplate은 기본적으로 동기 방식으로 처리

2023년 4월 19일
·
0개의 댓글
·

[Spring MVC+WebClient -> FastAPI] 422 UNPROCESSABLE_ENTITY

오류 발생 코드 에러 메세지 고민, 조사 422 Error code에 대해 검색을 해봤는데, FastAPI 환경에서 이 오류를 마주했다는 글을 보게 되었다. 그래서 그쪽으로 고민하기 시작했다. 문제 발생 가능성 추론 Spring 서버 쪽(Client)의 문제 or FastAPI 서버 쪽(Server)의 문제? ➡️ 4xx 오류이므로 요청하는 Spring 서버 쪽(Client)의 문제다. 그렇다면 어느 부분에서? 1) uri 부분 ❌ ➡️ 꼼꼼히 봤는데 틀린 부분이 없었음. 2) accept 부분 ❌ ➡️ 사실 처음에 뭔지 모르고 막 쓰다가 accepct 부분에 MediaType.MULTIPARTFORMDATA를 써놨었음. 근데 이건 문제가 없었음. 3) contentType 부분 ❌

2023년 4월 2일
·
0개의 댓글
·
post-thumbnail

스프링 API 비동기 논블로킹 방식 호출 (How to call API with async-nonblocking method)

RestTemplate To WebClient 도입계기 💡 외부의 대량데이터를 API를 이용하여 내부 DB에 저장해야되는 니즈가 있었다. [초기 적재에 필요한 시간 비용 측정] 콘텐츠 개수 : 98,250 이미지 개수 : 306,654 콘텐츠 목록 조회 : 1번 조회시 최대 100건 (호출 당 5초 정도 소요) → 983(98,250 / 100)번 조회 필요 983(호출수) x 5(초) = 4915초 = 약 82분 콘텐츠 상세 조회 : 98,250번 (호출 당 1초 미만) 98,250(호출수) x 1(초) = 98,250초 = 1,638분 = 약 27시간 = 약 1일 3시간소요 콘텐츠 이미지 조회 : 306,654번 (호출 당 1초 미만) 306,654(호출수) x 1(초) = 306,654초 = 5,111분 = 약 86시간 = 약 3일 14시간소요 → **총 시간 소요 : 5일정

2023년 3월 27일
·
0개의 댓글
·

Spring Boot - WebClient Proxy

어느날 갑자기 참여하고 있는 프로젝트의 Authorization 서비스에서 403 Forbidden을 응답하기 시작했다. 배포된 서비스는 DEV~PROD 스택까지 문제가 없다. Local에서만 문제가 나오고, WebClient를 통해 upstream 서비스에 접근하려고 하면 토큰을 받지 못해 아무 것도 안된다. 마침 사내 인프라쪽 문제가 있어서 프록시 서버 문제인가 했는데, 복구가 되어도 동작하지 않는다. 같은 요청을 Postman에서 프록시를 통해 보내면 된다. 아, 코드에 문제가 있다. 환경 프로젝트 환경은 다음과 같다. Java 17 Spring Boot 3.0.4 spring-webflux 6.0.6 reactor-netty-http 1.14 원인 원인은 다양 할 수 있다. 내가 제어할 수 있는 부분이 있고, 내가 제어 할 수 없는 부분이 있을 뿐. Authorization 서비스 혹은 프록시 변경 종종 프록시 서비스

2023년 3월 23일
·
0개의 댓글
·