@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class OrderMenuDTO {
@JsonIgnore
private Long orderId;
private Long orderMenuId;
private UUID menuId;
private String menuName;
private int menuPrice;
private int count;
public static Map<Long, List<OrderMenuDTO>> from(List<OrderMenu> orderMenus) {
List<OrderMenuDTO> list = getOrderMenuDTOS(orderMenus);
return list.stream()
.collect(Collectors.groupingBy(orderMenuDTO -> orderMenuDTO.orderId));
}
private static List<OrderMenuDTO> getOrderMenuDTOS(List<OrderMenu> orderMenus) {
return orderMenus.stream()
.map(OrderMenuDTO::from)
.toList();
}
public static OrderMenuDTO from(OrderMenu orderMenu) {
return OrderMenuDTO.builder()
.orderId(orderMenu.getOrder().getId())
.orderMenuId(orderMenu.getId())
.menuId(orderMenu.getMenu().getMenuId())
.menuName(orderMenu.getMenu().getMenuName())
.menuPrice(orderMenu.getOrderPrice())
.count(orderMenu.getOrderCount())
.build();
}
}
위와 같이 OrderMen 엔티티를 DTO 로 변환 후 JsonIgnore 처리 된 orderId 를 이용하여 Map<Long, List<OrderMenuDTO>> 를 생성하는 로직을 구현하였다.
이에 대해, OrderMen 에서 Map<Long, List<OrderMenuDTO>> 로 변환되는 과정을 하나로 줄이고, 이 과정을 통해 orderId 필드도 굳이 사용하지 않아도 되니, 해당 방향으로 리팩토링을 하는 게 어떻냐는 제안을 받았다.
private static Map<Long, List<OrderMenuDTO>> from(List<OrderMenu> orderMenus) {
return orderMenus.stream()
.collect(Collectors.groupingBy(
orderMenu -> orderMenu.getOrder().getId(),
Collectors.mapping(
OrderMenuDTO::from,
Collectors.toList()
)
));
}
리팩토링은 간단했다.
OrderMenu 의 리스트에 grouping 메서드를 통해 orderId 를 추출하면서 Key 로 가지게 하고, value 에는 OrderDTO 로 변환하는 메서드를 이용해 즉각적으로 Map 을 생성하게 하였다.
이렇게 개선하니 메서드도 간결해지고, 불필요한 필드값도 제거할 수 있게 되었다.
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class OrderMenuDTO {
private Long orderMenuId;
private UUID menuId;
private String menuName;
private int menuPrice;
private int count;
private static Map<Long, List<OrderMenuDTO>> from(List<OrderMenu> orderMenus) {
return orderMenus.stream()
.collect(Collectors.groupingBy(
orderMenu -> orderMenu.getOrder().getId(),
Collectors.mapping(
OrderMenuDTO::from,
Collectors.toList()
)
));
}
public static OrderMenuDTO from(OrderMenu orderMenu) {
return OrderMenuDTO.builder()
.orderMenuId(orderMenu.getId())
.menuId(orderMenu.getMenu().getMenuId())
.menuName(orderMenu.getMenu().getMenuName())
.menuPrice(orderMenu.getOrderPrice())
.count(orderMenu.getOrderCount())
.build();
}
}