인터페이스 도입

2024. 7. 3. 09:25토비의 스프링 6

 

 

ExRateProvider

package tobyspring.hellospring;

import java.io.IOException;
import java.math.BigDecimal;

public interface ExRateProvider {
    BigDecimal getExRate(String currency) throws IOException;
}

 

WebApiExRateProvider

package tobyspring.hellospring;

import com.fasterxml.jackson.databind.ObjectMapper;

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;

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 java.io.IOException;
import java.math.BigDecimal;

public class SimpleExRateProvider implements ExRateProvider{
    @Override
    public BigDecimal getExRate(String currency) throws IOException {
        if(currency.equals("USD")) return BigDecimal.valueOf(1000);

        throw new IllegalArgumentException("지원되지 않는 통화입니다");
    }
}

 

독립적인 인터페이스를 정의하고 PaymentService가 사용할 메소드 이름을 정해둔다. 이를 각 클래스가 구현하게 만들면 이 를 사용하는 쪽(PaymentService)에서 의존하는 클래스가 변경되더라도 사용하는 메소드 이름의 변경이 일어나지 않는다. 하지만, 클래스의 인스턴스를 만드는 생성자를 호출하는 코드에는 클래스 이름이 등장하기 때문에 사용하는 환율 정보를 가져 오는 클래스가 변경되면 PaymentService의 코드도 일부분이지만 따라서 변경되어야 한다. 여전히 상속을 통한 확장만큼의 유연성도 가지지 못한다.

'토비의 스프링 6' 카테고리의 다른 글

오브젝트 팩토리  (0) 2024.07.03
관계설정 책임의 분리  (0) 2024.07.03
클래스의 분리  (0) 2024.07.03
오브젝트와 의존관계  (0) 2024.07.02
PaymentService 개발  (0) 2024.07.01