Mono란, Reactive Streams의 Publisher 인터페이스를 구현하는 구현체이며, 0..1 개의 데이터를 처리한다.
코드
@Slf4j
public class MonoEx {
@RestController
@RequestMapping("/mono")
public static class MonoExampleController {
@GetMapping("/1")
public Mono<String> ex1() {
log.info("first");
Mono<String> mono = Mono.just("Hello WebFlux").log();
log.info("second");
return mono;
}
}
}
위 코드는 동기적으로 실행되어, 실행 결과로 first 출력 -> Mono 로그 -> second 출력을 기대했는데 실행 결과는 위와 같이 나왔다.
이유 : Mono는 Publisher로 subscribe가 되어야 실행된다. return 시 Spring에서 subscribe를 호출해주기 때문에 제일 마지막에 실행되는 것이다.
@Slf4j
public class MonoEx {
@RestController
@RequestMapping("/mono")
public static class MonoExampleController {
@GetMapping("/2")
public Mono<String> ex2() {
log.info("first");
Mono<String> mono = Mono.just(generateHello()).log();
log.info("second");
return mono;
}
}
}
Mono 객체를 생성하는 just 메서드 안의 구문은 동기적으로 바로 실행된다.
@Slf4j
public class MonoEx {
@RestController
@RequestMapping("/mono")
public static class MonoExampleController {
@GetMapping("/3")
public Mono<String> ex3() {
log.info("first");
Mono<String> mono = Mono.fromSupplier(() -> generateHello()).log();
log.info("second");
return mono;
}
}
}
fromSupplier 메서드를 사용하면 초기 데이터 생성도 Mono가 subscribe 되는 시점에 생성된다. -> 지연 생성 가능
발행 방식
Cold -> subscribe 할 때마다, 매번 새로운 데이터를 발행하고 동작하는 방식, subscribe를 하기 전에 동작하지 않는다. ->기본 방식
Hot -> subscribe 할 때마다, 새로운 데이터 발행이나 동작하지 않는 방식, subscribe를 매번 할 때마다 미리 생성해둔 데이터로 동작한다. -> subscribe와 무관하게 즉시 데이터 발행과 동작도 가능하다. -> cache() 메서드를 사용하면 된다.
* REF
https://www.youtube.com/watch?v=ScH7NZU_zvk&list=PLOLeoJ50I1kkqC4FuEztT__3xKSfR2fpw&index=9
'Reactive-Programming' 카테고리의 다른 글
[Reactor] Flux란? (0) | 2022.10.04 |
---|---|
[Spring] WebFlux란? (0) | 2022.10.02 |
[Spring] Reactive Web (4) (0) | 2022.10.01 |
[Spring] Reactive Web (3) (0) | 2022.09.30 |
[Spring] Reactive Web (2) (0) | 2022.09.27 |