Skip to content

Commit

Permalink
Merge pull request #144 from daadaadaah/fix/use-Integer-instead-of-Op…
Browse files Browse the repository at this point in the history
…tional

`Optional<Integer>` 대신 `Integer` 을 사용함으로써 직렬화 안되는 이슈 해결
  • Loading branch information
daadaadaah authored Jul 15, 2023
2 parents 428be8b + 98ab872 commit 614109d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -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> 도 가능할 것 같은데, Integer 사용한 이유 : https://github.com/f-lab-edu/hee-commerce/issues/143 참고
*/
@Getter
public class OrderFormSavedInAdvanceEntity {
Expand All @@ -20,7 +23,7 @@ public class OrderFormSavedInAdvanceEntity {
private final int userId;
private final OutOfStockHandlingOption outOfStockHandlingOption;
private final byte[] dealProductUuid;
private final Optional<Integer> originalOrderQuantityForPartialOrder;
private final Integer originalOrderQuantityForPartialOrder;
private final int realOrderQuantity;
private final int totalPaymentAmount;
private final PaymentMethod paymentMethod;
Expand All @@ -32,7 +35,7 @@ public OrderFormSavedInAdvanceEntity(
int userId,
OutOfStockHandlingOption outOfStockHandlingOption,
byte[] dealProductUuid,
Optional<Integer> originalOrderQuantityForPartialOrder,
Integer originalOrderQuantityForPartialOrder,
int realOrderQuantity,
int totalPaymentAmount,
PaymentMethod paymentMethod,
Expand Down
18 changes: 11 additions & 7 deletions src/main/java/com/hcommerce/heecommerce/order/OrderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Integer> 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())
Expand Down

0 comments on commit 614109d

Please sign in to comment.