일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 학점
- 유사코드
- 파이썬 소스
- dynamic query
- gradle
- 백준 알고리즘
- c#
- 프로젝트
- JVM
- 운영체제
- SQL
- 오라클
- auto configure
- 문법 정리
- smart cast
- K6
- 티스토리
- spring
- 자바 프로젝트
- 오라클 디비
- oracle
- 파이썬
- 초대장
- 리눅스
- 알고리즘
- hyperledger
- 자바
- resilience4j
- jsp
- MongoDB
Archives
- Today
- Total
모종닷컴
Reactor3's SwitchIfEmpty with lazy evaluation.. 본문
반응형
Reactor3의 switchIfEmpty 함수를 쓰면서 의도치 않은 버그를 만들게 되면서 관련 이슈 포스팅을 간단하게 하려고 합니다.
버그 코드
@Test
fun `버그 코드`() {
Mono.just("monny.tistory.com")
.doOnNext { println("doOnNext -> $it") }
.switchIfEmpty(handle())
.map {
println("map -> $it")
it.uppercase()
}
.subscribe { println("result -> $it") }
}
private fun handle(): Mono<String> {
println("handle")
return Mono.just("handle")
}
먼저 버그코드입니다. Mono에 이미 element를 가지고 있는 상태로 실행하기 때문에 switchIfEmpty는 당연히 실행이 안될 것이라고 생각했었습니다. 실제 위 코드를 실행했을 때 결과는 아래와 같습니다.
뜬금없이 handle이 실행되었다는 것을 알 수 있었습니다. 그것도 순서가 굉장히 수상합니다. 어디서 많이 본듯한 현상인데 eager evaluation 현상입니다.
Lazy Evaluation으로 바꾸자
위의 코드에 lazy evaluation을 적용하기 위해서 supplier를 제공해 주면 됩니다. reactor에 fromSupplier나 defer 등 Supplier를 이용할 수 있는 함수가 있는데 지금은 defer가 적절해 보입니다.
@Test
fun `lazy evaluation 적용`() {
Mono.just("monny.tistory.com")
.doOnNext { println("doOnNext -> $it") }
.switchIfEmpty(Mono.defer { handle() })
.map {
println("map -> $it")
it.uppercase()
}
.subscribe { println("result -> $it") }
}
이제 handle이 바로 호출이 되지 않고 실제 실행시점에 호출이 되는 것으로 바뀌었습니다. 따라서 handle 메서드는 실행이 되지 않았습니다. 아래는 element를 주지 않고 실행시켰을 때 결과입니다. handle이 제 순서에 실행되고 있습니다.
@Test
fun `lazy evaluation 적용2`() {
Mono.empty<String>()
.doOnNext { println("doOnNext -> $it") }
.switchIfEmpty(Mono.defer { handle() })
.map {
println("map -> $it")
it.uppercase()
}
.subscribe { println("result -> $it") }
}
반응형
'Programming' 카테고리의 다른 글
Git Commit 전에 스크립트를 통해 포맷 체크하기 (0) | 2023.04.23 |
---|---|
Github Action에서 Gradle Build 에러 리포트 파일 받아보기 (0) | 2023.04.16 |
Reactive Streams & Reactive Programming (0) | 2023.02.18 |
SQS 중복 수신 이슈 (0) | 2022.12.24 |
MySQL vs MongoDB Atomic Counter 비교 (0) | 2022.09.09 |