Kim-Baek 개발자 이야기

[스프링 핵심원리] 14. 새로운 할인 정책 개발 본문

개발/Spring

[스프링 핵심원리] 14. 새로운 할인 정책 개발

김백개발자 2021. 10. 4. 17:14
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

지금까지 할인 정책은 얼마를 주문하던 1000원을 할인해주는 정액 할인 정책이였다. 하지만 맨 처음 기획을 보면 이 정책은 언제든지 바뀔 수 있는 것이였다.

기획자가 이제 1000원이 아니라 주문 금액의 10%를 할인해주는 정률 할인 정책으로 변경해달라는 요구가 들어왔다. 그렇다면 개발자인 우리는 이것을 변경해서 적용해볼 수 있도록 하자 .

기획자는 애자일 소프트웨어 개발 선언에 따라서 계획을 따르기보다는 변화에 대응하라는 말을 한다. 열받는 말이지만 우리도 이 말에 맞게 대응을 해볼 수 있도로 한다.

package core.order.discount;

import core.order.member.Grade;
import core.order.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 / 10;
        } else {
            return 0;
        }
    }
}

먼저 이전에 할인 정책의 역할로 인터페이스를 만들어두었기 때문에 이를 implement 하는 클래스를 만든다. 그리고 dicount 로직에 10퍼센트를 할인하도록 개발을 한다.

이렇게 한 후에 마찬가지로 junit을 통해서 검증을 하는 과정이 필수적으로 필요하다.

package core.order.discount;

import core.order.member.Grade;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import core.order.member.Member;

import static org.assertj.core.api.Assertions.assertThat;

class RateDiscountPolicyTest {

    RateDiscountPolicy discountPolicy =  new RateDiscountPolicy();

    @Test
    @DisplayName("VIP는 10퍼센트 할인이 적용되어야야 한다.")
    public void vip_o(){
        //given
        Member member = new Member(1L, "memberVIP", Grade.VIP);
        //when
        int discount = discountPolicy.discount(member, 1000);
        //then
        assertThat(discount).isEqualTo(1000);
    }

    @Test
    @DisplayName("BASIC은  10퍼센트 할인이 적용안되어야 한다.")
    public void vip_x(){
        //given
        Member member = new Member(1L, "memberBASIC", Grade.BASIC);
        //when
        int discount = discountPolicy.discount(member, 1000);
        //then
        assertThat(discount).isEqualTo(0);
    }


}

VIP일 경우에는 10퍼센트를 할인해주고, BASIC일 경우에는 할인이 되지 않는 테스트를 만들었다. 이렇게 까지하면 정률로 할인하는 정책의 개발은 완료가 된다

그리고 테스트를 만들 때는 항상 성공하는 것 ( 할인 성공 )만 아니라, 할인이 안되는 경우까지 만들어서 전체 케이스를 볼 수 있도록 하는 것이 정말 중요하다.


반응형
Comments