반응형
이번 포스팅에선 WebClient를 사용하다 황당한 일을 겪은 내용을 써보고자 합니다.
결론
결론부터 얘기하자면 WebClient로 호출한 api의 response body 값이 빈 값인 경우 Mono.empty()를 리턴한다.
문제
@Service
class OrderDetailService {
fun getOrderDetail(orderId: Long, userId: Long): Mono<OrderDetail> {
return Mono.zip(
getOrder(orderId),
getUser(userId)
).map {
OrderDetail.of(it.t1, it.t2)
}
}
}
fun getUser(userId: Long): Mono<User> {
return WebClient.create("USER_API")
.get()
.uri("/user/$userId")
.retrieve()
.bodyToMono(User::class.java)
}
주문 상세 정보는 user api에서 가지고 오는 유저 정보와 주문 정보를 가지고 만든다.
정상적으로 잘 돌아가고 있는 로직이었는데 어떤 특정 주문이 조회가 안 된다는 연락을 받았다.
조회가 안 되면 에러 로그라도 났어야 했는데 안 났다. ?? 뭐지
원인
테스트해보니 user api에서 어떤 이유인진 모르겠지만 response body 값을 계속 빈 값으로 내려주고 있었다.
음 빈 값을 내려주면 bodyToMono에서 에러가 났어야 했을 거 같은데 이상했다.
이상해서 이것저것 추가해서 찍어봤는데 switchIfEmpty에 딱 걸렸다.
빈값인 경우 Mono.empty()가 리턴됐던 것이었다. 황당
WebFlux는 Mono.empty()가 리턴되면 그 이후 로직은 죄다 안 탄다..
해결책
swichIfEmpty를 추가해서 에러를 리턴했다. << 일단 이건 임시방편이었다.
fun getUser(userId: Long): Mono<User> {
return WebClient.create("http://localhost:8083")
.get()
.uri("/user/$userId")
.retrieve()
.bodyToMono(User::class.java)
.switchIfEmpty { Mono.error(Exception()) } << 추가
}
사실 이게 좋은 방법은 아니다 호출하는 api에서 에러를 리턴해주는 게 맞다.
얼마있다가 바로 user api를 수정해줘서 추가한 부분을 삭제했다.
알다가도 모를 WebFlux...
반응형
'Spring' 카테고리의 다른 글
[Spring] Bean Lazy Initialization 사용법 (0) | 2023.06.18 |
---|---|
[Spring] WebClient에서 204(no content), 빈 response body 다루기 (0) | 2023.04.16 |
[Spring] Spring Boot Gradle 프로젝트를 JAR 파일로 빌드하기 (0) | 2023.02.14 |
[Spring] RestTemplate vs WebClient 어떤 걸 써야 할까? (0) | 2023.02.14 |
[Spring] Maintenance Mode란? (0) | 2023.02.14 |
댓글