Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 구매자는 장바구니에 담긴 상품을 주문할 수 있다 #80

Conversation

Dr-KoKo
Copy link
Member

@Dr-KoKo Dr-KoKo commented Aug 15, 2024

💡 다음 이슈를 해결했어요.

Issue Link - #69

검증 요구사항

  • 한 번에 한개의 가게에서만 음식 상품을 주문할 수 있다.
  • 한 번에 여러 종류의 음식 상품을 주문할 수 있다.

기능 요구사항

  • 메뉴의 재고가 삭감된다. 없으면 음식 상품을 주문할 수 없다.
  • 보유하고 있는 캐시 금액 만큼 물건을 주문할 수 있다.

💡 이슈를 처리하면서 추가된 코드가 있어요.

  • Cart의 생성자 변경
     /**
      * 생성될 때 무조건 cart가 비어있도록 구현
      *
      * @param customerId 장바구니 소유주의 ID값입니다.
      */
     public Cart(String customerId) {
     	this(customerId, new LinkedList<>());
     }
    
     /**
      * 해당 Domain을 사용하는 같은 패키지내의 클래스, 혹은 자식 클래스는 List를 커스텀할 수 있습니다.
      *
      * @param customerId 장바구니 소유주의 ID값입니다.
      * @param cartItems   장바구니에 사용될 List입니다.
      */
     protected Cart(String customerId, List<CartItem> cartItems) {
     	this.customerId = customerId;
     	this.cartItems = cartItems;
     }
    • 카트는 (Menu가 아니라) CartItem 리스트를 가지게 변경되었습니다.
  • Order 생성자 변경
     public Order(Customer requester, Store store, List<CartItem> cartItems,
     			 SingleStoreOrderValidator singleStoreOrderValidator,
     			 StockRequester stockRequester, PriceChecker priceChecker, WithdrawPointService withdrawPointService) {
     	singleStoreOrderValidator.check(store, cartItems);
     	stockRequester.request(cartItems);
     	List<OrderItem> orderItems = priceChecker.check(cartItems);
     	withdrawPointService.withdraw(requester, orderItems);
     	this.requester = requester;
     	this.store = store;
     	this.orderItems = orderItems;
     }
  • 도메인 서비스 구현: SingleStoreOrderValidator, StockRequester, PriceChecker, WithdrawPointService

💡 이런 고민을 했어요.

  • Order 생성 전에 검증 및 수반되어야 하는 로직들이 있는데 어떻게 Order 생성자에 강제할 수 있을지

✅ 셀프 체크리스트

  • 내 코드를 스스로 검토했습니다.
  • 필요한 테스트를 추가했습니다.
  • 모든 테스트를 통과합니다.
  • 브랜치 전략에 맞는 브랜치에 PR을 올리고 있습니다.
  • 커밋 메세지를 컨벤션에 맞추었습니다.
  • wiki를 수정했습니다.

주문하기 전에 OrderValidator를 통해 검증한다.
동일한 가게에 대한 주문인지 검증
잔고가 부족하면 주문할 수 없습니다.
Composite 패턴으로 Validator를 Order 생성자에 넘긴다.
@Dr-KoKo Dr-KoKo force-pushed the feature/69_Dr-KoKo_구매자는_장바구니에_담긴_상품을_주문할_수_있다 branch from de6852b to cb53e35 Compare August 16, 2024 04:41
수량을 반영하기 위해 MenuId를 가지는 CartItem으로 수정
상품의 가격은 변동될 수 있습니다.
카트에 담긴 상품의 총합은 (카트에 담긴 시점의 가격이 아니라) 변동된 가격을 기준으로 계산되어야 합니다.
Cart.getTotalPrice 삭제로 인한 테스트 코드 수정
Menu -> CartItem 으로 인한 테스트 코드 수정
주문 생성시 1)동일한 가게의 메뉴에 대한 주문인지 2)재고가 있는지 검증 후 생성한다.
주문 생성시 해당 메뉴의 재고를 삭감하는 서비스
주문은 같은 가게의 메뉴만 주문할 수 있다.
주문은 1)같은 가게의 메뉴에 대해 2)재고가 있고 3)결제할 포인트가 충분할 때 진행할 수 있다.
Menu의 현재 가격으로 OrderItem을 만들어주는 검증 서비스
주문 금액만큼 사용자의 계좌에서 차감하는 서비스
Optional.orElseThrow() 활용해서 if-else문 제거
@Dr-KoKo Dr-KoKo requested review from Hyeon-Uk and june-777 and removed request for Hyeon-Uk August 16, 2024 14:30
@Dr-KoKo Dr-KoKo requested review from kimhyun5u, Hyeon-Uk and june-777 and removed request for june-777 and kimhyun5u August 16, 2024 14:30
@Dr-KoKo Dr-KoKo marked this pull request as ready for review August 16, 2024 14:30
@Dr-KoKo Dr-KoKo requested a review from kimhyun5u August 16, 2024 14:33
Copy link
Contributor

@Hyeon-Uk Hyeon-Uk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사소한 로그에 대한 추가 요구사항입니다!

현재 Menu의 가격을 조회하면서 최소 주문금액 이상을 주문하였는지 확인
현재 Menu의 가격을 조회하면서 최소 주문금액 이상을 주문하였는지 확인
Copy link
Member

@kimhyun5u kimhyun5u left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다

Copy link
Member

@june-777 june-777 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

궁금한점 리뷰 남겼습니다 :)

OrderCreationService에서 Store를 조회하던 로직 제거
SingleStoreOrderValidator에서 검증된 단일 Store를 반환
OrderCreationService에서 Store를 조회하던 로직 제거
SingleStoreOrderValidator에서 검증된 단일 Store를 반환
메뉴의 재고가 부족하면 NotEnoughStockExceptioh이 발생합니다.
Copy link
Member

@june-777 june-777 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

궁금한 점 코멘트 남겼습니다!
일단 approve하고, 조금 더 디테일한 논의는 discussion에 기록해두겠습니다!

@Dr-KoKo Dr-KoKo merged commit a3079a1 into main Aug 17, 2024
1 check passed
@kimhyun5u kimhyun5u deleted the feature/69_Dr-KoKo_구매자는_장바구니에_담긴_상품을_주문할_수_있다 branch August 22, 2024 04:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ Feature 기능 개발
Projects
Status: Done
4 participants