🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard
✨ 새로운 할인 정책 확장하기 : 정률 할인 정책
1. DiscountPolicy 구현체 Class 생성 : RateDiscountPolicy
· int discountPercent = 10
· discount : return price * discountPercent / 100
2. test/java/hello.core/discount/RateDiscountPolicyTest Class 생성 후 테스트
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP 는 10% 할인이 적용되어야 한다")
void vip_o() {
// given
Member member = new Member(1L, "memberVIP", Grade.VIP);
// when
int discount = discountPolicy.discount(member, 10000);
// then
Assertions.assertThat(discount).isEqualTo(1000);
}
@Test
@DisplayName("VIP 가 아니면 할인이 적용되지 않아야 한다")
void vip_x() {
// given
Member member = new Member(2L, "memberBASIC", Grade.BASIC);
// when
int discount = discountPolicy.discount(member, 10000);
// then
Assertions.assertThat(discount).isEqualTo(0);
}
}
3. 할인 정책 적용하기 : OrderServiceImpl 코드 수정
· DiscountPolicy discountPolicy = new RateDiscountPolicy()
✨ 문제점
· 역할과 구현 분리 → ✅
· 다형성 활용 & 인터페이스와 구현 객체 분리 → ✅
· OCP, DIP 객체 지향 설계 원칙 준수 → ❌
》OCP : 기능 확장, 변경으로 클라이언트 코드에 영향
》DIP : 구체(구현) 클래스에 의존
- 추상(인터페이스) 의존 : DiscountPolicy
- 구체(구현) 클래스 : FixDiscountPolicy, RateDiscountPolicy
기대했던 의존 관계 | 실제 의존 관계 | 정책 변경 시 |
➡️ DIP 위반 |
➡️ OCP 위반 |
✨ 문제 해결 방법
✅ 인터페이스에만 의존하도록 설계하기
· OrderServiceImpl 코드 변경
...
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
// private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
...
}
➡️ 실행 시 NPE (Null Pointer Exception) 발생
☆ ☆ ☆ ☆ ☆
이 문제를 해결하려면 누군가 클라이언트인 OrderServiceImpl 에 DiscountPolicy 의 구현 객체를 대신 생성하고 주입해주어야 한다 !!
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[이해2 - 객체 지향 원리 적용] SOLID 中 적용된 3가지 원칙 (0) | 2023.11.14 |
---|---|
[이해2 - 객체 지향 원리 적용] 기획자 AppConfig (+ 새로운 할인 정책 적용 문제 해결) (0) | 2023.11.13 |
[이해1 - 예제 만들기] 주문과 할인 도메인 설계 → 개발 → 테스트 (0) | 2023.11.08 |
[이해1 - 예제 만들기] 회원 도메인 설계 → 개발 → 테스트 (0) | 2023.11.07 |
[이해1 - 예제 만들기] 비즈니스 요구사항과 설계 - 회원, 주문과 할인 정책 (0) | 2023.11.06 |