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

[이해1 - 예제 만들기] 주문과 할인 도메인 설계 → 개발 → 테스트

alsruds 2023. 11. 8. 03:31
🧐강의🧐
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

 

주문과 할인 도메인 설계하기

· 주문과 할인 도메인 요구사항

          》상품 주문 기능

          》회원 등급에 따른 할인 정책 적용 : VIP 등급 1000원 할인 (고정 금액 할인)

          》(미확정) 할인 정책은 변경 가능성 높음, 최악의 경우 할인 적용 안함

 

· 주문과 할인 도메인 협력, 역할, 책임 관계

1. 주문 생성 : 클라이언트가 주문 서비스에 주문 생성 요청

2. 회원 조회 : 주문 서비스가 회원 저장소에서 회원 조회 (할인을 위한 회원 등급 조회)

3. 할인 적용 : 주문 서비스는 회원 등급에 따라 할인 정책 적용

4. 주문 결과 반환 : 주문 서비스는 할인 결과를 포함한 주문 결과 반환

(+) 실제로는 주문 데이터 DB 저장

 

➡️ 역할과 구현 분리로 자유롭게 구현 객체를 조립할 수 있도록 설계

➡️ 회원 저장소, 할인 정책 유연하게 변경 가능

 

· 주문과 할인 클래스 다이어그램

 

· 주문과 할인 객체 다이어그램1 : 정액 할인 정책

➡️ 메모리에서 회원 조회 후, 정액 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 됨 : 역할들의 협력 관계 재사용 가능

 

· 주문과 할인 객체 다이어그램2 : 정률 할인 정책

➡️ DB에서 회원 조회 후, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 됨 : 역할들의 협력 관계 재사용 가능

 

주문과 할인 도메인 개발하기

1. 할인 Package 생성 : discount

 

2. DiscountPolicy Interface 생성

public interface DiscountPolicy {

    // return 할인 대상 금액
    int discount(Member member, int price);
}

 

3.  DiscountPolicy 구현체 Class 생성 : FixDiscountPolicy

· int discountFixAmount = 1000

· discount : member.getGrade() == Grade.VIP

 

4. 주문 Package 생성 : order

 

5. Order Class 생성 → memberId, itemName, itemPrice, discountPrice

 

6. OrderService Interface 생성

public interface OrderService {
    Order createOrder(Long memberId, String itemName, int itemPrice);
}

 

7. OrderService 구현체 Class 생성 : OrderServiceImpl

· MemberRepository memberRepository = new MemoryMemberRepository()

· DiscountPolicy discountPolicy = new FixDiscountPolicy()

· createOrder : return new Order(memberId, itemName, itemPrice, discountPrice)

 

Test

1. main/java/hello.core/OrderApp Class 생성 후 테스트

public class OrderApp {
    public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        OrderService orderService = new OrderServiceImpl();

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "itemA", 10000);

        System.out.println("order = " + order);
        System.out.println("order.calculatePrice = " + order.calculatePrice());
    }
}

 

2. test/java/hello.core/order Package 생성

 

3. 생성한 패키지에 OrderServiceTest Class 생성 후 테스트

public class OrderServiceTest {
    MemberService memberService = new MemberServiceImpl();
    OrderService orderService = new OrderServiceImpl();

    @Test
    void createOrder() {
        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "itemA", 10000);
        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
    }
}

테스트 성공~