구성정보를 가져오는 다른 방법

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