Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- redis
- TCP/IP
- Window-Via-c/c++
- 운영체제
- OS
- 제프리리처
- inflearn
- 10026번
- HTTP
- BOJ
- Operating System
- 스프링 입문
- 우아한레디스
- C#
- 열혈 TCP/IP 소켓 프로그래밍
- n타일링2
- 이펙티브코틀린
- 열혈 tcp/ip 프로그래밍
- 김영한
- 2475번
- Spring
- 우아한 테크 세미나
- 에러핸들링
- FIFO paging
- C++
- 윤성우 저자
- 스프링 핵심 원리
- 토마토
- Four Squares
- Operating System.
Archives
- Today
- Total
나의 브을로오그으
#3-1. [스프링 핵심 원리-기본편] - 새로운 할인 정책과 문제점 본문
새로운 할인 정책을 확장
서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요. 예를 들어서 기존 청책은 VIP가 10000원을 주문하든 20000원을 주문하든 항상 1000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 20000원 주문시 2000원을 할인해주는 것.
[RateDiscountPolicy]
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
} else {
return 0;
}
}
}
[RateDiscountPolicyTest]
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
class RateDiscountPolicyTest {
RateDiscountPolicy rateDiscountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP는 10% 할인이 적용되어야 한다.")
void vip_o() {
// given
Member member = new Member(1L, "memberVIP", Grade.VIP);
// when
int discount = rateDiscountPolicy.discount(member, 10000);
// then
assertThat(discount).isEqualTo(1000);
}
@Test
@DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다.")
void vip_x() {
// given
Member member = new Member(1L, "memberVIP", Grade.BASIC);
// when
int discount = rateDiscountPolicy.discount(member, 10000);
// then
assertThat(discount).isEqualTo(0);
}
}
(이렇게 새로운 할인 정책을 잘 분리하면 테스트 하기 쉬워진다.)
자 그러면 실제 추가된 할인 정책(RateDiscountPolicy)를 적용하려면 OrderServiceImpl을 고쳐야 한다.
이것이 바로 문제점!
- 역할과 구현을 우리는 분리했다.
- 다형성도 활용하고, 인터페이스와 구현 객체를 분리했다(ISR)
- OCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했다. -> 그렇게 보이지만 아니다.
의존관계를 살표보면 OrderServiceImpl은 DiscountPolicy와 DiscountPolicy 구현체 둘다에 의존하고 있다.
- 만약 Service 구현체 코드가 변경되면 이것을 의존하고 있는 클라이언트 코드도 변경될 수 있다.
private DiscountPolicy discountPolicy;
(이렇게 하면 NPE발생함)
구현체에 의존하지 않으려면 어디선가 DiscountPolicy객체에 구현체를 주입해주어야 한다.
'Spring' 카테고리의 다른 글
#3-3. [스프링 핵심 원리-기본편] - 리펙토링 (0) | 2022.07.18 |
---|---|
#3-2. [스프링 핵심 원리-기본편] - 관심사 분리 (0) | 2022.07.18 |
#2-5. [스프링 핵심 원리-기본편] - 주문과 할인 도메인 실행과 테스트 (0) | 2022.07.14 |
#2-4. [스프링 핵심 원리-기본편] - 주문과 할인 도메인 개발 (0) | 2022.07.14 |
#2-3. [스프링 핵심 원리-기본편] - 회원 도메인 실행 및 테스트 (0) | 2022.07.13 |