🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard
✨ 주문과 할인 도메인 설계하기
· 주문과 할인 도메인 요구사항
》상품 주문 기능
》회원 등급에 따른 할인 정책 적용 : VIP 등급 1000원 할인 (고정 금액 할인)
》(미확정) 할인 정책은 변경 가능성 높음, 최악의 경우 할인 적용 안함
· 주문과 할인 도메인 협력, 역할, 책임 관계
1. 주문 생성 : 클라이언트가 주문 서비스에 주문 생성 요청
2. 회원 조회 : 주문 서비스가 회원 저장소에서 회원 조회 (할인을 위한 회원 등급 조회)
3. 할인 적용 : 주문 서비스는 회원 등급에 따라 할인 정책 적용
4. 주문 결과 반환 : 주문 서비스는 할인 결과를 포함한 주문 결과 반환
(+) 실제로는 주문 데이터 DB 저장
➡️ 역할과 구현 분리로 자유롭게 구현 객체를 조립할 수 있도록 설계
➡️ 회원 저장소, 할인 정책 유연하게 변경 가능
· 주문과 할인 클래스 다이어그램
· 주문과 할인 객체 다이어그램1 : 정액 할인 정책
➡️ 메모리에서 회원 조회 후, 정액 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 됨 : 역할들의 협력 관계 재사용 가능
· 주문과 할인 객체 다이어그램2 : 정률 할인 정책
➡️ DB에서 회원 조회 후, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 됨 : 역할들의 협력 관계 재사용 가능
✨ 주문과 할인 도메인 개발하기
1. 할인 Package 생성 : discount
2. DiscountPolicy Interface 생성
public interface DiscountPolicy {
// return 할인 대상 금액
int discount(Member member, int price);
}
3. DiscountPolicy 구현체 Class 생성 : FixDiscountPolicy
· int discountFixAmount = 1000
· discount : member.getGrade() == Grade.VIP
4. 주문 Package 생성 : order
5. Order Class 생성 → memberId, itemName, itemPrice, discountPrice
6. OrderService Interface 생성
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
7. OrderService 구현체 Class 생성 : OrderServiceImpl
· MemberRepository memberRepository = new MemoryMemberRepository()
· DiscountPolicy discountPolicy = new FixDiscountPolicy()
· createOrder : return new Order(memberId, itemName, itemPrice, discountPrice)
✨ Test
1. main/java/hello.core/OrderApp Class 생성 후 테스트
public class OrderApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
System.out.println("order.calculatePrice = " + order.calculatePrice());
}
}
2. test/java/hello.core/order Package 생성
3. 생성한 패키지에 OrderServiceTest Class 생성 후 테스트
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);
Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[이해2 - 객체 지향 원리 적용] 기획자 AppConfig (+ 새로운 할인 정책 적용 문제 해결) (0) | 2023.11.13 |
---|---|
[이해2 - 객체 지향 원리 적용] 새로운 할인 정책 도입 (+ 문제점) (0) | 2023.11.09 |
[이해1 - 예제 만들기] 회원 도메인 설계 → 개발 → 테스트 (0) | 2023.11.07 |
[이해1 - 예제 만들기] 비즈니스 요구사항과 설계 - 회원, 주문과 할인 정책 (0) | 2023.11.06 |
[이해1 - 예제 만들기] 프로젝트 생성 & 실행 (0) | 2023.11.05 |