티스토리 뷰
728x90
WebClient는 Spring WebFlux에서 HTTP 요청을 비동기 방식으로 처리하는 강력한 도구이다. 비동기 처리는 주로 리액티브 프로그래밍에서 사용되며, 비동기 요청을 보내고 응답을 기다리는 동안 다른 작업을 병렬로 처리할 수 있게 한다.
* 동기와 비동기/ 블럭과 넌블럭 차이 이해하기
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
동기와 비동기, 그리고 블럭과 넌블럭
무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 한 번씩은 꼭 들어보고, 또 익혔음직한 내용이겠습니다. 이름하야, 동기(Synchronous)와 비
musma.github.io
하지만 WebClient를 사용방법에 따라, 비동기 방식을 동기 방식으로 변경하여 사용할 수 있다.
WebClient 비동기 요청 기본 구조
Mono<String> result = webClient.post().uri("https://jsonplaceholder.typicode.com/posts")
.headers(httpHeaders-> httpHeaders.addAll(headers))
.bodyValue(body)
.retrieve()
.bodyToMono(String.class)
.doOnSuccess(response -> {
System.out.println("응답 성공");
System.out.println("doOnSuccess : "+response);
})
.doOnError(error -> {
System.out. println("응답 실패");
System.out.println(error.getMessage());
})
.subscribe();
subscribe() VS Block()
1. subscribe()
- subscribe()는 비동기 요청을 시작하고, 그에 대한 응답을 비동기적으로 처리할 수 있게 한다.
- 이 메서드를 호출하면, 요청은 바로 시작되고, 응답을 처리할 콜백이 등록된다.
- subscribe()를 사용하면 메인 쓰레드는 비동기 작업을 기다리지 않고, 다른 작업을 처리할 수 있다.
- 아래 예제 코드를 실행하면, 코드 실행이 종료 된 후에 result가 콘솔에 찍히는 것을 확인 할 수 있다.
public void webclient() {
System.out.println("start");
WebClient webClient = WebClient.builder().build();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type","application/json");
String body = "{\"title\": \"foo\",\"body\": \"bar\",\"userId\": 1}";
System.out.println("header : " + new Gson().toJson(headers));
System.out.println("body : " + body);
Mono<Map> result = webClient.post().uri("https://jsonplaceholder.typicode.com/posts")
.headers(httpHeaders-> httpHeaders.addAll(headers))
.bodyValue(body)
.retrieve()
.bodyToMono(Map.class);
result.subscribe(suc-> {
System.out.println("result : " + new Gson().toJson(suc));
}, error -> {
System.out.println(error.getMessage());
});
System.out.println("end");
2. block():
- block()은 비동기 작업을 동기적으로 만들어, 요청이 완료될 때까지 현재 쓰레드를 차단하고 기다린다.
- block()을 사용하면 메인 쓰레드는 응답을 받을 때까지 기다리므로, 비동기 방식의 장점을 잃게된다.
- 주로 테스트나 간단한 프로토타입에서 동기적 흐름이 필요할 때 사용됩니다.
- 아래 예제 코드를 실행하면, subscribe()를 사용했을 때와 콘솔에 찍힌 결과가 다르다는 것을 확인 할 수 있다.
public void webclient() {
System.out.println("start");
WebClient webClient = WebClient.builder().build();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type","application/json");
String body = "{\"title\": \"foo\",\"body\": \"bar\",\"userId\": 1}";
System.out.println("header : " + new Gson().toJson(headers));
System.out.println("body : " + body);
Mono<Map> resultMono = webClient.post().uri("https://jsonplaceholder.typicode.com/posts")
.headers(httpHeaders-> httpHeaders.addAll(headers))
.bodyValue(body)
.retrieve()
.bodyToMono(Map.class);
Map<String, Object> result = resultMono.doOnSuccess(suc -> System.out.println("result : " + new Gson().toJson(suc)))
.doOnError(error -> System.out.println("error : " + error.getMessage()))
.block();
System.out.println("end");
}
결론
- subscribe()는 비동기 요청을 보내고 응답을 받으면서도 메인 쓰레드를 차단않으므로 이를 통해 다른 작업을 병렬로 처리할 수 있다.
- block()은 동기적 방식으로, 요청이 완료될 때까지 현재 쓰레드를 차단하므로 비동기 처리의 장점을 활용하지 못한다.
'백엔드 > java' 카테고리의 다른 글
[java/자바] 두 메소드 간의 시간차이가 필요 할 때, Thread.sleep을 사용해야할까? (1) | 2025.02.01 |
---|---|
[java] 소켓 통신 시 데이터가 제대로 오지 않는다?! / 엔디안 / 빅엔디안 / 리틀엔디안 / ByteBuffer (1) | 2024.09.18 |
[java] null 대신 Optional 클래스 (0) | 2024.09.18 |
[java] 신뢰할 수 없는 인증서(사설인증서)를 사용 할 수 있도록 jvm 설정하기/PKIX path building failed (0) | 2024.06.10 |
[자바] 객체를 더 객체답게 사용하기 - 상속(Inheritance) (1) | 2023.12.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코테
- Linux
- mysql
- 현대코테
- centos
- springboot
- softeer java
- 스프링
- 아파치카프카
- 자바스크립트
- 현대오토에버
- 자바코테
- 현대
- 자바
- 리액트
- javascript
- Spring
- Docker
- 도커
- tomcat
- Kubernetes
- 코딩테스트
- 오토에버코테
- 전자정부프레임워크
- softeer
- react
- java
- 톰캣
- 쿠버네티스
- java 코테
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함