[스프링 핵심원리 기본편] 2.(3) 주문과 할인 도메인 설계

코린이서현이·2023년 11월 10일
0

😊들어가면서😊

최떙떙이 바보 ~ 

🎯 목표

📌 주문과 할인 도메인 설계
📌 주문과 할인 도메인 개발
📌 주문과 할인 도메인 실행과 테스틎

📌 주문과 할인 도메인 설계

주문과 할인 정책

  • 회원은 상품을 주문할 수 있다.
  • 회원 등급에 따라 할인 정책을 적용할 수 있다.
  • 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있다.)
  • 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정)

주문 도메인 협력, 역할, 책임


🛠️ 각 기능
1. 주문 생성: 클라이언트는 주문 서비스에 주문 생성을 요청한다.
2. 회원 조회: 할인을 위해서는 회원 등급이 필요하다. 그래서 주문 서비스는 회원 저장소에서 회원을 조회한다.
3. 할인 적용: 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다.
4. 주문 결과 반환: 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다. (실제로는 DB에 저장하겠지만 생략)

주문 도메인 전체 : 역할과 구현까지

  • 역할을 먼저 만들고 이후에 구현을 만들어야한다.

주문 도메인 클래스 다이어그램

주문 도메인 객체 다이어그램1

  • 실제new를 사용하는

주문 도메인 객체 다이어그램2

🤔 도메인 클래스 다이어그램과 객체 다이어그램의 차이

  • 도메인 클래스
  • 객체 : new로 실제 생성

📌 주문과 할인 도메인 개발

할인 정책 인터페이스

📐 Discount

import hello.core.member.Member;

public interface DiscountPolicy {
  /**
   * Discount int.
   * @return 할인 대상 금액
   */
  int discount(Member member, int price);
}

정액 할인 정책 구현

📄 FixDiscountFolicy

public class FixDiscountPolicy implements DiscountPolicy {

  private int discountFixAmount = 1000; //1000원 할인

  @Override
  public int discount(Member member, int price) {
    if (member.getGrade() == Grade.VIP) { //
      return discountFixAmount;
    } else {
      return 0;
    }
  }
}

주문 엔티티

📄 Order

public class Order {

  private Long memberID;
  private String itemName;
  private int itemPrice;
  private int discountPrice;

  public Order(Long memberID, String itemName, int itemPrice, int discountPrice) {
    this.memberID = memberID;
    this.itemName = itemName;
    this.itemPrice = itemPrice;
    this.discountPrice = discountPrice;
  }

  public int calculatePrice() {
   return  itemPrice = discountPrice;
  }


  public Long getMemberID() {
    return memberID;
  }

  public void setMemberID(Long memberID) {
    this.memberID = memberID;
  }

  public String getItemName() {
    return itemName;
  }

  public void setItemName(String itemName) {
    this.itemName = itemName;
  }

  public int getItemProce() {
    return itemPrice;
  }

  public void setItemProce(int itemProce) {
    this.itemPrice = itemProce;
  }

  public int getDiscountPrice() {
    return discountPrice;
  }

  public void setDiscountPrice(int discountPrice) {
    this.discountPrice = discountPrice;
  }

  @Override
  public String toString() {
    return "Order{" +
            "memberID=" + memberID +
            ", itemName='" + itemName + '\'' +
            ", itemPrice=" + itemPrice +
            ", discountPrice=" + discountPrice +
            '}';
  }
}

주문 서비스 인터페이스

📐 OrderService

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

주문 서비스 구현체

📄 OrderServiceImpl

public class OrderServiceImpl implements  OrderService{
 //주문을 받은 다음, 회원 조회 , 할인 적용을 해야한다.
  private final MemberRepository memberRepository = new MemoryMemberRepository();
  private final DiscountPolicy discountPolicy = new FixDiscountPolicy();


  @Override
  public Order createOrder(Long memberID, String itemName, int itemPrice) {
    Member member = memberRepository.finbyId(memberID);
    int discountPrice = discountPolicy.discount(member,itemPrice);

    return new Order(memberID,itemName,itemPrice,discountPrice);
  }
}

📌 주문과 할인 도메인 실행과 테스트

메인 메서드로

📄 OrderApp

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

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

    Order order = orderService.createOrder(memberID, "itemA", 1000);

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

  }
}

테스트 코드로

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

👋 마무리하면서

이게 좋은 개발인지,
즉 변경이 좋은지~ 점검해보자~
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글