728x90
반응형
스프링 REST 클라이언트
스프링 REST 클라이언트 관련한 직접적인 기능은 스프링 프레임워크가 제공하며 스프링 부트는 쉽게 사용 가능하도록 Bean을 등록해주는 역할을 한다.
Bean 등록 시 RestTemplate
, WebClient
타입을 직접 등록하는게 아니라 해당 타입의 Builder
를 등록해준다. 따라서 사용시에는 REST 클라이언트를 빌드해서 사용해야 한다.
RestTemplate 와 WebClient 특징
RestTemplate
Blocking I/O
기반의Synchronous API
RestTemplateAutoConfiguration
클래스 내 자동 설정 정의- 프로젝트에
spring-web module
이 있다면RestTemplateBuilder
를 Bean으로 등록 - https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-client-access
WebClient
Non-Blocking I/O
기반의Asynchronous API
WebClientAutoConfiguration
클래스 내 자동 설정 정의- 프로젝트에
spring-webflux module
이 있다면WebClient.Builder
를 Bean으로 등록 - https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client
RestTemplate 와 WebClient 예제
RestTemplate
1. 의존성 추가
// pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. SampleController
생성
// SampleController.java
@RestController
public class SampleController {
@GetMapping(value="/hello")
public String hello() throws InterruptedException {
Thread.sleep(5000); // 5초 대기
return "hello";
}
@GetMapping(value="/world")
public String world() throws InterruptedException {
Thread.sleep(3000); // 3초 대기
return "world";
}
}
3. RestRunner
생성
// RestRunner.java
@Component
public class RestRunner implements ApplicationRunner {
@Autowired
RestTemplateBuilder restTemplateBuilder; // 현재 프로젝트에 spring web module이 있어서 사용가능
@Override
public void run(ApplicationArguments args) throws Exception {
RestTemplate restTemplate = restTemplateBuilder.build();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// /hello
String helloResult = restTemplate.getForObject("http://localhost:8080/hello", String.class); // 해당 처리가 끝나야 다음 라인으로 넘어감
System.out.println(helloResult);
// /world
String worldResult = restTemplate.getForObject("http://localhost:8080/world", String.class);
System.out.println(worldResult);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
}
}
결과 확인
RestTemplate
는 동기(Synchronous
) 방식으로 되어있어 hello
요청과 응답이 끝나야 world
요청과 응답이 수행되는 것을 볼 수 있다.
WebClient
1. 의존성 추가
// pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2. RestRunner
수정
// RestRunner.java
@Component
public class RestRunner implements ApplicationRunner {
@Autowired
WebClient.Builder builder;
@Override
public void run(ApplicationArguments args) throws Exception {
WebClient webClient = builder.build();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Mono<String> helloMono = webClient.get().uri("http://localhost:8080/hello").retrieve().bodyToMono(String.class);
// Non Blocking Code
helloMono.subscribe(s -> {
// Asynchronous Code
System.out.println(s);
if(stopWatch.isRunning()) {
stopWatch.stop();
}
System.out.println(stopWatch.prettyPrint());
stopWatch.start();
});
Mono<String> worldMono = webClient.get().uri("http://localhost:8080/world").retrieve().bodyToMono(String.class);
worldMono.subscribe(s -> {
System.out.println(s);
if(stopWatch.isRunning()) {
stopWatch.stop();
}
System.out.println(stopWatch.prettyPrint());
stopWatch.start();
});
}
}
결과 확인
WebClient
는 비동기(Asynchronous
) 방식으로 되어있어 hello
요청과 응답처리가 다 끝나지 않아도 world
요청을 보내며 대기시간이 적은 world
응답이 먼저 와서 수행된 것을 볼 수 있다.
728x90
반응형
'Dev > Spring Boot' 카테고리의 다른 글
[스프링 부트 개념과 활용] 그 밖에 다양한 기술 연동 (0) | 2020.09.03 |
---|---|
[스프링 부트 개념과 활용] 스프링 REST 클라이언트 2부 (0) | 2020.09.03 |
[스프링 부트 개념과 활용] 스프링 시큐리티 2부 (0) | 2020.08.31 |
[스프링 부트 개념과 활용] 스프링 시큐리티 1부 (0) | 2020.08.31 |
[스프링 부트 개념과 활용] 스프링 데이터 12부 (0) | 2020.08.31 |
댓글