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 클래스는 인터페이스만 의존하는 코드로 완성되었다.
공부를 하면 할수록 뭔가 레고를 조립하는 느낌이 들어 너무 재밌다.
'코딩딩 > Spring' 카테고리의 다른 글
좋은 객체지향 설계의 5가지 원칙(SOLID) (0) | 2023.08.13 |
---|---|
스프링 핵심 원리 이해1 - 예제 만들기 (0) | 2023.08.13 |
AOP (0) | 2023.07.11 |
스프링 빈과 의존관계 (0) | 2023.07.11 |
회원관리 예제 (0) | 2023.07.11 |