원래 RestTemplate을 통해 Internal API를 호출해왔었지만

RestTemplate이 Deprecated가 되어 WebClient 를 통해 API 통신을 구현하기로 하였다.

WebClient구현 과정에는 Mono Type의 Request를 생성하는 부분이 있어 이를 메소드로 분리하였고,

WebClient의 .onStatus 부분에는 중복코드가 있어 이이 부분을 TypeToken을 이용해 중복코드를 방지하기로 하였다.

 

TypeToken을 어떻게 활용하였는지 나중에 까먹지 않고 다시 사용하기 위해 아주 짧게 기록하겠다.

 

TypeToken

특정 타입의 클래스 정보를 넘겨서 타입 안전성을 꿰하도록 코드를 작성하는 기법을 TypeToken이라 한다.

 

 Mono<ResponseTemplate> monoResponse = webClient.post()
                .uri(uri)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .accept(MediaType.APPLICATION_JSON)
                .body(Mono.just(request), ResponseTemplate.class) 
                .retrieve()
                .onStatus(HttpStatus::is4xxClientError, subscribeError(request, NotAppropriateRequestException.class))
                .onStatus(HttpStatus::is5xxServerError, subscribeError(request, InternalServerException.class))
                .bodyToMono(ResponseTemplate.class);

subscribeError 가 해당 부분으로 Function을 return하도록 하였다. 

해당 메소드는 아래와 같다.

 

private <T extends RuntimeException> Function<ResponseTemplate, Mono<? extends Throwable>> subscribeError(Request request, Class<T> e) {
        return response -> {
            response.bodyToMono(ErrorResponseTemplate.class).subscribe(v -> {
                log.error("status code : {}, message : {}", v.getStatus(), v.getMessage());
            });
            throw e.cast("error : " + request.getRequestType());
        };
    }

코드 내용은 회사와 무관한 내용으로 변경함.

 

 

RuntimeException을 extend한 CustomException을 StatusCode 별로 throw하는 내용이다.

 

아래에 TypeToken과 관련된 자세한 내용이 담긴 포스팅을 기록해둔다.

https://yangbongsoo.gitbook.io/study/super_type_token

 

+ Recent posts