개발강의정리/Spring

[스프링 부트 개념과 활용] 4-12. 스프링 REST 클라이언트 1부: RestTemplate과 WebClient

nineDeveloper 2019. 11. 30.
728x90

스프링 부트 개념과 활용

4. 스프링 부트 활용

포스팅 참조 정보

GitHub

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

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

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

https://github.com/freespringlecture/springboot-concept-uses/tree/chap04-12-01-01-rest-resttemplate

 

freespringlecture/springboot-concept-uses

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

github.com

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

 

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 클라이언트 1부: RestTemplate과 WebClient

RestTemplate

  • Blocking I/O 기반의 Synchronous API
  • RestTemplateAutoConfiguration
  • 프로젝트에 spring-web 모듈이 있다면 RestTemplate​Builder​를 빈으로 등록

https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-client-access

 

Integration

As a lightweight container, Spring is often considered an EJB replacement. We do believe that for many, if not most, applications and use cases, Spring, as a container, combined with its rich supporting functionality in the area of transactions, ORM and JD

docs.spring.io

WebClient

  • Non-Blocking I/O 기반의 Asynchronous API
  • WebClientAutoConfiguration
  • 프로젝트에 spring-webflux 모듈이 있다면 WebClient.​Builder​를 빈으로 등록

https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client

 

Web on Reactive Stack

The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for the Servlet API and Servlet containers. The reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports

docs.spring.io

RestTemplate 실습

  • spring-web 모듈이 있으면 RestTemplate를 사용할 수 있음
  • RestTemplate가 클래스패스에 있으면 RestTemplateAutoConfiguration 사용할 수 있고 RestTemplateBuilder가 빈으로 등록됨
  • RestTemplateBuilder를 주입받아서 사용하는 테스트코드

web만 의존성 추가해서 프로젝트 생성

SampleController 생성

@RestController
public class SampleController {

    @GetMapping("/hello")
    public String hello() throws InterruptedException {
        Thread.sleep(5000l);
        return "hello";
    }

    @GetMapping("/world")
    public String world() throws InterruptedException {
        Thread.sleep(3000l);
        return "world";
    }
}

RestRunner 생성

Blocking I/O 기반의 Syncronous(동기식) 방식 API 처리 테스트 8초정도 소요

@Component
public class RestRunner implements ApplicationRunner {

    @Autowired
    RestTemplateBuilder restTemplateBuilder;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        RestTemplate restTemplate = restTemplateBuilder.build();

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

        // TODO /hello
        String helloResult = restTemplate.getForObject("http://localhost:8080/hello", String.class);
        System.out.println(helloResult);

        // TODO /world
        String worldResult = restTemplate.getForObject("http://localhost:8080/world", String.class);
        System.out.println(worldResult);

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

WebClient 실습

  • WebfluxNon-Blocking I/O 기반의 Asynchronous API 처리 테스트
  • Stream APISubscribe 하기 전에는 Stream이 흐르지 않음 그냥 담아만 놓은 것과 같음
  • Subscribe로 칸막이를 열어줘야 동작함
  • 다양한 호출을 하기위해 추천함

webflux 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

RestRunner WebClient로 로직 변경

@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();

        // Stream API는 Subscribe 하기 전에는 Stream이 흐르지 않음 그냥 담아만 놓은 것 뿐임
        // 아무동작을 하지 않고 단지 Mono만 만들어 둠
        Mono<String> helloMono = webClient.get().uri("http://localhost:8080/hello") // get으로 /hello 요청
                .retrieve() // 응답값을 가져옴
                .bodyToMono(String.class);// Mono Type으로 변경

        // hello subscribe 결과값은 String
        // 비동기방식 이라 subscribe하고 Callback이 오면 로직을 수행
        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("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();
        });
    }
}
728x90

댓글

💲 추천 글