스프링부트 프로젝트를 생성하여 build.gradle에 Dependencies를 설정한다. 필요한 의존성과, webflux 의존성을 설정해준다.
Flux 반환 유형
Flux는 Reactive Streams의 Publisher를 구현한 N개 요소의 스트림을 표현하는 Reactor 클래스이다. 기본적으로 text/plain으로 응답이 반환되지만, Server-Sent Event나 JSON Stream으로 반환할 수도 있다.
Flux의 반환 유형은 클라이언트가 헤더에 응답 유형을 어떻게 설정하느냐에 따라 달라진다.
아래같은 코드가 있다고 해보자.
일반적으로 요청을 보내면 text/plain으로 반환이 온다.
Accept 헤더에 text/event-stream를 지정하면 Server-Sent Event, application/stream+json를 지정하면 JSON Stream으로 반환된다. (하지만 위 컨트롤러 코드에서는 단순 문자열을 반환했기 때문에, JSON과 plain text의 차이가 없다.)
무한 Stream
Flux 반환을 java.util.stream.Stream형으로 주는 것도 가능하다. 다음은 stream 메소드를 작성하여, 무한 Stream을 작성하고, 그 중에 10건을 Flux로 변환하여 반환해 보자.
/stream에 대한 세 가지 응답은 각각와 아래와 같다.
일반 JSON
Server-Sent Event
JSON Stream
application/json과 application/stream+json의 차이를 볼 수 있다.
만약 코드에서 limit을 붙이지 않고 코드를 아래와 같이 작성한다면 무한 Stream을 받을 수도 있다. (단 application/json의 경우에는 응답이 반환되지 않을 것이다.)
요청인자를 비동기로
요청을 받는 것 또한 비동기적으로 처리할 수 있다.
@RequestBody으로 요청 본문으로 받아 대문자로 변환하는 map의 결과 Mono를 그대로 반환하는 메소드를 추가해보자. 일반적으로 String으로 요청을 받는다면 NonBlocking으로 동기화 처리되지만, Mono에 감싸서 받으면 chain/compose로 비동기처리할 수 있게 된다.
Mono는 1개 또는 0개의 요소를 가지도록 한다.
1건만 처리해야 한다면 Mono를 사용하는 것이 명시적이지만, 여러 건수의 Stream을 처리하고 싶다면 Flux로 해야 한다.