Spring-2021.12.03

Jonguk Kim·2021년 12월 3일
0

Spring 강의

목록 보기
4/7

1. 비즈니스 요구사항과 설계

  • 요구사항

2. 주문과 할인 도메인 설계

  1. 주문 생성: 클라이언트는 주문 서비스에 주문 생성을 요청한다.
  2. 회원 조회: 할인을 위해서는 회원 등급이 필요하다. 그래서 주문 서비스는 회원 저장소에서 회원을 조회한다.
  3. 할인 적용: 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다.
  4. 주문 결과 반환: 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다.
  • 주문 도메인 전체: 역할과 구현을 분리

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

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

3. 주문과 할인 도메인 개발

  • 주문 엔티티
public class Order {

    private Long memberId;	// 회원 ID
    private String itemName;	// 상품명
    private int itemPrice;	// 상품가격
    private int discountPrice;	// 할인가격
    
    // 생성자
    
    // 계산
    public int calculatePrice() {
        return itemPrice - discountPrice;
    }
    
    // getter, setter
}
  • 할인 정책 인터페이스 (역할)
public interface DiscountPolicy {

    int discount(Member member, int price);	// 할인적용 역할
}
  • 정액 할인 정책 구현체 (구현)
public class FixDiscountPolicy implements DiscountPolicy {

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

    @Override
    public int discount(Member member, int price) {		// 할인적용 구현
        if (member.getGrade() == Grade.VIP){			// VIP면 할인
            return discountFixAmount;
        } else {
            return 0;
        }
    }
  • 주문 서비스 인터페이스 (역할)
public interface OrderService {
    Order createOrder(Long memberId, String itemName, int itemPrice); // 주문 생성 역할
}
  • 주문 서비스 구현체 (구현)
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.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

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

4. 주문과 할인 도메인 테스트

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);	// 주문생성
        assertThat(order.getDiscountPrice()).isEqualTo(1000);

    }
}
profile
Just Do It

0개의 댓글