Junjangsee's Blog

SpringBoot - RestClient 커스텀

2019-05-18

images

RestClient 커스텀

이번 주제는 저번에 다루었던 RestClient를 커스터마이징 하는 방법에 대해 공부해보려 합니다. 때문에 이전 RestClient 주제에 대한 내용에 대한 이해와 코드가 있어야 합니다. RestClient 포스팅을 참고하셔서 이번 주제를 학습하시면 됩니다.


HTTP 클라이언트

WebClient

  • 기본으로 Reactor Netty의 HTTP 클라이언트 사용
  • 커스터마이징
    • 로컬 커스터마이징
    • 글로벌 커스터마이징
      • WebClientCustomizer
      • 빈 재정의

RestTemplate

  • 기본으로 java.net.HttpURLConnection 사용
  • 커스터마이징
    • 로컬 커스터마이징
    • 글로벌 커스터마이징
      • RestTemplateCustomizer
      • 빈 재정의

WebClient

지역 커스터마이징

지역적으로 선언한 webClient에 baseUrl을 설정하고 build하고 하위 Url 요청 시 baseUrl은 제외하고 요청 할 수 있습니다.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Configuration
public class RestRunner implements ApplicationRunner {

@Autowired
WebClient.Builder builder;

@Override
public void run(ApplicationArguments args) throws Exception {
WebClient webClient = builder
.baseUrl("http://localhost:8080")
.build();

StopWatch stopWatch = new StopWatch();
stopWatch.start();

Mono<String> helloMono = webClient.get().uri("/hello")
.retrieve()
.bodyToMono(String.class);

helloMono.subscribe(s -> {
System.out.println(s);

if (stopWatch.isRunning()) {
stopWatch.stop();
}

System.out.println(stopWatch.prettyPrint());
stopWatch.start();
});

Mono<String> worldMono = webClient.get().uri("/world")
.retrieve()
.bodyToMono(String.class);

worldMono.subscribe(s -> {
System.out.println(s);

if (stopWatch.isRunning()) {
stopWatch.stop();
}

System.out.println(stopWatch.prettyPrint());
stopWatch.start();
});

}
}

builder의 기능을 사용할 때 지역적으로 baseUrl에 고정 Url을 선언하여 각각의 Url에는 고정을 제외한 해당 Url만 선언합니다.

RestClient baseUrl을 선언하고 해당되는 Url만 선언한 모습입니다.


전역 커스터마이징

WebClientCustomizer를 사용하여 전역에서 커스텀한 빈 객체를 사용할 수 있도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
public WebClientCustomizer webClientCustomizer() {
return new WebClientCustomizer() {
@Override
public void customize(WebClient.Builder webClientBuilder) {
webClientBuilder.baseUrl("http://localhost:8080");
}
};
}
}



RestClient WebClientCustomizer를 빈으로 등록하여 baseUrl을 선언하였습니다.

RestClient 람다식으로도 표현 가능합니다.


RestTemplate

RestTemplate이 기존에 사용하던 javaConnection이 아닌 Apache HttpClient로 변경해서 사용하는 방법에 대해 알아보겠습니다. RestTemplateCustomizer를 사용해 전역 커스텀을 합니다.

의존성 추가

1
2
3
4
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>

RestClient org.apache.httpcomponents의 httpclient 의존성을 추가해줍니다.


Apache HttpClient로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
public RestTemplateCustomizer restTemplateCustomizer() {
return new RestTemplateCustomizer() {
@Override
public void customize(RestTemplate restTemplate) {
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
}
};
}
}

RestClient RestTemplateCustomizer을 빈 등록하여 커스텀합니다.

RestClient 람다식으로 표현 가능합니다.