[Stupid Record] WebClient Error Handling

RD·2022년 11월 11일
1

Stupid Record

목록 보기
3/3

WebClient에서 Error를 Handling해보신 적이 있으신가요?
난 몰랐지 없습니다. 없었는데 생겼지 뭐.

아 거꾸로네

지금 작업중인 내 API에서는 때때로 다른 API로 요청을 보내 처리해야 하는데, 그 조건이 좀 정책적으로 모시깽한? 부분이 있다.

  1. 정보를 수정하고 반영하는 경우
    에는 그냥 다른 데서 하든 말든 수정 갈김
  2. 정보를 삭제하는 경우
    에는 쟤네 처리가 완료돼야만 진행

뭐 이런 건데, 사실 딱히 모시깽하지는 않은 것 같은데 그냥 안해봐가지고 할 때만 좀 헷갈린 듯?

아무튼 기존에 요청을 보낼 때는 이렇게 보냈다.

Response<List<Response>> response = WebClient
                .create(url)
                .get()
                .uri(uriBuilder -> uriBuilder.path("/uripath")
                        .queryParam("param", String.join(",", paramlist))
                        .build())
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .retrieve()
                .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse.bodyToMono(String.class).map(Exception::new))
                .bodyToMono(new ParameterizedTypeReference<Response<List<Response>>>() {
                })
                .block();

일부 사용하고 있는 애는 좀 편집함.

해서 요청 스테이터스에 따라서 사용자에게도 에러를 바로 내려주는 방식. 이어서 나도 별로 신경쓸 것 없고 좋았는데,

이제는 요구사항이 달라졌지? 그럼 로직이 달라지겠지? 그럼 코드가 바뀌겠지?

새삼 이제보니까 좀 혐짤이네


이거로 간다

해서 이러쿵 저러쿵 에러 처리하는 방법을 이것저것 찾아봤는데, 잘 안되다가 아무튼 되는걸 찾았지 뭐야? 이것이 정보의 바다?

해서 기록인지 공유인지 아무튼 하자면
1. 삭제해서 진행 안되는 경우 돌려보내는 케이스

webClient
                    .delete()
                    .uri("/api/manage/" + key)
                    .accept(MediaType.APPLICATION_JSON_UTF8)
                    .header("Authorization", this.login())
                    .retrieve()
                    .onStatus(HttpStatus::isError, clientResponse -> clientResponse.bodyToMono(String.class)
                            .flatMap(error ->
                                    Mono.error(ApiException.builder()
                                            .errorMessage(error)
                                            .errorCode("ERROR")
                                            .status(HttpStatus.INTERNAL_SERVER_ERROR)
                                            .build())))
                    .bodyToMono(String.class)
                    .block();

Onstatus를 통해서 기존에 핸들링 하던거랑 비슷한 방식으로 하면 잘 됨. 물론 중간에 에러 잡는 부분도 바뀌고, Mono로 까서 errorMessage도 맛깔나게 내려드렸습니다 네

그리고
2. 수정해서 진행 안돼도 내 할일 알아서 하는 케이스 내알아할게~

webClient
                   .patch()
                   .uri("/api/manage/")
                   .accept(MediaType.APPLICATION_JSON_UTF8)
                   .header("Authorization", this.login())
                   .bodyValue(UpdateRequest)
                   .retrieve()
                   .bodyToMono(String.class)
                   .onErrorResume(throwable -> {
                       log.error("ERROR");
                       return Mono.empty();
                   })
                   .block();
       }

바로바로 onErrorResume! 어라 not같애 아무튼
onErrorResume을 쓰면, 글자 읽을 줄 알면 알다시피 error가 on일 때 resume 하더라고 그냥 쿨 그자체


그것이 resume이니까.

아무튼 몇 시간 걸려서 열심히 찾았던 내용인데, 이렇게 맛깔나고 깔끔하게 처리가 잘 되더라는 말이야!

끗.

profile
놀고먹고싶어요

0개의 댓글