본문 바로가기

Reactive-Programming

[Reactor] Mono란?

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