/api/OrderApiController.java
import jpabook.jpashop.domain.Address;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderItem;
import jpabook.jpashop.domain.OrderStatus;
import jpabook.jpashop.repository.OrderRepository;
import jpabook.jpashop.repository.OrderSearch;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
public class OrderApiController {
private final OrderRepository orderRepository;
/**
* V1. ์ํฐํฐ ์ง์ ๋
ธ์ถ
* - Hibernate5Module ๋ชจ๋ ๋ฑ๋ก, LAZY=null ์ฒ๋ฆฌ
* - ์๋ฐฉํฅ ๊ด๊ณ ๋ฌธ์ ๋ฐ์ -> @JsonIgnore
*/
@GetMapping("/api/v1/orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
for (Order order : all) {
order.getMember().getName(); // Lazy ๊ฐ์ ์ด๊ธฐํ
order.getDelivery().getAddress(); // Lazy ๊ฐ์ ์ด๊ธฐํ
List<OrderItem> orderItems = order.getOrderItems();
orderItems.stream().forEach(o -> o.getItem().getName()); // Lazy ๊ฐ์ ์ด๊ธฐํ
}
return all;
}
}
orderItem
, item
๊ด๊ณ๋ฅผ ์ง์ ์ด๊ธฐํํ๋ฉด Hibernate5Module
์ค์ ์ ์ํด ์ํฐํฐ๋ฅผ JSON
์ผ๋ก ์์ฑํ๋ค.@JsonIgnore
๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
OrderApiController.java
import jpabook.jpashop.domain.Address;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderItem;
import jpabook.jpashop.domain.OrderStatus;
import jpabook.jpashop.repository.OrderRepository;
import jpabook.jpashop.repository.OrderSearch;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
public class OrderApiController {
private final OrderRepository orderRepository;
/**
* V1. ์ํฐํฐ ์ง์ ๋
ธ์ถ
* - Hibernate5Module ๋ชจ๋ ๋ฑ๋ก, LAZY=null ์ฒ๋ฆฌ
* - ์๋ฐฉํฅ ๊ด๊ณ ๋ฌธ์ ๋ฐ์ -> @JsonIgnore
*/
@GetMapping("/api/v1/orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
for (Order order : all) {
order.getMember().getName(); // Lazy ๊ฐ์ ์ด๊ธฐํ
order.getDelivery().getAddress(); // Lazy ๊ฐ์ ์ด๊ธฐํ
List<OrderItem> orderItems = order.getOrderItems();
orderItems.stream().forEach(o -> o.getItem().getName()); // Lazy ๊ฐ์ ์ด๊ธฐํ
}
return all;
}
**/**
* V2. ์ํฐํฐ๋ฅผ ์กฐํํด์ DTO๋ก ๋ณํ(fetch join ์ฌ์ฉX)
* - ํธ๋์ญ์
์์์ ์ง์ฐ ๋ก๋ฉ ํ์
*/
@GetMapping("/api/v2/orders")
public List<OrderDto> ordersV2() {
List<Order> orders = orderRepository.findAllByString(new OrderSearch());
List<OrderDto> result = orders.stream()
.map(o -> new OrderDto(o))
.collect(Collectors.toList());
return result;
}
@Getter
static class OrderDto {
private Long orderId;
private String name;
private LocalDateTime orderDate;
private OrderStatus orderStatus;
private Address address;
private List<OrderItemDto> orderItems;
public OrderDto(Order order) {
orderId = order.getId();
name = order.getMember().getName();
orderDate = order.getOrderDate();
orderStatus = order.getStatus();
address = order.getDelivery().getAddress();
orderItems = order.getOrderItems().stream()
.map(orderItem -> new OrderItemDto(orderItem))
.collect(Collectors.toList());
}
}
@Getter
static class OrderItemDto {
private String itemName; // ์ํ๋ช
private int orderPrice; // ์ฃผ๋ฌธ ๊ฐ๊ฒฉ
private int count; // ์ฃผ๋ฌธ ์๋
public OrderItemDto(OrderItem orderItem) {
itemName = orderItem.getItem().getName();
orderPrice = orderItem.getOrderPrice();
count = orderItem.getCount();
}
}**
}
order
1๋ฒmember
, address
N๋ฒ(order
์กฐํ ์ ๋งํผ)orderItem
N๋ฒ(order
์กฐํ ์ ๋งํผ)item
N๋ฒ(orderItem
์กฐํ ์ ๋งํผ)์ฐธ๊ณ : ์ง์ฐ ๋ก๋ฉ์ ์์์ฑ ์ปจํ ์คํธ์ ์์ผ๋ฉด ์์์ฑ ์ปจํ ์คํธ์ ์๋ ์ํฐํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด SQL์ ์คํํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ์์ ์ด๋ฏธ ๋ก๋ฉํ ํ์ ์ํฐํฐ๋ฅผ ์ถ๊ฐ๋ก ์กฐํํ๋ฉด SQL์ ์คํํ์ง ์๋๋ค.