1. AppConfig 리팩터링
현재 AppConfig를 보면 중복이 있고, 역할에 따른 구현이 잘 안 보인다.
* 리팩터링 전
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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(new MemoryMemberRepository() /*중복*/);
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository() /*중복*/, new FixDiscountPolicy());
}
}
* 리팩터링 후
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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());
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
- new MemoryMemberRepository()이 부분이 중복 제거되었다. 이제 MemoryMemberRepository를 다른 구현체로 변경할 때 한 부분만 변경하면 된다.
- AppConfig를 보면 역할과 구현 클래스가 한눈에 들어온다.
2. 할 일 정책 변경
- 정액 할인 정책을 정률% 할인 정책으로 변경해보자.
- FixDiscountPolicy -> RateDiscountPolicy
- AppConfig의 등장으로 애플리케이션이 크게 사용 영역과, 객체를 생성하고 구성(Configuration)하는 영역으로 분리되었다.
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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());
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
- AppConfig에서 할인 정책 역할을 담당하는 구현을 FixDiscountPolicy -> RateDiscountPolicy 객체로 변경했다.
- 클라이언트 코드인 OrderServiceImpl를 포함해서 사용 영역의 어떤 코드도 변경할 필요가 없다.
- 할인 정책을 변경해도 AppConfig가 있는 구성 영역만 변경하면 된다.
DIP(추상화에 의존해야지, 구체화에 의존하면 안 된다) 준수한다.
OrderServiceImpl은 DiscountPolicy(인터페이스), MemberRepository(인터페이스)에만 의존한다.
OCP(소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다) 준수한다.
FixDiscountPolicy -> RateDiscountPolicy로 변경할 때 클라이언트 코드는 변경하지 않아도 된다.
본 글은 김영한 님의 "스프링 핵심 원리"(인프런) 유료 강의를 들으며 요약, 정리하고 일부 정보를 추가 작성한 것입니다.
저작권 문제시 903yh@naver.com으로 연락 주시면 삭제하겠습니다.
반응형
'Spring(JAVA Framework) > Spring Core' 카테고리의 다른 글
스프링 컨테이너와 생성과정 (0) | 2021.08.16 |
---|---|
IoC, DI 컨테이너 (0) | 2021.08.15 |
스프링 핵심 원리 이해2 (0) | 2021.08.15 |
스프링 핵심 원리 이해1 (0) | 2021.08.14 |
객체 지향 프로그래밍과 설계 원칙(SOLID) (0) | 2021.08.12 |
댓글