개발강의정리/Spring

[스프링 부트 개념과 활용] 4-12. 스프링 REST 클라이언트 2부: 커스터마이징

nineDeveloper 2019. 12. 1.
728x90

스프링 부트 개념과 활용

4. 스프링 부트 활용

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/springboot-concept-uses/tree/chap04-12-02-rest-custmizing

 

freespringlecture/springboot-concept-uses

백기선님의 스프링 부트 개념과 활용 강의 내용 정리. Contribute to freespringlecture/springboot-concept-uses development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급 프레임워크 및 라이브러리 Spring Spring Boot 온라인 강의

www.inflearn.com

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

12. 스프링 REST 클라이언트 2부: 커스터마이징

지역적으로 커스터마이징

지역적으로 선언한 WebClientbaseUrl을 설정하고 build 하고 아래쪽에서 uri 요청 시 baseUrl은 제외하고 요청

@Component
public class RestRunner implements ApplicationRunner {

    @Autowired
    WebClient.Builder builder;

    @Autowired
    RestTemplateBuilder restTemplateBuilder;

    @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") // get으로 /hello 요청
                .retrieve() // 응답값을 가져옴
                .bodyToMono(String.class);// Mono Type으로 변경

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

            if(stopWatch.isRunning()) { // stopwatch가 실행중이면 종료
                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();
        });
    }
}

생성자를 통해서 클래스안에서 공유하는 WebClient 설정법

WebClient webClient;
public RestRunner(WebClient.Builder builder) {
    this.webClient = builder.build();
}

전역적으로 커스터마이징

  • WebClientCustomizer 사용
  • baseUrl을 적용한뒤 빈으로 등록해서 전역적으로 사용
  • 모든 BuilderbaseUrl을 적용한대로 설정이되서 다른 빈들에 주입이 됨
  • WebClientCustomizerAutoConfiguration에서 만들어주는 Buildercustomizer에 기본적으로 들어옴
  • WebClientBuilder 자체를 다시 등록할 수도 있음
@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");
            }
        };
    }
}

HTTP 클라이언트 변경

RestTemplate

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

WebClient

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

Apache HttpClient로 변경 실습

RestTemplateApache HttpClient로 변경해서 사용가능

Apache HttpClient 의존성 추가

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

RestTemplate Apache HttpClient를 사용하도록 변경

  • 각각 원하는 구현체에 맞는 Adaptor형식에 RequestFactory가 있음
  • 스프링의 PSA(Potable Service Acception)가 잘 적용이 되어있음
@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());
            }
        };
    }
}
728x90

댓글

💲 추천 글