[ T I L ] 2024.11.14

오세창·2024년 11월 14일

TIL

목록 보기
16/18

문제

@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();
    }
}

0개의 댓글