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
'Spring' 카테고리의 다른 글
스프링 시큐리티(Spring Security) 설정 (0) | 2022.02.17 |
---|---|
Spring 필드 주입 vs 생성자 주입(win) (0) | 2022.02.15 |
순수 Java에서 Spring으로의 첫 전환! (0) | 2022.02.15 |
(SpringBoot) test code (0) | 2022.02.15 |
스프링 부트 Test 예제(feat. assertj) (0) | 2022.02.14 |