์ด์ ๊ฐ์ ๋ด์ฉ
์ํฐํฐ๋ฅผ 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์ ์ง์ ์ฌ์ฉํ๋ค. (์ดคํ์ ๋ฐฉ๋ฒ)