코딩딩/Spring

DIP에 대한 정리

전낙타 2023. 7. 21. 02:21

 

 

AppConfig라는 클래스를 구상영역으로 설정해주어 사용영역과 분리해줌으로써 DIP를 완성해주었다.

 

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.order.Order;
import hello.core.order.OrderService;

public class OrderApp {
    public static void main(String[] args) {
        MemberService memberService;
        OrderService orderService;

        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
        orderService = appConfig.orderService();

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "ItemA", 20000);

        System.out.println("order = " + order);

    }
}
package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

public class AppConfig {
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }

    private MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService(){
        return new OrderServiceImpl(
                memberRepository(),
                discountPolicy());
    }
    public DiscountPolicy discountPolicy(){
//        return new FixDistcountPolicy();
        return new RateDiscountPolicy();
    }

}

 

코드를 보면 알수있듯 OrderApp 클래스는 인터페이스만 의존하는 코드로 완성되었다.

 

공부를 하면 할수록 뭔가 레고를 조립하는 느낌이 들어 너무 재밌다.