클래스의 분리

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

클래스의 분리

 

 

PaymentService

package tobyspring.hellospring;

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

public class PaymentService {
    private final SimpleExRateProvider exRateProvider;

    public PaymentService() {
        this.exRateProvider = new SimpleExRateProvider();
    }

    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);
    }

}

 

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 {
    BigDecimal getWebExRate(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 {
    BigDecimal getExRate(String currency) throws IOException {
        if(currency.equals("USD")) return BigDecimal.valueOf(1000);

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

 

관심사에 따라 클래스를 분리해서 각각 독립적으로 구성할 수 있다. 결과적으로 클래스 레벨에 사용 의존관계가 만들어지기 때문에 강한 코드 수준의 결합이 생긴다. 실제로 사용할 클래스가 변경 되면 이를 이용하는 쪽의 코드도 따라서 변경이 되어야 한다. 상속을 통한 확장 처럼 유연한 변경도 불가능해진다. 상속한 것이 아니기 때문에 사용하는 클래스의 메소드 이름과 구조도 제각각일 수 있다. 그래서 클래스가 변경되면 많은 코드 가 따라서 변경되어야 한다. 클래스가 다르다는 것을 제외하면 관심사의 분리가 잘 된 방법이 아니다.

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

오브젝트 팩토리  (0) 2024.07.03
관계설정 책임의 분리  (0) 2024.07.03
인터페이스 도입  (0) 2024.07.03
오브젝트와 의존관계  (0) 2024.07.02
PaymentService 개발  (0) 2024.07.01