RestTemplate이나 WebClient를 이용하면 외부 API를 호출할 수 있는데
RestTemplate는 조만간 Deprecated된다고 하므로 WebClient를 사용할 것이다.
gradle에 implementation("org.springframework.boot:spring-boot-starter-webflux")
를 추가한다.
아래의 코드와 같이 요청에 대한 response를 받아올 수도 있고
public String signIn(UserSignInRequest userSignInRequest) {
WebClient webClient = WebClient.create(${baseURL});
int signInResponse = webClient.post()
.uri("/v1/api/auth/signin")
.body(BodyInserters.fromValue(userSignInRequest))
.exchangeToMono(
clientResponse -> Mono.just(clientResponse.statusCode().value())
).onErrorMap(
throwable -> {
throwable.printStackTrace();
return throwable;
}
).block();
}
헤더를 추가하거나 요청에 대한 response를 dto로 매핑할 수 있다.
public void getTokenGenereatedFromOtherApi() {
WebClient webClient = WebClient.create(${baseURL});
return webClient.get()
.uri("/v1/api/auth/info")
.header(HttpHeaders.AUTHORIZATION, "Bearer" + ${token})
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(UserInfoResponse.class)
.onErrorMap(
throwable -> {
throwable.printStackTrace();
return throwable;
}
).map(
userInfoResponse -> jwtTokenProvider.generateJwtToken(${userId}, ${userRole})
).block();
}
하지만 동기 방식으로 구현한 코드에 비동기 방식인 webflux를 도입하는 것이 괜찮은지는 잘 모르겠다.