[jpa] μ§μ°λ‘λ©κ³Ό μ‘°ν μ±λ₯ μ΅μ ν
μ΄μ κ°μ λ΄μ©
μν°ν°λ₯Ό Request Body μ μ§μ λ§€νν κ²½μ° λ¬Έμ μ
- μν°ν°μ νλ μ ν μ΄μ , API κ²μ¦μ μν λ‘μ§μ΄ μΆκ°λλ€.
νμ§λ§ μ€λ¬΄μμλ μν°ν°λ₯Ό μ΄μ©ν μ¬λ¬ APIλ€μ΄ λ§λ€μ΄μ§λλ° , κ°κ°μ APIλ€μ μν λͺ¨λ μμ²μ¬νλ€μ λ΄κΈ°λ μ΄λ ΅λ€.
λν μν°ν°κ° λ³κ²½λλ©΄ API μ€νμ΄ λ³νλ€ !
- λ°λΌμ μν°ν°λ₯Ό Requst Body μ μ§μ λ§€νμν€λ κ²μ΄ μλ , API λ₯Ό μν DTOλ₯Ό λ°λ‘ λ§λ€μ΄μ μ΄κ²μ νλΌλ―Έν°λ‘ λ°μμΌνλ€.
- DTOλ₯Ό ν΅ν΄μ νλΌλ―Έν°λ₯Ό λ°μΌλ©΄ λ€μκ³Ό κ°μ μ₯μ μ΄ μλ€.
1. μν°ν°μ νλ μ ν μ΄μ μ μν λ‘μ§μ λΆλ¦¬ν μ μλ€.
- μ΄μ λ μ΄μ μν°ν°κ° μ¬λ¬ APIλ€μ μν μμ²μ¬νλ€μ λ΄μ νμκ° μλ€.
2. μν°ν°μ API μ€νμ λͺ ννκ² λΆλ¦¬ν μ μλ€.
- μν°ν°κ° λ³κ²½λλ API μ€νμ΄ λ³νμ§ μλλ€.
μ§μ°λ‘λ©κ³Ό μ‘°ν μ±λ₯ μ΅μ ν
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
for (Order order : all) {
order.getMember().getName(); //Lazy κ°μ μ΄κΈ°ν
order.getDelivery().getAddress(); //Lazy κ°μ μ΄κΈ°ν
}
return all;
}
APIλ₯Ό κ°λ°ν λ μμ μ½λλ₯Ό μ¬μ©νλ€κ³ μκ°ν΄λ³΄μ !
μμ μ½λλ λ κ°μ§μ λ¬Έμ κ° μλ€.
1. μν°ν°λ₯Ό μ§μ λ ΈμΆνλ€.
2. νλ‘μ κ°μ²΄λ₯Ό μ‘°ννλ―λ‘ μμΈκ° λ°μνλ€.
μν°ν°λ₯Ό μ§μ λ ΈμΆνλ κ±°λ κ·Έλ λ€μΉκ³ λ¨Όμ μμΈλ₯Ό ν΄κ²°ν΄μΌνλ€.
μ μ½λκ° μμΈκ° λ°μνλ μ΄μ λ μν°ν°λ₯Ό λΆλ¬μ€λ λ°©μμ΄ fetch.LAZY μΈλ°,
JACKSON λΌμ΄λΈλ¬λ¦¬κ° νλ‘μ κ°μ²΄λ₯Ό μ΄λ»κ² jsonμΌλ‘ μμ±ν μ§ λͺ¨λ₯΄κΈ° λλ¬Έμ΄λ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μ νμ΄λ²λ€μ΄νΈ λͺ¨λμ μ€μΉν¨μΌλ‘μ¨ ν΄κ²°ν μ μλ€.
μ΄λ κ² ν¨μΌλ‘μ¨ μ΄κΈ°νλ νλ‘μ κ°μ²΄λ§ λ ΈμΆνκ³ μ΄κΈ°νλμ§ μλ νλ‘μ κ°μ²΄λ λ ΈμΆμν€μ§ μλλ€.(nullλ‘ λμ΄)
κ·Όλ° μν°ν°λ₯Ό μ§μ λ ΈμΆμν€λ κ²μ λ§€μ° μμ’κΈ° λλ¬Έμ μ μ΄μ μ΄λ κ² νλ©΄ μλλ€ !
μ°¨λΌλ¦¬ DTOλ₯Ό λ°νμν€μ
μ£Όμμ¬ν
1. μν°ν°λ₯Ό μ§μ λ ΈμΆν λ μλ°©ν₯ μ°κ΄κ΄κ³κ° κ±Έλ¦° κ³³μ κΌ @JsonIgnore μ²λ¦¬λ₯Ό ν΄μΌνλ€. (μνλ©΄ 무ν루ν κ±Έλ¦Ό)
2. μ§μ° λ‘λ© λ¬Έμ λ₯Ό ν΄κ²°νλ€κ³ EAGER λ‘ λ°κΎΈλ©΄ λ 골μΉμν μ§λ€.
μν°ν°λ₯Ό DTOλ‘ λ°ν
@GetMapping("/api/v2/simple-orders")
public List<SimpleOrderDto> ordersV2() {
List<Order> orders = orderRepository.findAll();
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(toList());
return result;
}
@Data
static class SimpleOrderDto {
private Long orderId;
private String name;
private LocalDateTime orderDate; //μ£Όλ¬Έμκ°
private OrderStatus orderStatus;
private Address address;
public SimpleOrderDto(Order order) {
orderId = order.getId();
name = order.getMember().getName();
orderDate = order.getOrderDate();
orderStatus = order.getStatus();
address = order.getDelivery().getAddress();
}
}
μ΄μ μν°ν°λ₯Ό μ§μ λ ΈμΆμν€λ κ² μλ DTOλ₯Ό λ°νμν€λ λ°©μμΌλ‘ μ½λλ₯Ό μμ νλ€.
νμ§λ§ μ΄ μ½λλ 1+N λ¬Έμ λ₯Ό μΌμΌν¨λ€.
λ‘λ©λ°©μμ΄ fetch.LAZYμ΄λ―λ‘ , orderμμ memberλ₯Ό μ‘°νν λ Nλ²
orderμμ Deliveryλ₯Ό μ‘°νν λ Nλ² μ‘°νλλ€.(1+N+N)
*μ§μ°λ‘λ©μ μ°μμ± μ»¨ν μ€νΈμμ μ‘°νλλ―λ‘ , μ΄λ―Έ μ‘°νλ κ²½μ° μΏΌλ¦¬ μλ΅
νμΉ μ‘°μΈ μ΅μ ν
public List<Order> findAllWithMemberDelivery() {
return em.createQuery(
"select o from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d", Order.class)
.getResultList();
}
1+N λ¬Έμ λ λ€μκ³Ό κ°μ΄ νμΉ μ‘°μΈμ μ¬μ©ν΄μ ν΄κ²°ν μ μλ€.
μλλ member μ delivery λ₯Ό λ°λ‘ λ°λ‘ μ‘°ννμ§λ§ μ΄μ λ νλ²μ μ‘°νν¨μΌλ‘μ¨ μ‘°ν μ±λ₯μ λμΌ μ μλ€.
(μ§μ°λ‘λ©μ΄ λμ§ μλλ€)
*νμΉμ‘°μΈ(fetch join)μ΄λ?
- jpqlμμ μ±λ₯ μ΅μ νλ₯Ό μν΄ μ 곡νλ κΈ°λ₯
μ°κ΄λ μν°ν°λ 컬λ μ μ νλ²μ κ°μ΄ μ‘°νν μ μλ€.
리ν¬μ§ν 리μμ DTO μ§μ μ‘°ν
public List<OrderSimpleQueryDto> findOrderDtos() {
return em.createQuery(
"select new
jpabook.jpashop.repository.order.simplequery.OrderSimpleQueryDto(o.id, m.name,
o.orderDate, o.status, d.address)" +
" from Order o" +
" join o.member m" +
" join o.delivery d", OrderSimpleQueryDto.class)
.getResultList();
}
μΌλ°μ μΈ SQLλ¬Έμ μ¬μ©νλ κ²μ²λΌ μνλ κ°μ μ νν΄μ μ‘°ννλ λ°©λ²μ΄λ€.
select μ μμ μνλ λ°μ΄ν°λ₯Ό μ§μ μ ννκΈ° λλ¬Έμ λ€νΈμν¬ μ©λμ 'κ·Όμνκ²' μ΅μ ν ν μ μλ€.
νμ§λ§ κ²°κ΅ API μ€νμ λ§μΆ μ½λκ° λ¦¬ν¬μ§ν 리μ λ€μ΄κ°λ€λ μ κ³Ό νΉμ API λ§μ μν κ°λ§μ λ°νν΄μ€μ 리ν¬μ§ν 리 μ¬μ¬μ©μ΄ λ¨μ΄μ§λ λ€λ μ μ κ°μν΄λ³΄λ©΄, νμΉ μ‘°μΈλ³΄λ€ κ²°μ½ μ’λ€κ³ ν μλ μλ λ°©μμ΄λ€.
λ§μ½ μ΄μ κ°μ APIλ₯Ό λ§λ€μ΄μΌνλ€λ©΄ λ°λ‘ ν¨ν€μ§λ₯Ό λ§λ€μ΄μ κ΄λ¦¬ν΄μ£Όλ κ²μ΄ μ’λ€.
(DTOλ₯Ό μ§μ μ‘°ννλ κ²μ νλ©΄μ μν λ‘μ§μ΄κΈ° λλ¬Έ)
μ 리νμλ©΄,
λ¨Όμ μν°ν°λ₯Ό μ‘°ννλ λ°©μμ μ¬μ©νκ³ νμΉμ‘°μΈμΌλ‘ μ΅μ νλ₯Ό νλ€.
μ¬κΈ°μ λλΆλΆ λ¬Έμ κ° ν΄κ²°λμ§λ§ μΆκ°λ‘ μ±λ₯ μ΅μ νλ₯Ό μ§νν΄μΌ νλ€λ©΄ DTOλ₯Ό μ§μ μ‘°ννλ λ°©λ²μ μ ννλ€.
μ΄λλ μλλ€λ©΄ λ€μ΄ν°λΈ SQLμ΄λ JDBC ν νλ¦Ώμ μ΄μ©ν΄μ SQLμ μ§μ μ¬μ©νλ€. (μ΄€νμ λ°©λ²)