본문 바로가기
Dev/Spring Boot

[스프링 부트 개념과 활용] 스프링 REST 클라이언트 1부

by dev_jsk 2020. 9. 3.
728x90
반응형

스프링 REST 클라이언트

스프링 REST 클라이언트 관련한 직접적인 기능은 스프링 프레임워크가 제공하며 스프링 부트는 쉽게 사용 가능하도록 Bean을 등록해주는 역할을 한다.

Bean 등록 시 RestTemplate, WebClient 타입을 직접 등록하는게 아니라 해당 타입의 Builder를 등록해준다. 따라서 사용시에는 REST 클라이언트를 빌드해서 사용해야 한다.

 

RestTemplate 와 WebClient 특징

RestTemplate

WebClient

RestTemplate 와 WebClient 예제

RestTemplate

1. 의존성 추가

// pom.xml

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

2. SampleController 생성

// SampleController.java

@RestController
public class SampleController {
    @GetMapping(value="/hello")
    public String hello() throws InterruptedException {
        Thread.sleep(5000);	// 5초 대기
        return "hello";
    }
    
    @GetMapping(value="/world")
    public String world() throws InterruptedException {
        Thread.sleep(3000);	// 3초 대기
        return "world";
    }
}

3. RestRunner 생성

// RestRunner.java

@Component
public class RestRunner implements ApplicationRunner {

    @Autowired
    RestTemplateBuilder restTemplateBuilder;  // 현재 프로젝트에 spring web module이 있어서 사용가능

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

        // /hello
        String helloResult = restTemplate.getForObject("http://localhost:8080/hello", String.class);    // 해당 처리가 끝나야 다음 라인으로 넘어감
        System.out.println(helloResult);
        
        // /world
        String worldResult = restTemplate.getForObject("http://localhost:8080/world", String.class);
        System.out.println(worldResult);

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

결과 확인

RestTemplate는 동기(Synchronous) 방식으로 되어있어 hello 요청과 응답이 끝나야 world 요청과 응답이 수행되는 것을 볼 수 있다.

 

WebClient

1. 의존성 추가

// pom.xml

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

2. RestRunner 수정

// RestRunner.java

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

        Mono<String> helloMono = webClient.get().uri("http://localhost:8080/hello").retrieve().bodyToMono(String.class);
        // Non Blocking Code
        helloMono.subscribe(s -> {
            // Asynchronous Code
            System.out.println(s);

            if(stopWatch.isRunning()) {
                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();
        });

    }
}

결과 확인

WebClient는 비동기(Asynchronous) 방식으로 되어있어 hello 요청과 응답처리가 다 끝나지 않아도 world 요청을 보내며 대기시간이 적은 world 응답이 먼저 와서 수행된 것을 볼 수 있다.

728x90
반응형

댓글