1. 개요

이 짧은 예제에서는 Spring 5 WebFlux 에서 Mono 객체의 다양한 리스너를 탐색합니다 . 우리는 doOnNext()doOnSuccess() 메서드를 비교하고 유사하지만 비어 있는 Mono 에 대해 다르게 동작한다는 것을 발견할 것 입니다.

2. 두온넥스트

MonodoOnNext() 를 사용하면 데이터가 방출될 때 트리거될 리스너를 연결할 수 있습니다. 이 문서의 코드 예제에서는 PaymentService 클래스를 사용합니다. 이 경우에는 paymentMono 가 데이터를 내보낼 때만 doOnNext()를 사용하여 processPayment 메서드 호출합니다.

@Test
void givenAPaymentMono_whenCallingServiceOnNext_thenCallServiceWithPayment() {
    Payment paymentOf100 = new Payment(100);
    Mono<Payment> paymentMono = Mono.just(paymentOf100);

    paymentMono.doOnNext(paymentService::processPayment)
        .block();

    verify(paymentService).processPayment(paymentOf100);
}

그러나 비어 있는 Mono 는 데이터를 내 보내지 않으며 doOnNext 가 트리거되지 않습니다. 결과적으로 Mono.empty() 를 사용하여 테스트를 반복 하면 processPayment 메서드가 더 이상 호출되지 않아야 합니다.

@Test
void givenAnEmptyMono_whenCallingServiceOnNext_thenDoNotCallService() {
    Mono<Payment> emptyMono = Mono.empty();

    emptyMono.doOnNext(paymentService::processPayment)
        .block();

    verify(paymentService, never()).processPayment(any());
}

3. 성공하기

doOnSuccess 를 사용 하여 Mono  가 성공적으로 완료 될 때 트리거될 리스너를 연결할 수 있습니다. 이번에 는 doOnSuccess 를 사용하여 테스트를 반복해 보겠습니다 .

@Test
void givenAPaymentMono_whenCallingServiceOnSuccess_thenCallServiceWithPayment() {
    Payment paymentOf100 = new Payment(100);
    Mono<Payment> paymentMono = Mono.just(paymentOf100);

    paymentMono.doOnSuccess(paymentService::processPayment)
        .block();

    verify(paymentService).processPayment(paymentOf100);
}

하지만 데이터가 내보내지지 않더라도 Mono 는 성공적으로 완료된 것으로 간주 된다는 점에 유의해야 합니다 . 결과적으로 빈 Mono 의 경우 위의 코드는 null Payment 로 processPayment 메서드를 호출합니다 .

Test
void givenAnEmptyMono_whenCallingServiceOnSuccess_thenCallServiceWithNull() {
    Mono<Payment> emptyMono = Mono.empty();

    emptyMono.doOnSuccess(paymentService::processPayment)
        .block();

    verify(paymentService).processPayment(null);
}

4. 결론

이 짧은 기사에서 우리는 MonodoOnNextdoOnSuccess  리스너의 차이점을 배웠습니다.  수신된 데이터에 반응 하려면 doOnNext 를 사용할 수 있음을 확인했습니다. 반면에 데이터 방출 여부에 관계없이 Mono 가 성공적으로 완료 될 때 메서드 호출이 발생하도록 하려면 doOnSuccess 를 사용해야 합니다.

항상 그렇듯이 이 기사의 코드는 GitHub 에서 찾을 수 있습니다 .

Generic footer banner