본문 바로가기
스프링 핵심원리 - 기본편

스프링 핵심 원리와 이해1 - 예제 만들기 (주문 도메인 설계)

by leko 2023. 5. 4.

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

<<interface>> OrderService <--- OrderServiceImpl  -----> <<interface>> MemberRepository <---

 MemoryMemberRepository / DbMemberRepository

 

<<interface>>  OrderService <--- OrderServiceImpl  -----> <<interface>> DiscountPolicy <--- FixDiscountPolicy / RateDiscountPolicy 

 

1. DiscountPolicy 인터페이스

public interface DiscountPolicy{
	int discount(Member member, int price); 
}

2. FixDiscountPolicy 구현체

public class FixDiscountPolicy implements DiscountPolicy {
	private int discountFixAmount = 1000; // 천원 할인
    
    @Override
    public int discount (Member member, int price){
    	if(member.getGrade() == Grade.VIP)
       		return discountFixAmount;
        else
        	return 0;
      }
 }

3. 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 caculatePrice() {
  		return itemPrice - discountPrice;
	}

  	public Long getMemberId() {
  		return memberId;
  	}
  
  	public String getItemName() {
 		return itemName;
 	}
 
 	public int getItemPrice() {
 		return itemPrice;
 	}
 
 	public int getDiscountPrice() {
 		return discountPrice;
 	}
    
    @Override 
    public String toString() {
    	return "Order{" + 
        		"memberId = " + memberId +
                ", itemName= " + itemName +'\''+
                ", itemPrice= " + itemPrice + 
                ", discountPrice= " + discountPrice +
                '}';
       }
   }

4. OrderService 인터페이스

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

5. 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.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);
        
        return new Order(memberId, itemName,itemPrice,discountPrice);
        }
   }

6. 테스트하기

1)

public class OrderApp {
 public static void main(String[] args) {
		MemberService memberService = new MemberServiceImpl();
        OrderService orderService = new OrderServiceImpl();
        
        long memberId = 1L;
        Member m = new Member(meberId,"memberA", Grade.VIP);
        memberService.join(m);
        
        Order order = orderService.createOrder(memberId, "itemA", 10000);
        
        System.out.println("order = " + order);
        
    }
}

 

결과

order = Order{memberId=1, itemName='itemA', itemPrice=10000, discountPrice=1000}

 

2)

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class OrderServiceTest {
	MemberService memberService = new MemberServiceImpl();
 	OrderService orderService = new OrderServiceImpl();
    
    @Test
    void createOrder() {
   		memberId = 1L;
        Member m = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(m);
        
        Order order = orderService.createOrder(memberId, "itemA", 10000);
        
        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000));
        }
}