원래 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
'자바' 카테고리의 다른 글
JEP draft: Virtual Threads 가상스레드 (0) | 2022.01.03 |
---|---|
JAVA 설계 원칙 : SOLID 이해 (0) | 2021.09.29 |
모던 자바 - Reactive Programming 리액티브 프로그래밍 - java 9 Flow (0) | 2021.08.25 |
매일 써도 잘 몰랐던 Java Map에 관한 스터디 (rehashing, 해싱, hashmap, loadfactor, doubling) (0) | 2021.08.03 |
자바 Stream (바이트기반스트림/문자열기반스트림), IO 입출력 (0) | 2021.07.02 |