관계설정 책임의 분리
2024. 7. 3. 10:05ㆍ토비의 스프링 6
런타임에 의존해서 사용해야 할 클래스의 오브젝트를 설정하는 책임이 어디에 있는가?

의존관계를 설정하는 클래스를 따로 추가한다.

PaymentService
package tobyspring.hellospring;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
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);
}
}
- PaymentService를 생성할 때 ExRateProvider 인터페이스를 매개변수로 받는다.
Client
package tobyspring.hellospring;
import java.io.IOException;
import java.math.BigDecimal;
public class Client {
public static void main(String[] args) throws IOException {
PaymentService paymentService = new PaymentService(new WebApiExRateProvider());
Payment payment = paymentService.prepare(100L,"USD", BigDecimal.valueOf(50.7));
System.out.println(payment);
}
}
- 메인메서드에서 PaymentService를 생성할 때 사용 할 구현체를 생성해서 추가해준다.

기존 코드에서는 PaymentService에서 직접 구현체를 선택해서 작동했지만 Client로 그 책임을 전가함.