[스프링 부트] 21. DTO 리팩토링

lhs's avatar
Nov 20, 2024
[스프링 부트] 21. DTO 리팩토링
 

1. ProductDetailV2DTO

@Data public class ProductDetailV2DTO { private int productId; private String productName; private List<ProductOptionDTO> options; public ProductDetailV2DTO(List<ProductOption> options) { this.productId = options.get(0).getProduct().getId(); this.productName = options.get(0).getProduct().getName(); this.options = new ArrayList<>(); // for (ProductOption option : options) { // this.options.add(new ProductOptionDTO(option)); // } this.options = options.stream().map(ProductOptionDTO::new).toList(); } @Data private class ProductOptionDTO { private int id; private String name; private int price; private int qty; public ProductOptionDTO(ProductOption option) { this.id = option.getId(); this.name = option.getName(); this.price = option.getPrice(); this.qty = option.getQty(); } } }
  • ProductDetailV2DTO 생성자 안에서 options 리스트의 초기화를 for문에서 Stream APImap 연산자를 사용하여 간결하게 변경했다.

2. OrderDetailV2DTO

@Data public class OrderDetailV2DTO { private int orderId; private List<OrderProductDTO> products; private int sumPrice; public OrderDetailV2DTO(List<OrderOption> options) { this.orderId = options.get(0).getOrder().getId(); // for (OrderOption option : options) { // this.sumPrice += option.getTotalPrice(); // } this.sumPrice = options.stream().mapToInt(OrderOption::getTotalPrice).sum(); // Set<Integer> ids = new HashSet<>(); // for (OrderOption option : options) { // ids.add(option.getProduct().getId()); // } // for (Integer id : ids) { // List<OrderOption> temp = new ArrayList<>(); // for (OrderOption option : options) { // if(id == option.getProduct().getId()) temp.add(option); // } // OrderProductDTO product = new OrderProductDTO(temp); // products.add(product); // } this.products = new ArrayList<>(); options.stream().collect(Collectors.groupingBy(o -> o.getProduct().getId())).values().forEach(v -> products.add(new OrderProductDTO(v))); } @Data private class OrderProductDTO { private int productId; private List<OrderOptionDTO> options; public OrderProductDTO(List<OrderOption> options) { this.productId = options.get(0).getProduct().getId(); // for (OrderOption option : options) { // this.options.add(new OrderOptionDTO(option)); // } this.options = options.stream().map(OrderOptionDTO::new).toList(); } @Data private class OrderOptionDTO { private int id; private String optionName; private int qty; private int totalPrice; public OrderOptionDTO(OrderOption option) { this.id = option.getId(); this.optionName = option.getOptionName(); this.qty = option.getQty(); this.totalPrice = option.getTotalPrice(); } } } }
  • sumPriceStream APIsum 연산자를 활용하여 합을 구했다.
  • productsStream APIcollect 연산자와 groupingBy를 사용하여 필요한 id별로 그룹화하고, forEach를 사용해 OrderProductDTO를 추가했다.
  • OrderProductDTO에서는 map 연산자를 사용하여 options를 초기화했다.
Share article

LHS's Study Space