Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Greedy
- 스프링 핵심 원리
- 김영한
- kotlin
- jpa
- QueryDSL
- Servlet
- http
- 인프런
- springdatajpa
- 스프링
- JDBC
- Exception
- AOP
- Thymeleaf
- db
- 스프링 핵심 기능
- Spring Boot
- JPQL
- 그리디
- 알고리즘
- SpringBoot
- java
- 자바
- Android
- Proxy
- spring
- pointcut
- transaction
- 백준
Archives
- Today
- Total
개발자되기 프로젝트
주문, 할인 도메인 개발 & Test 본문
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 인스턴스 생성이 두 곳에서 이루어지고 있다.
- 두 인스턴스를 각각 생성되기 때문에 별도의 인스턴스이다.
- 조회 결과가 다를 수 있다. 빈으로 등록해서 쓰고싶다..이래서 스프링이 필요한가?
- 현재는 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
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
정책 변경, DIP & OCP 위반 (0) | 2021.07.25 |
---|---|
새로운 할인 정책 개발 (0) | 2021.07.25 |
주문, 할인 도메인 설계 (0) | 2021.07.25 |
회원 도메인 개발 및 테스트 (0) | 2021.07.24 |
회원 도메인 설계 (0) | 2021.07.24 |
Comments