스프링 웹플럭스(spring webflux)를 활용한 간단한 리액티브 마이크로 서비스
web/마이크로서비스

스프링 웹플럭스(spring webflux)를 활용한 간단한 리액티브 마이크로 서비스

반응형

자바 리액티브 프로그래밍은 리액티브 스트림 명세를 바탕으로 하고 있다.  

리액티브 스트림 명세에는 컴포넌트 사이의 비동기 스트림 처리나 이벤트 흐름을 Non Blocking 방식으로 처리하기 위한 문법을 정의한다. 

일반적인 옵저버 패턴과 달리 리액티브 스트림에는 시퀀스의 처리, 완료 알림, 실패시 backpressure 적용 등이 추가된다. backpressure는 받는 컴포넌트에서 보내는 컴포넌트에게 얼마만큼의 데이터를 소화할 수 있다고 알려줄 수 있다.  그래서 받는 컴포넌트에서 처리될 준비가 됐을 때만 데이터를 받을 수 있다. 

그래서 서로 속도가 다른 컴포넌트 사이의 통신을 할 때 유리하다. 

스프링 프레임워크 5 web flux는 Reactor 리액티브 스트림 명세를 기반으로 되어있다.  



간단한 Spring WebFlux 프로젝트

인텔리제이에서 New Project - Reactive web 선택  
Spring-boot-starter-webflux 가 web 대신 추가되어있는 것을 확인할 수 있다.

1
2
3
4
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
cs


간단한 RestController를 만들고 Mono를 응답바디로 지정해보자.

1
2
3
4
@RequestMapping("/")
public Mono<Greet> greet() {
    return Mono.just(new Greet("Hello World"));
}
cs

여기서 Body로 Mono를 반환하는데 이는 비동기 논블로킹 모드에서 Mono가 일을 마친 후에만 Greet 객체가 직렬화 된다는 것을 의미한다.

테스트 코드
RestTemplate와 비슷한 WebClient를 사용하여 간단한 web flux를 테스트해보자.


1
2
3
4
5
6
7
8
9
10
11
12
@Autowired
WebTestClient webTestClient;
 
@Test
public void contextLoads() {
    webTestClient.get().uri("/")
            .accept(MediaType.APPLICATION_JSON)
            .exchange() // response값을 가져오기 위해서 사용하는 메서드가 exchange()
            .expectStatus().isOk()
            .expectBody(Greet.class).returnResult()
            .getResponseBody().getName().equals("Hello World");
}
cs


반응형