Spring
(Spring DI) Appconfig를 활용한 가격정책을 DI로 구현
쿠카이든
2022. 2. 15. 11:48
728x90
- DI(의존성 주입)를 활용한 할인정책 구현(Java)
- 할인 정책을 구현하기 위해 DiscountPolicy 인터페이스 밑에 정액할인 정책 구현체와 정률할인 정책 구현체를 두었다.
- 할인 정책 인터페이스(DiscountPolicy.java)
import hello.core.member.Member;
public interface DiscountPolicy {
/**
* @return 할인 대상 금액
*/
int discount(Member member, int price);
}
- 정액 할인 정책 구현체(FixDisCountPolicy.java)
public class FixDiscountPolicy implements DiscountPolicy {
private int discountFixAmount = 1000; //1000원 할인
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return discountFixAmount;
} else {
return 0;
}
}
}
- 정률(%) 할인 정책 구현체(RateDIscountPolicy.java)
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10; //10% 할인
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
} else {
return 0;
}
}
}
- 위 예제의 단점은 정책을 변경할 때마다, 클라이언트 코드에 영향을 준다는 점이 있다.(인터페이스가 아닌 구현체에 의존)
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
→ 해결 방법으로는 아래와 같이 AppConfig 같은 별도의 설정 클래스를 만들어 구현 객체들을 전부 생성한다. 이를 생성자를 통해 주입하는 방식이 있다.(아래 예제)
public class AppConfig {
...
//AppConfig에 필요한 전체 구현 객체를 생성
public OrderService orderService() {
return new OrderServiceImpl(new FixDiscountPolicy());
}
...
}
public class OrderServiceImpl implements OrderService {
...
//생성자를 통한 주입
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public class OrderApp {
public static void main(String[] args) {
...
//사용 클래스에서 활용 방안
AppConfig appConfig = new AppConfig();
OrderService orderService = appConfig.orderService();
Order order = orderService.createOrder(memberId, "itemA", 10000);
728x90