Skip to content

Commit 3bf99bc

Browse files
committed
[refactor] Order 검증 분리
- Order 생성 시 필요한 검증 및 처리를 팩토리패턴으로 분리해 처리하도록 수정
1 parent 4c103d5 commit 3bf99bc

File tree

3 files changed

+58
-52
lines changed

3 files changed

+58
-52
lines changed

src/main/java/camp/woowak/lab/order/domain/Order.java

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,9 @@
55
import java.util.Collections;
66
import java.util.List;
77

8-
import camp.woowak.lab.cart.domain.vo.CartItem;
98
import camp.woowak.lab.customer.domain.Customer;
10-
import camp.woowak.lab.menu.exception.NotEnoughStockException;
119
import camp.woowak.lab.order.domain.vo.OrderItem;
12-
import camp.woowak.lab.order.exception.EmptyCartException;
13-
import camp.woowak.lab.order.exception.MinimumOrderPriceNotMetException;
14-
import camp.woowak.lab.order.exception.MultiStoreOrderException;
15-
import camp.woowak.lab.order.exception.NotFoundMenuException;
16-
import camp.woowak.lab.payaccount.exception.InsufficientBalanceException;
17-
import camp.woowak.lab.payaccount.exception.NotFoundAccountException;
1810
import camp.woowak.lab.store.domain.Store;
19-
import camp.woowak.lab.store.exception.NotFoundStoreException;
2011
import camp.woowak.lab.vendor.domain.Vendor;
2112
import jakarta.persistence.CollectionTable;
2213
import jakarta.persistence.ElementCollection;
@@ -54,37 +45,12 @@ public class Order {
5445

5546
private LocalDateTime createdAt;
5647

57-
/**
58-
* @throws EmptyCartException 카트가 비어 있는 경우
59-
* @throws NotFoundStoreException 가게가 조회되지 않는 경우
60-
* @throws MultiStoreOrderException 여러 가게의 메뉴를 주문한 경우
61-
* @throws NotEnoughStockException 메뉴의 재고가 부족한 경우
62-
* @throws NotFoundMenuException 주문한 메뉴가 조회되지 않는 경우
63-
* @throws MinimumOrderPriceNotMetException 가게의 최소 주문금액보다 적은 금액을 주문한 경우
64-
* @throws NotFoundAccountException 구매자의 계좌가 조회되지 않는 경우
65-
* @throws InsufficientBalanceException 구매자의 계좌에 잔액이 충분하지 않은 경우
66-
*/
67-
public Order(Customer requester, List<CartItem> cartItems,
68-
SingleStoreOrderValidator singleStoreOrderValidator,
69-
StockRequester stockRequester, PriceChecker priceChecker, WithdrawPointService withdrawPointService,
70-
LocalDateTime createdAt) {
71-
Store store = singleStoreOrderValidator.check(cartItems);
72-
73-
List<CartItem> stockDecreaseSuccessCartItems = null;
74-
try {
75-
stockDecreaseSuccessCartItems = stockRequester.request(cartItems);
76-
List<OrderItem> orderItems = priceChecker.check(store, cartItems);
77-
withdrawPointService.withdraw(requester, orderItems);
78-
this.requester = requester;
79-
this.store = store;
80-
this.orderItems = orderItems;
81-
this.createdAt = createdAt;
82-
} catch (Exception e) {
83-
if (stockDecreaseSuccessCartItems != null) {
84-
stockRequester.rollback(stockDecreaseSuccessCartItems);
85-
}
86-
throw e;
87-
}
48+
public Order(Customer requester
49+
, Store store, List<OrderItem> orderItems, LocalDateTime createdAt) {
50+
this.requester = requester;
51+
this.store = store;
52+
this.orderItems = orderItems;
53+
this.createdAt = createdAt;
8854
}
8955

9056
public Customer getRequester() {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package camp.woowak.lab.order.domain;
2+
3+
import java.util.List;
4+
5+
import org.springframework.stereotype.Component;
6+
7+
import camp.woowak.lab.cart.domain.vo.CartItem;
8+
import camp.woowak.lab.customer.domain.Customer;
9+
import camp.woowak.lab.infra.date.DateTimeProvider;
10+
import camp.woowak.lab.order.domain.vo.OrderItem;
11+
import camp.woowak.lab.store.domain.Store;
12+
13+
@Component
14+
public class OrderFactory {
15+
private final SingleStoreOrderValidator singleStoreOrderValidator;
16+
private final StockRequester stockRequester;
17+
private final PriceChecker priceChecker;
18+
private final WithdrawPointService withdrawPointService;
19+
private final DateTimeProvider dateTimeProvider;
20+
21+
public OrderFactory(SingleStoreOrderValidator singleStoreOrderValidator,
22+
StockRequester stockRequester,
23+
PriceChecker priceChecker,
24+
WithdrawPointService withdrawPointService, DateTimeProvider dateTimeProvider) {
25+
this.singleStoreOrderValidator = singleStoreOrderValidator;
26+
this.stockRequester = stockRequester;
27+
this.priceChecker = priceChecker;
28+
this.withdrawPointService = withdrawPointService;
29+
this.dateTimeProvider = dateTimeProvider;
30+
}
31+
32+
public Order createOrder(Customer requester, List<CartItem> cartItems) {
33+
Store store = singleStoreOrderValidator.check(cartItems);
34+
35+
List<CartItem> stockDecreaseSuccessCartItems = null;
36+
try {
37+
stockDecreaseSuccessCartItems = stockRequester.request(cartItems);
38+
List<OrderItem> orderItems = priceChecker.check(store, cartItems);
39+
withdrawPointService.withdraw(requester, orderItems);
40+
41+
return new Order(requester, store, orderItems, dateTimeProvider.now());
42+
} catch (Exception e) {
43+
if (stockDecreaseSuccessCartItems != null) {
44+
stockRequester.rollback(stockDecreaseSuccessCartItems);
45+
}
46+
throw e;
47+
}
48+
}
49+
}

src/main/java/camp/woowak/lab/order/service/OrderCreationService.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,9 @@
1212
import camp.woowak.lab.customer.domain.Customer;
1313
import camp.woowak.lab.customer.repository.CustomerRepository;
1414
import camp.woowak.lab.infra.aop.DistributedLock;
15-
import camp.woowak.lab.infra.date.DateTimeProvider;
1615
import camp.woowak.lab.menu.exception.NotEnoughStockException;
1716
import camp.woowak.lab.order.domain.Order;
18-
import camp.woowak.lab.order.domain.PriceChecker;
19-
import camp.woowak.lab.order.domain.SingleStoreOrderValidator;
20-
import camp.woowak.lab.order.domain.StockRequester;
21-
import camp.woowak.lab.order.domain.WithdrawPointService;
17+
import camp.woowak.lab.order.domain.OrderFactory;
2218
import camp.woowak.lab.order.exception.DuplicatedOrderException;
2319
import camp.woowak.lab.order.exception.EmptyCartException;
2420
import camp.woowak.lab.order.exception.MinimumOrderPriceNotMetException;
@@ -41,13 +37,9 @@ public class OrderCreationService {
4137
private final OrderRepository orderRepository;
4238
private final CartRepository cartRepository;
4339
private final CustomerRepository customerRepository;
44-
private final SingleStoreOrderValidator singleStoreOrderValidator;
45-
private final StockRequester stockRequester;
46-
private final WithdrawPointService withdrawPointService;
47-
private final PriceChecker priceChecker;
4840
private final OrderPaymentRepository orderPaymentRepository;
4941

50-
private final DateTimeProvider dateTimeProvider;
42+
private final OrderFactory orderFactory;
5143

5244
/**
5345
* @throws EmptyCartException 카트가 비어 있는 경우
@@ -68,8 +60,7 @@ public Long create(final OrderCreationCommand cmd) {
6860
List<CartItem> cartItems = cart.getCartItems();
6961

7062
Order savedOrder = orderRepository.save(
71-
new Order(requester, cartItems, singleStoreOrderValidator, stockRequester, priceChecker,
72-
withdrawPointService, dateTimeProvider.now())
63+
orderFactory.createOrder(requester, cartItems)
7364
);
7465

7566
saveOrderPayment(savedOrder);

0 commit comments

Comments
 (0)