구성정보를 가져오는 다른 방법
2024. 7. 3. 11:33ㆍ토비의 스프링 6
PaymentService
package tobyspring.hellospring;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Component
public class PaymentService {
private final ExRateProvider exRateProvider;
public PaymentService(ExRateProvider exRateProvider) {
this.exRateProvider = exRateProvider;
}
public Payment prepare(Long orderId, String currency, BigDecimal foreignCurrencyAmount) throws IOException {
BigDecimal exRate = exRateProvider.getExRate(currency);
BigDecimal convertedAmount = foreignCurrencyAmount.multiply(exRate); // * 사용안하고 multiply사용
LocalDateTime validUntil = LocalDateTime.now().plusMinutes(30);
return new Payment(orderId,currency,foreignCurrencyAmount,exRate,convertedAmount,validUntil);
}
}
- @Component : 애플리케이션의 BeanObjet가 될 대상이다 라는것을 알려주는 애노테이션
ObjectFactory
package tobyspring.hellospring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class ObjectFactory {
// @Bean
// public PaymentService paymentService() {
// return new PaymentService(exRateProvider());
// }
//
// @Bean
// public ExRateProvider exRateProvider(){
// return new SimpleExRateProvider();
// }
}
- @ComponentScan : 알아서 Bean을 스캔해서 정보를 찾아내는 애노테이션
WebApiExRateProvider
package tobyspring.hellospring;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.stream.Collectors;
//@Component
public class WebApiExRateProvider implements ExRateProvider{
@Override
public BigDecimal getExRate(String currency) throws IOException {
URL url = new URL("https://open.er-api.com/v6/latest/"+ currency);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String response = br.lines().collect(Collectors.joining());
br.close();
ObjectMapper mapper = new ObjectMapper();
ExRateData data = mapper.readValue(response, ExRateData.class);
return data.rates().get("KRW");
}
}
SimpleExRateProvider
package tobyspring.hellospring;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.math.BigDecimal;
@Component
public class SimpleExRateProvider implements ExRateProvider{
@Override
public BigDecimal getExRate(String currency) throws IOException {
if(currency.equals("USD")) return BigDecimal.valueOf(1000);
throw new IllegalArgumentException("지원되지 않는 통화입니다");
}
}
'토비의 스프링 6' 카테고리의 다른 글
| DI와 디자인 패턴 (0) | 2024.07.04 |
|---|---|
| 싱글톤 레지스트리 (0) | 2024.07.03 |
| 스프링 컨테이너와 의존관계 주입 (0) | 2024.07.03 |
| 원칙과 패턴 (0) | 2024.07.03 |
| 오브젝트 팩토리 (0) | 2024.07.03 |