From 98ab8729d5b7fbd724711bf2ff5db6fd99216bfe Mon Sep 17 00:00:00 2001 From: daadaadaah Date: Sat, 15 Jul 2023 19:37:34 +0900 Subject: [PATCH] =?UTF-8?q?`Optional`=20=EB=8C=80=EC=8B=A0=20`Int?= =?UTF-8?q?eger`=20=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=A8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=EC=8D=A8=20=EC=A7=81=EB=A0=AC=ED=99=94=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=9D=B4=EC=8A=88=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/OrderFormSavedInAdvanceEntity.java | 11 +++++++---- .../heecommerce/order/OrderService.java | 18 +++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hcommerce/heecommerce/order/OrderFormSavedInAdvanceEntity.java b/src/main/java/com/hcommerce/heecommerce/order/OrderFormSavedInAdvanceEntity.java index a4762c93..fd962a16 100644 --- a/src/main/java/com/hcommerce/heecommerce/order/OrderFormSavedInAdvanceEntity.java +++ b/src/main/java/com/hcommerce/heecommerce/order/OrderFormSavedInAdvanceEntity.java @@ -1,16 +1,19 @@ package com.hcommerce.heecommerce.order; -import java.util.Optional; import lombok.Builder; import lombok.Getter; /** * OrderFormSavedInAdvanceEntity 는 주문 내역 사전 저장에 필요한 클래스이다. * - * 특히, originalOrderQuantityForPartialOrder 에 Integer 를 사용한 이유는 쿼리를 단순화 하고 싶었기 떄문이다. + * originalOrderQuantityForPartialOrder 를 Integer 로 데이터 타입을 정한 이유 + * Q1) int 대신 Integer 사용한 이유 + * 쿼리를 단순화 하고 싶었기 떄문이다. * order 테이블에서 originalOrderQuantityForPartialOrder 는 부분 주문이 아닌 전체 주문인 경우에 Null 값을 갖는다. * 그런데, int 의 경우, null 값을 허용하지 않아, 동적 쿼리를 필요로 하는데, 쿼리 작성이 복잡해지는 경향이 있다. * 이에 null 값을 허용하는 Integer 로 데이터 타입을 바꿔 동적 쿼리를 제거할 수 있었다. + * + * Q2) Optional 도 가능할 것 같은데, Integer 사용한 이유 : https://github.com/f-lab-edu/hee-commerce/issues/143 참고 */ @Getter public class OrderFormSavedInAdvanceEntity { @@ -20,7 +23,7 @@ public class OrderFormSavedInAdvanceEntity { private final int userId; private final OutOfStockHandlingOption outOfStockHandlingOption; private final byte[] dealProductUuid; - private final Optional originalOrderQuantityForPartialOrder; + private final Integer originalOrderQuantityForPartialOrder; private final int realOrderQuantity; private final int totalPaymentAmount; private final PaymentMethod paymentMethod; @@ -32,7 +35,7 @@ public OrderFormSavedInAdvanceEntity( int userId, OutOfStockHandlingOption outOfStockHandlingOption, byte[] dealProductUuid, - Optional originalOrderQuantityForPartialOrder, + Integer originalOrderQuantityForPartialOrder, int realOrderQuantity, int totalPaymentAmount, PaymentMethod paymentMethod, diff --git a/src/main/java/com/hcommerce/heecommerce/order/OrderService.java b/src/main/java/com/hcommerce/heecommerce/order/OrderService.java index 47ebf2d6..96292e34 100644 --- a/src/main/java/com/hcommerce/heecommerce/order/OrderService.java +++ b/src/main/java/com/hcommerce/heecommerce/order/OrderService.java @@ -8,7 +8,6 @@ import com.hcommerce.heecommerce.deal.TimeDealProductDetail; import com.hcommerce.heecommerce.inventory.InventoryCommandRepository; import com.hcommerce.heecommerce.inventory.InventoryQueryRepository; -import java.util.Optional; import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RedissonClient; @@ -223,24 +222,29 @@ private void validateOrderQuantityInMaxOrderQuantityPerOrder(UUID dealProductUui * 이 함수가 필요한 이유는 다음 3가지 때문이다. * 1. UUID * - UUID 는 DB에 저장될 때 byte[] 로 저장되기 때문에, UUID -> byte[] 타입 변환이 필요하다. - * 2. 부분 주문 - * - 실제 주문 수량과 다르게 주문이 접수되는 경우도 있기 때문이다. - * 3. 총 결제 금액 + * 2. 총 결제 금액 * - 총 결제 금액을 위변조 방지를 위해 클라이언트에서 받은 값이 아닌 DB에 있는 데이터를 기반으로 계산하기 때문이다. + * 3. 부분 주문 + * - 실제 주문 수량과 다르게 주문이 접수되는 경우도 있기 때문이다. */ private OrderFormSavedInAdvanceEntity createOrderFormSavedInAdvanceEntity(OrderForm orderForm, int realOrderQuantity) { + // 1. UUID + byte[] uuid = TypeConversionUtils.convertUuidToBinary(orderForm.getOrderUuid()); + + // 2. 총 결제 금액 TimeDealProductDetail timeDealProductDetail = dealProductQueryRepository.getTimeDealProductDetailByDealProductUuid(orderForm.getDealProductUuid()); int totalPaymentAmount = calculateTotalPaymentAmount(timeDealProductDetail.getProductOriginPrice(), realOrderQuantity, timeDealProductDetail.getDealProductDiscountType(), timeDealProductDetail.getDealProductDiscountValue()); - Optional originalOrderQuantityForPartialOrder = null; // 부분 주문이 아닌 경우 값으로, Null 값을 가지므로, + // 3. 부분 주문 + Integer originalOrderQuantityForPartialOrder = null; // 부분 주문이 아닌 경우 값으로, Null 값을 가지므로, if(orderForm.getOutOfStockHandlingOption() == OutOfStockHandlingOption.PARTIAL_ORDER) { - originalOrderQuantityForPartialOrder = Optional.of(orderForm.getOrderQuantity()); + originalOrderQuantityForPartialOrder = orderForm.getOrderQuantity(); } return OrderFormSavedInAdvanceEntity.builder() - .uuid(TypeConversionUtils.convertUuidToBinary(orderForm.getOrderUuid())) + .uuid(uuid) .userId(orderForm.getUserId()) .recipientInfoForm(orderForm.getRecipientInfoForm()) .outOfStockHandlingOption(orderForm.getOutOfStockHandlingOption())