Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.nowait.applicationadmin.order.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class MenuDetail {
private int quantity;
private int price;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.nowait.applicationadmin.order.dto;

import java.time.LocalDateTime;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;

import com.nowait.domaincorerdb.order.entity.OrderItem;
import com.nowait.domaincorerdb.order.entity.OrderStatus;
Expand All @@ -20,25 +19,37 @@ public class OrderResponseDto {
private String depositorName;
private Integer totalPrice;
private OrderStatus status;
private Map<String, Integer> menuNamesAndQuantities;
private Map<String, MenuDetail> menuDetails;
private LocalDateTime createdAt;

public static OrderResponseDto fromEntity(UserOrder userOrder) {
Map<String, Integer> menuNamesAndQuantities = userOrder.getOrderItems().stream()
.collect(Collectors.toMap(
orderItem -> orderItem.getMenu().getName(),
OrderItem::getQuantity,
Integer::sum // 메뉴명이 중복일 때 수량 합침
));
Map<String, MenuDetail> menuDetails = new LinkedHashMap<>();

for (OrderItem item : userOrder.getOrderItems()) {
String name = item.getMenu().getName();
int quantity = item.getQuantity();
int price = item.getMenu().getPrice(); // 메뉴 단가

// 메뉴명이 중복되면 수량만 누적
// merge 람다함수 활용(해당 key가 있으면 수량 누적, 없으면 새로 생성)
menuDetails.merge(name,
new MenuDetail(quantity, price),
(oldVal, newVal) -> new MenuDetail(
oldVal.getQuantity() + newVal.getQuantity(),
oldVal.getPrice() // 단가는 동일하다는 가정
)
);
}
Comment on lines +28 to +42
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

동일 메뉴명의 서로 다른 가격 처리 로직을 검증해주세요.

현재 구현에서 잠재적인 문제가 있습니다:

Line 39의 주석에서 "단가는 동일하다는 가정"을 하고 있지만, 실제로 동일한 메뉴명이지만 다른 가격을 가진 경우(예: 사이즈별 가격 차이, 프로모션 등)에 대한 처리가 부족합니다.

다음 스크립트로 동일 메뉴명에 대한 서로 다른 가격 케이스가 존재하는지 확인해보세요:

만약 동일 메뉴명에 다른 가격이 있을 수 있다면, merge 로직을 다음과 같이 개선하는 것을 고려해보세요:

menuDetails.merge(name,
    new MenuDetail(quantity, price),
    (oldVal, newVal) -> {
        if (!oldVal.getPrice().equals(newVal.getPrice())) {
            // 로깅 또는 예외 처리
            log.warn("동일 메뉴명 '{}' 에 대해 서로 다른 가격 발견: {} vs {}", 
                     name, oldVal.getPrice(), newVal.getPrice());
        }
        return new MenuDetail(
            oldVal.getQuantity() + newVal.getQuantity(),
            oldVal.getPrice() // 또는 적절한 가격 결합 로직
        );
    }
);

🏁 Script executed:

#!/bin/bash
# 동일 메뉴명이지만 다른 가격을 가진 케이스 확인
ast-grep --pattern $'class Menu {
  $$$
  private String name;
  $$$
  private int price;
  $$$
}'

Length of output: 99


동일 메뉴명에 대한 가격 차이 여부를 확인하기 위해 Menu 클래스 정의를 조회해 주세요.


🏁 Script executed:

#!/bin/bash
# Menu.java 파일 위치 탐색 및 상위 200줄 출력
fd -t f "Menu.java" | xargs -I{} sed -n '1,200p' {}

Length of output: 1906


동일 메뉴명 그룹화 시 가격 차이 처리 검증 및 개선 제안

현재 OrderResponseDto.java(28–42행)의 merge 로직은 “단가는 동일하다는 가정” 하에 이름(name)만으로만 그룹화하기 때문에, 동일한 메뉴명으로 가격이 다른 경우(예: 프로모션, 사이즈별 옵션 미반영 등) 잘못된 합산 결과를 낼 수 있습니다.
코드베이스 상에서 Menu 엔티티에는 이름(name)에 대한 유니크 제약이 없고, 가격(price) 필드가 Integer 타입으로 선언되어 있어 실제로 같은 이름의 메뉴에 서로 다른 가격이 부여될 가능성이 존재합니다.

점을 확인해 보시고, 아래 중 하나 이상의 조치를 고려해 주세요:

  • 그룹 키를 메뉴명(name) 대신 메뉴 ID(menu.getId()) 또는 이름+가격 조합으로 변경
  • 동일 메뉴명끼리 묶되, 가격 불일치 시 로그 출력 또는 예외 발생 로직 추가
  • 가격 차이가 발생하지 않도록 DB나 서비스 레이어에서 메뉴명 유일성(unique) 보장

예시 개선안:

- menuDetails.merge(name,
-     new MenuDetail(quantity, price),
-     (oldVal, newVal) -> new MenuDetail(
-         oldVal.getQuantity() + newVal.getQuantity(),
-         oldVal.getPrice()
-     )
- );
+ menuDetails.merge(name,
+     new MenuDetail(quantity, price),
+     (oldVal, newVal) -> {
+         if (!oldVal.getPrice().equals(newVal.getPrice())) {
+             log.warn("동일 메뉴명 '{}' 에 대해 서로 다른 가격 발견: {} vs {}",
+                      name, oldVal.getPrice(), newVal.getPrice());
+         }
+         return new MenuDetail(
+             oldVal.getQuantity() + newVal.getQuantity(),
+             oldVal.getPrice()
+         );
+     }
+ );
  • 파일: nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java (28–42행)

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java
around lines 28 to 42, the current merge logic groups order items by menu name
assuming the price is always the same, which can cause incorrect aggregation if
prices differ for the same menu name. To fix this, change the grouping key to
use a unique identifier such as menu ID or a combination of menu name and price.
Alternatively, add logic to detect price mismatches during merging and either
log a warning or throw an exception. This ensures accurate aggregation of
quantities without mixing items of different prices.


return OrderResponseDto.builder()
.id(userOrder.getId())
.tableId(userOrder.getTableId())
.depositorName(userOrder.getDepositorName())
.totalPrice(userOrder.getTotalPrice())
.status(userOrder.getStatus())
.menuNamesAndQuantities(menuNamesAndQuantities)
.menuDetails(menuDetails)
.createdAt(userOrder.getCreatedAt())
.build();
}
}