일반적인 성공시 로깅 패턴
webClient.get()
.uri("/internal/v1/videos/{vid}/meta", vid)
.retrieve()
.bodyToMono(VideoMeta::class.java)
.doOnNext { response ->
log.info("video meta fetched - vid={}, title={}", vid, response.title)
}
.block()
exchangeToMono + when 패턴
webClient.get()
.uri("/internal/v1/videos/{vid}/meta", vid)
.exchangeToMono { response ->
when (response.statusCode()) {
HttpStatus.OK -> {
response.bodyToMono(VideoMeta::class.java)
.doOnNext { log.info("success - vid={}", vid) }
}
HttpStatus.NOT_FOUND -> {
response.releaseBody() // 바디 안 쓰면 반드시 release
.then(Mono.error(VideoNotFoundException("vid=$vid")))
}
HttpStatus.UNAUTHORIZED -> {
response.releaseBody()
.then(Mono.error(UnauthorizedException("vid=$vid")))
}
else -> {
response.createException() // WebClientResponseException으로 변환
.flatMap { Mono.error(it) }
}
}
}
.block()
결론부터 말하자면 doOnSuccess 는 mono가 null 을 포함한 값 또는 빈 완료 신호를 내보낼때도 모두 호출된다. 즉 200뿐만 아니라 404not found일때도 호출됨.
onNext , onComplete 시 모두 트리거 된다.