반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
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
Archives
Today
Total
06-30 00:00
관리 메뉴

ImJay

[Java Spring] 2-15. 새로운 할인 정책 개발 본문

Java Spring/스프링 핵심 원리 - 기본편

[Java Spring] 2-15. 새로운 할인 정책 개발

ImJay 2023. 2. 27. 20:01
반응형

[Java Spring] 2-15. 새로운 할인 정책 개발


1. 새로운 할인 정책을 확장해보자.

- 악덕 기획자: 서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요. 예를 들어서 기존 정책은 VIP가 10000원을 주문하든 20000원을 주문하든 항상 1000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 20000원 주문시에 2000원을 할인해주는 거에요!

- 순진 개발자: 제가 처음부터 고정 금액 할인은 아니라고 했잖아요.

- 악덕 기획자: 애자일 소프트웨어 개발 선언 몰라요? “계획을 따르기보다 변화에 대응하기를”

- 순진 개발자: … (하지만 난 유연한 설계가 가능하도록 객체지향 설계 원칙을 준수했지 후후)

- 참고: 애자일 소프트웨어 개발 선언

 

애자일 소프트웨어 개발 선언

애자일 소프트웨어 개발 선언 우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다. 이 작업을 통해 우리는 다음을 가치 있게

agilemanifesto.org

- 순진 개발자가 정말 객체지향 설계 원칙을 잘 준수 했는지 확인해보자. 이번에는 주문한 금액의 %를 할인해주는 새로운 정률 할인 정책을 추가하자.

 

2. RateDiscountPolicy 추가

 

3. main > java > hello.core > discount > RateDiscountPolicy 클래스 생성

 

4. 코드 작성

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;
        }
    }
}

 

5. 작성한 RateDiscountPolicy 클래스에 CTRL + SHIFT + T 단축키를 눌러보자

- 그대로 확인 누르기

 

6. 코드 작성

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

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(1000);
    }
}

 

7. 빌드

- VIP가 아니면 할인이 적용되어서는 안된다. 따라서 정상적으로 로직이 작동함을 확인할 수 있다.

 

8. 테스트 코드 수정

// Assertions.assertThat(discount).isEqualTo(1000);
Assertions.assertThat(discount).isEqualTo(0);

 

9. 다시 빌드

 

10. 미세 팁

- Assertions 는 static 으로 선언해주면 (alt + enter) 다음에도 재사용이 가능하다.

반응형
Comments