Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

주문, 할인 도메인 개발 & Test 본문

인프런/[인프런] Spring 핵심원리 이해

주문, 할인 도메인 개발 & Test

Seung__ 2021. 7. 25. 17:40

1. DiscountPolicy Interface


  • DiscountPolicy의 역할 : Member, 가격을 받아 할인 금액을 return
  • 추후 변경이 용이하게 interface생성 후 구현체 생성.
public interface DiscountPolicy {

    /**
     * @return 할인 대상 금액
     */

    int discount(Member member, int price);

}

 

2. FixDiscountPolicy Class


  • DiscountPolicy의 구현체
  • Override하여 method 구현
  • member, price를 받아 member 등급에 해당하는 할인금액 return.
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;
        }

    }
}

 

3. Order class


  • Order 객체가 변할 가능성이 없기 때문에 구체클래스로 작성
  • 주문 후 할인 가지 결정되고 return되는 객체
    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;
        }
    
    //getter, setter 포함
    
        @Override
        public String toString() {
            return "Order{" +
                    "memberId=" + memberId +
                    ", itemName='" + itemName + '\'' +
                    ", itemPrice=" + itemPrice +
                    ", discountPrice=" + discountPrice +
                    '}';
        }
    }​

4. OrderService Interface


  • OrderService의 역할 : 회원id, 상품명, 상품 가격받고 회원 조회 및 할인적용을 조회 후 주문 결과를 return. 
    public interface OrderService {
    
        Order createOrder(Long memberId, String itemName, int itemPrice);
    
    }​

5. OrderServiceImpl class


  • OrderService interface의 구현체
  • MemoryMemberRepository 인스턴스 생성
  • FixDiscountPolicy 인스턴스 생성
  • 할인에 대한 정책은 온전히 discoundPolicy에 위임
public class OderServiceImpl 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);

        //OrderService : 할인금액 나는 몰라, discountPolicy 니가 내놔
        //discountPolicy : 네
        int discountPrice = discountPolicy.discount(member, itemPrice);

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


    }

}

 

6. 문제점


  • MemoryMembeRepository 인스턴스 생성이 두 곳에서 이루어지고 있다.
  • 두 인스턴스를 각각 생성되기 때문에 별도의 인스턴스이다.
  • 조회 결과가 다를 수 있다. 빈으로 등록해서 쓰고싶다..이래서 스프링이 필요한가?
    MemberServiceImpl에서도 
    OrderServiceImpl에서도
  • 현재는 Map이 static으로 선언되어 calss level에 붙는다. 따라서 문제는 되지 않을 것이다. 만족스럽지는 않다. ㅎ

 

7. Test


class OrderServiceTest {

    MemberService  memberService = new MemberServiceImpl();
    OrderService orderService = new OderServiceImpl();

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

}

 

8. GitHub : 210725, Order domain


 

 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments