Skip to content

Commit 298951b

Browse files
authored
장바구니 api 호출시 에러 발생 해결 (#387)
1 parent e512b32 commit 298951b

File tree

3 files changed

+69
-31
lines changed

3 files changed

+69
-31
lines changed

src/main/java/com/back/domain/cart/entity/Cart.java

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -126,43 +126,49 @@ public boolean isFundingCart() {
126126
return this.cartType == CartType.FUNDING;
127127
}
128128

129-
// 유효한 장바구니 아이템인지 확인
129+
// 유효한 장바구니 아이템인지 확인 (null-safe)
130130
public boolean isValid() {
131-
// 수량 검증
132-
if (this.quantity <= 0) {
131+
// 1) 수량 검증 (null 또는 1 미만이면 무효)
132+
if (this.quantity == null || this.quantity <= 0) {
133133
return false;
134134
}
135-
135+
136+
// 2) 펀딩 장바구니 검증
136137
if (isFundingCart()) {
137-
// 펀딩 장바구니 검증
138138
if (this.funding == null) {
139139
return false;
140140
}
141-
// fundingStock이 설정되어 있으면 그것을 기준으로, 없으면 funding의 stock 사용
142-
int availableStock = (this.fundingStock != null) ? this.fundingStock : this.funding.getStock();
143-
return this.quantity <= availableStock;
144-
} else {
145-
// 일반 장바구니 검증
146-
if (this.product == null) {
147-
return false;
148-
}
149-
150-
// 상품이 삭제되지 않았고 재고가 있는지
151-
if (this.product.isDeleted() || this.product.getStock() <= 0) {
141+
Integer fundingStockFromEntity = this.funding.getStock();
142+
int availableStock = (this.fundingStock != null)
143+
? this.fundingStock
144+
: (fundingStockFromEntity != null ? fundingStockFromEntity : 0);
145+
146+
if (availableStock <= 0) {
152147
return false;
153148
}
154-
155-
// 일반 재고 확인
156-
return this.quantity <= this.product.getStock();
149+
return this.quantity <= availableStock;
150+
}
151+
152+
// 3) 일반 장바구니 검증
153+
if (this.product == null) {
154+
return false;
157155
}
156+
if (this.product.isDeleted()) {
157+
return false;
158+
}
159+
Integer productStock = this.product.getStock();
160+
if (productStock == null || productStock <= 0) {
161+
return false;
162+
}
163+
return this.quantity <= productStock;
158164
}
159165

160-
// 총 가격 계산
166+
// 총 가격 계산 (null-safe)
161167
public int getTotalPrice() {
168+
int qty = (this.quantity != null && this.quantity > 0) ? this.quantity : 0;
162169
int unitPrice;
163-
170+
164171
if (isFundingCart()) {
165-
// 펀딩 장바구니: fundingPrice 사용
166172
if (this.fundingPrice != null) {
167173
unitPrice = this.fundingPrice;
168174
} else if (this.funding != null) {
@@ -171,14 +177,21 @@ public int getTotalPrice() {
171177
return 0;
172178
}
173179
} else {
174-
// 일반 장바구니: Product 가격 사용
175180
if (this.product == null) {
176181
return 0;
177182
}
178-
unitPrice = this.product.getDiscountPrice();
183+
Integer discount = this.product.getDiscountPrice();
184+
Integer basePrice = this.product.getPrice();
185+
if (discount != null) {
186+
unitPrice = discount;
187+
} else if (basePrice != null) {
188+
unitPrice = basePrice;
189+
} else {
190+
return 0;
191+
}
179192
}
180-
181-
return unitPrice * this.quantity;
193+
194+
return unitPrice * qty;
182195
}
183196

184197
// ===== 도메인 메서드 (선택 상태 조회) =====

src/main/java/com/back/domain/cart/service/CartService.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ public void validateCartItemsForOrder(User user, boolean isFullOrder) {
298298
throw new ServiceException("CART_EMPTY", "주문할 장바구니 아이템이 없습니다.");
299299
}
300300

301+
// 레거시 데이터 보정 (펀딩 price/stock 누락 대비)
302+
cartItems.forEach(this::normalizeCartFields);
303+
301304
// 각 아이템의 유효성 검증
302305
for (Cart cart : cartItems) {
303306
if (!cart.isValid()) {
@@ -319,13 +322,35 @@ public void validateCartItemsForOrder(User user, boolean isFullOrder) {
319322
}
320323
}
321324

325+
private void normalizeCartFields(Cart cart) {
326+
if (cart.isFundingCart() && cart.getFunding() != null) {
327+
if (cart.getFundingPrice() == null) {
328+
cart.updateFundingInfo(
329+
cart.getFundingId(),
330+
(int) cart.getFunding().getPrice(),
331+
cart.getFundingStock()
332+
);
333+
}
334+
if (cart.getFundingStock() == null) {
335+
cart.updateFundingInfo(
336+
cart.getFundingId(),
337+
cart.getFundingPrice(),
338+
cart.getFunding().getStock()
339+
);
340+
}
341+
}
342+
}
343+
322344
/**
323345
* 장바구니 총 금액 계산 (전체/선택)
324346
*/
325347
public Integer calculateTotalAmount(User user, boolean isFullOrder) {
326348
List<Cart> cartItems = isFullOrder ?
327349
cartRepository.findByUserWithProduct(user) :
328-
cartRepository.findByUserAndIsSelectedTrue(user);
350+
cartRepository.findByUserAndIsSelectedTrueWithProduct(user);
351+
352+
// 레거시 보정(펀딩 price/stock 누락 대비)
353+
cartItems.forEach(this::normalizeCartFields);
329354

330355
return cartItems.stream()
331356
.filter(Cart::isValid)

src/test/java/com/back/domain/cart/service/CartServiceTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -560,12 +560,12 @@ void validateCartItemsForOrder_SelectedOrder_Success() {
560560
// Given
561561
testNormalCart.select();
562562
List<Cart> selectedCarts = Arrays.asList(testNormalCart);
563-
given(cartRepository.findByUserAndIsSelectedTrue(testUser)).willReturn(selectedCarts);
563+
given(cartRepository.findByUserAndIsSelectedTrueWithProduct(testUser)).willReturn(selectedCarts);
564564

565565
// When & Then
566566
cartService.validateCartItemsForOrder(testUser, false);
567567

568-
verify(cartRepository).findByUserAndIsSelectedTrue(testUser);
568+
verify(cartRepository).findByUserAndIsSelectedTrueWithProduct(testUser);
569569
}
570570

571571
@Test
@@ -601,14 +601,14 @@ void calculateTotalAmount_SelectedOrder_Success() {
601601
// Given
602602
testNormalCart.select();
603603
List<Cart> selectedCarts = Arrays.asList(testNormalCart);
604-
given(cartRepository.findByUserAndIsSelectedTrue(testUser)).willReturn(selectedCarts);
604+
given(cartRepository.findByUserAndIsSelectedTrueWithProduct(testUser)).willReturn(selectedCarts);
605605

606606
// When
607607
Integer result = cartService.calculateTotalAmount(testUser, false);
608608

609609
// Then
610610
assertThat(result).isNotNull();
611-
verify(cartRepository).findByUserAndIsSelectedTrue(testUser);
611+
verify(cartRepository).findByUserAndIsSelectedTrueWithProduct(testUser);
612612
}
613613

614614
@Test

0 commit comments

Comments
 (0)