Mono Void와 then()의 사용
Contents
deleteMapping으로 리소스를 삭제하는 API들은 .then()
을 사용해서 Mono<Void>
를 반환한다.
Mono<Void>
는 뭐고, 왜 사용할까?
Mono<Void>
https://stackoverflow.com/questions/59196530/why-reactor-monovoid-is-recognized-as-an-empty-mono
reactive 스택에서는 null을 반환하는 것을 금지하고 있다. Mono는 완료 신호를 보내기 전에 아무것도 반환하지 않거나, 하나의 값만을 반환하도록 명세되어 있다.
따라서 Mono<Foo>
는 두 가지 옵션이 있다.
- 완료 신호를 보내거나
Foo
인스턴스를 보낸 후에 완료 신호를 보내거나
인스턴스를 보내지 않는 경우 (값이 publish 되지 않는 경우)에는 크게 두 가지 경우가 존재한다.
- 값이 존재하지 않는 경우
- 이 경우에는 데이터베이스나 컬렉션에서 탐색을 한 후 존재하지 않는 경우이다.
- 이 때에도
Mono<SomeType>
을 사용할 수 있으며, 이경우에는SomeType
인스턴스를 반환할 수도 있고 아닐 수 도 있다.
- 값이 절대로 publish 되지 않는 경우
- 작업이 완료되었음을 알려주기 위한 경우에 자주 사용된다.
- 이 경우에는
Mono<Void>
를 관례 상 많이 사용한다.
Void
는 절대로 인스턴스화 될 수 없도록 디자인된 클래스이다.
Void
인스턴스는 존재할 수 없기 때문에 Mono<Void>
는 인스턴스를 반환하는 것이 아니라 완료 신호만을 보내는데 사용된다.
then() operator
then~ 이 붙은 operator들의 공통점으로는
- onNext() 신호를 무시한다.
- 완료 신호에 따른 reaction 들 (onComplete나 onError) 도 무시한다.
- 대신 그 시점에 여러 옵션들을 가지고 시퀀스를 유지시킨다.
- then() 연산자는 단지 source의 종료 신호를 재생하고
Mono<Void>
를 반환해서 onNext를 절대로 신호하지 않는다는 것을 나타낸다. (작업이 완료되었으므로) - thenEmpty() 연산자는
Mono<Void>
를 리턴하는 것 뿐만 아니라Mono<Void>
를 파라미터로 입력 받는다. thenEmpty()는 source의 완료 신호와, 빈 Mono 완료 신호를 연결한 (concatenation) 결과를 나타낸다.- 즉 A와 B가 전부 순차적으로 완료되었을 때 완료되며, 아무런 데이터도 반환하지 않는다.
- thenMany() 연산자는 source의 완료를 기다리고,
Publisher<R>
파라미터로 받은 신호들을 전부 재생하여,Flux<R>
을 반환한다. 이 Flux는 source가 완료될 때까지 일시정지하고, 완료된 이후에는 제공된 publisher로부터 다수의 element들을 반환하고 완료 신호를 준다.