본문 바로가기
Spring

[Spring] WebClient를 쓰기 전 반드시 알아야 하는 것

by 노력남자 2023. 4. 16.
반응형

이번 포스팅에선 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...

반응형

댓글