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만 선언합니다.
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"); } }; } }
|
WebClientCustomizer를 빈으로 등록하여 baseUrl을 선언하였습니다.
람다식으로도 표현 가능합니다.
RestTemplate
RestTemplate이 기존에 사용하던 javaConnection이 아닌 Apache HttpClient로 변경해서 사용하는 방법에 대해 알아보겠습니다. RestTemplateCustomizer를 사용해 전역 커스텀을 합니다.
의존성 추가
1 2 3 4
| <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
|
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()); } }; } }
|
RestTemplateCustomizer을 빈 등록하여 커스텀합니다.
람다식으로 표현 가능합니다.