ABOUT ME

-

오늘
-
어제
-
-
  • SpringBoot - RestClient 커스텀
    Back-end/Spring 2020. 6. 28. 00:14

    RestClient 커스텀

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

    HTTP 클라이언트

    WebClient

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

    RestTemplate

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

    WebClient

    지역 커스터마이징

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

    @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를 사용하여 전역에서 커스텀한 빈 객체를 사용할 수 있도록 합니다.

    @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를 사용해 전역 커스텀을 합니다.

    의존성 추가

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>

     

    RestClient

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

    Apache HttpClient로 변경

    @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

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

    'Back-end > Spring' 카테고리의 다른 글

    SpringBoot - Actuator JMX, HTTP  (0) 2020.06.28
    SpringBoot - Actuator의 개념  (0) 2020.06.28
    SpringBoot - RestClient  (0) 2020.06.28
    SpringBoot - Security 커스터마이징  (0) 2020.06.28
    SpringBoot - Security의 개념과 테스트  (0) 2020.06.28

    댓글