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