본문 바로가기
스프링부트

Spring WebFlux 알아보기 - Mono 예제

by 플라퉁 2023. 9. 1.
728x90
반응형

 

 

 

 

안녕하세요 오늘은 Spring WebFlux에서 Mono의 쓰임새를 좀더 알아보는 시간입니다.

 

전에 WebFlux를 시작하는 글을 작성했는데 배경을 이해하시는데 도움이 될것입니다.

https://rhgustmfrh.tistory.com/90

 

Spring WebFlux 시작하기 - 리액티브 웹 애플리케이션 개발과 R2DBC 소개

안녕하세요 오늘은 Spring WebFlux에 대해 알아보겠습니다. 지금까지 Spring MVC 어플리케이션을 많이 사용해 왔는데 WebFlux는 이와 대비되는 리액티브 웹 어플리케이션으로써 비동기 통식 방식을 사용

rhgustmfrh.tistory.com

 

 

Mono를 사용한 코드 예제를 하나 작성하고 무엇이 사용되고 어떤 이유로 작성되었는지 알아보겠습니다.

 

Mono<String> getDataFromSourceA() {
    // 가정: Source A에서 비동기적으로 데이터를 가져오는 작업
    return Mono.delay(Duration.ofSeconds(2))
            .map(delay -> "Data from Source A");
}

Mono<String> getDataFromSourceB() {
    // 가정: Source B에서 비동기적으로 데이터를 가져오는 작업
    return Mono.delay(Duration.ofSeconds(3))
            .map(delay -> "Data from Source B");
}

Mono<String> fetchData(boolean condition) {
    return Mono.defer(() -> {
        if (condition) {
            return getDataFromSourceA();
        } else {
            return getDataFromSourceB();
        }
    })
    .flatMap(data -> {
        // 비동기 작업 후 결과를 변환 또는 조작
        return Mono.just("Processed Data: " + data.toUpperCase());
    });
}

 

위의 코드에서 getDataFromSourceA()와 getDataFromSourceB() 메서드는 

각각 Source A와 Source B로부터 데이터를 가져오는 비동기 작업을 나타냅니다.

fetchData(boolean condition) 메서드에서는 defer()를 사용하여 조건에 따라 

다른 데이터 소스로부터 값을 가져옵니다. 만약 condition이 

true인 경우, getDataFromSourceA()가 실행되고, 

false인 경우에는 getDataFromSourceB()가 실행됩니다.

그리고 .flatMap(data -> { ... })을 통해 이전 단계의 결과 값을 받아와서 처리하고 반환합니다. 

이 예제에서는 결과 값을 대문자로 변환하고 "Processed Data: "라는 접두사를 추가하여 반환합니다.

따라서, 위의 코드를 실행하면 조건에 따라 다른 데이터 소스로부터 값을 가져와서 처리한 후 

최종 결과인 "Processed Data: {data}"가 출력될 것입니다.

 

 

 

 

예제에서 사용한 기능들에 대해 알아보겠습니다.

 

 

 

1. Mono.delay()

 -. Mono 클래스에서 제공되는 메서드 중 하나입니다.

 

이 메서드는 지정된 시간이 경과한 후에 단일 항목을 방출하는 Mono를 생성합니다.


Mono.delay()는 비동기적인 딜레이 작업을 수행하기 위해 사용됩니다. 

 

주어진 시간 간격 동안 대기한 후에 Mono가 값을 방출하고 완료됩니다.

 

 

 

2. Mono.defer()

-. Mono 클래스에서 제공되는 메서드중 하나입니다. 

 

이 메서드는 Mono를 생성하기 위해 지연 평가(lazy evaluation)를 수행합니다. 

 

즉, 실제로 구독(subscription)이 발생할 때까지 Mono의 생성을 연기합니다. 

 

이것은 특정한 조건에 따라 동적으로 Mono를 생성하고자 할 때 유용합니다. 

 

예를 들어, 조건에 따라 다른 데이터 소스에서 값을 가져와야 할 때 사용할 수 있습니다.

 

 

 

3. Mono.just()

-. Mono 클래스에서 제공되는 메서드중 하나입니다.

 

이 메서드는 주어진 값을 가지고 바로 Mono를 생성합니다. 

 

즉, 값이 이미 결정되어 있거나 상수 값을 사용해야 할 때 유용합니다.

 

 

 

4. .flatMap()

-. Mono.just() 메서드는 Mono를 생성하고 해당 Mono에 값을 포함시킵니다. 

 

그러나 때로는 이 단일 값에 대해 추가적인 비동기 작업을 수행하고 결과를 변환 또는 조작해야 할 수 있습니다. 

 

이때 flatMap() 메서드가 유용합니다.

flatMap()은 리액티브 스트림에서 값을 변환하거나 다른 비동기 작업을 수행하기 위해 사용됩니다. 

 

flatMap()은 반환된 Mono 또는 Flux의 값을 펼쳐서 새로운 Mono 또는 Flux로 변환합니다.

예를 들어, Mono.just()으로 생성된 단일 값에 대해 데이터베이스 조회나 외부 API 호출과 같은 

 

비동기 작업을 실행하고 그 결과를 처리하려면 flatMap()을 사용할 수 있습니다. 

 

이렇게 함으로써 원래의 단일 값과 비동기 작업의 결과를 조합하여 새로운 Mono 또는 Flux를 생성할 수 있습니다.

 

 

 

감사합니다.

 

 

 

 

728x90
반응형

댓글