어떤 역할이 있고, 그 역할이 어떻게 구현되는지가 한 눈에 딱 보여야 한다.
OrderServiceImpl
클라이언트코드
DiscountPolicy 추상화 인터페이스에만 의존하도록 코드 변경(객체 지정을 AppConfig에게 맡김)
AppConfig
<기존 AppConfig 코드>
package hello.core;
import hello.core.discount.FixDiscountPolicy;
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;
import org.springframework.core.OrderComparator;
public class AppConfig {
public MemberService memberService(){
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService(){
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
1. new MemoryMemberRepository() 부분이 중복된다.
2. 애플리케이션 전체 구성(역할/구현)이 어떻게 되어 있는지 코드만 보고 한 눈에 파악이 어렵다.
<수정된 AppConfig 코드>
memberService()가 아니라 memberRepository()를 따로 두어
그 안에서 MemoryMemberRepository()라고 객체 지정을 했다.
그리고 orderService()가 아니라 discountPolicy()를 따로 두어
그 안에서 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;
import org.springframework.core.OrderComparator;
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 FixDiscountPolicy();
}
}
이렇게 한다면 한 눈에 보일 뿐더러 나중에 혹시 memberRepository() 나 discountPolicy() 종류를 바꾸고 싶다면
언제든 바꿀 수 있어 효율적인 코드다.
1. new MemoryMemberRepository() 부분 중복 제거됨
2. 회원 저장소와 할인 정책 부분이 한 눈에 들어와 구조를 한 눈에 파악할 수 있다.
'백엔드 > 스프링' 카테고리의 다른 글
[Inflearn] 좋은 객체지향 설계의 5가지 원칙 적용 (0) | 2025.02.24 |
---|---|
[Inflearn] 새로운 구조와 할인 정책 적용 (OCP 만족) (0) | 2025.02.24 |
[Inflearn] 새로운 할인 정책 적용의 문제점 & 해결방안(관심사 분리) (SRP 만족) (0) | 2025.02.07 |
[Inflearn] 새로운 할인 정책 개발 (0) | 2025.02.02 |
[Inflearn] 주문과 할인 도메인 개발 (0) | 2025.01.30 |