
- 템플릿을 만들어 분리
- ApiTemplate을 만들어서 WebApiExRateProvider 내부의 ExRate를 얻는 로직을 옮김
public class WebApiExRateProvider implements ExRateProvider {
ApiTemplate apiTemplate = new ApiTemplate();
@Override
public BigDecimal getExRate(String currency) {
String url = "<https://open.er-api.com/v6/latest/>" + currency;
return apiTemplate.getExRate(url, new SimpleApiExecutor(), new ErApiExRateExtractor());
}
}
public class ApiTemplate {
public BigDecimal getExRate(String url, ApiExecutor apiExecutor, ExRateExtractor exRateExtractor) {
URI uri;
try {
uri = new URI(url);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
String response;
try {
response = apiExecutor.execute(uri);
System.out.println(response);
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
BigDecimal exRate = exRateExtractor.extract(response);
System.out.println("API ExRate: " + exRate);
return exRate;
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
- 구현체 바꿔껴보기
- WebApiExRateProvider의 SimpleApiExecutor를 쓰던걸 새로운 ApiExecutor인 HttpClientApiExecutor로 바꿔보기
public class HttpClientApiExecutor implements ApiExecutor {
@Override
public String execute(URI uri) throws IOException {
HttpRequest request = HttpRequest.newBuilder()
.uri(uri)
.GET()
.build();
try (HttpClient client = HttpClient.newBuilder().build()) {
return client.send(request, HttpResponse.BodyHandlers.ofString()).body();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public class WebApiExRateProvider implements ExRateProvider {
ApiTemplate apiTemplate = new ApiTemplate();
@Override
public BigDecimal getExRate(String currency) {
String url = "<https://open.er-api.com/v6/latest/>" + currency;
return apiTemplate.getExRate(url, new HttpClientApiExecutor(), new ErApiExRateExtractor());
}
}