조회 쿼리를 한번에 날리기 위해서 이런식으로 작성했더니
public Optional<Order> findOrder(Long orderId, String loginId) {
return em.createQuery("select o from Order o" +
" join fetch o.orderItems" +
" join fetch o.delivery" +
" where o.member.loginId = :loginId" +
" and o.id = :orderId", Order.class)
.setParameter("loginId", loginId)
.setParameter("orderId", orderId)
.getResultList().stream().findAny();
}
주문 리스트가 중복으로 출력됐다.
select
order0_.order_id as order_id1_11_0_,
orderitems1_.order_item_id as order_it1_10_1_,
order0_.delivery_id as delivery9_11_0_,
order0_.imp_uid as imp_uid2_11_0_,
order0_.member_id as member_10_11_0_,
order0_.merchant_uid as merchant3_11_0_,
order0_.order_date as order_da4_11_0_,
order0_.payment_type as payment_5_11_0_,
order0_.shipping_fee as shipping6_11_0_,
order0_.status as status7_11_0_,
order0_.title as title8_11_0_,
orderitems1_.count as count2_10_1_,
orderitems1_.item_id as item_id4_10_1_,
orderitems1_.order_id as order_id5_10_1_,
orderitems1_.order_price as order_pr3_10_1_,
orderitems1_.order_id as order_id5_10_0__,
orderitems1_.order_item_id as order_it1_10_0__
from orders order0_
inner join
order_item orderitems1_
on order0_.order_id=orderitems1_.order_id
cross join member member2_
where order0_.member_id=member2_.member_id
and member2_.login_id='yjw0209'
order by order0_.order_date DESC;
쿼리 날라가는 걸 봤더니 이런식으로 순환참조가 되고 있었다.
크게 두가지 방법이 있는데 @JsonIgnore을 사용하는 것과 Dto를 사용하는 것
@JsonIgnore은 애플리케이션이 복잡하지 않을 때 사용되는데, 내 기준으로 지금 충분히 애플리케이션이 복잡해서 Dto 사용을 고려하다가 구글링으로 @JsonBackReference, @JsonManagedReference를 사용하는 것을 알고 일단 냅다 붙여봤더니 다른 동작에 이상이 없는 듯 해서 사용하기로 했다.
이상이 있다면 덧붙이겠다.
'springboot' 카테고리의 다른 글
[springboot - h2] docker 적응기 (0) | 2022.06.30 |
---|---|
[springboot - thymeleaf] Form Dto : NullPointerException (0) | 2022.05.15 |
[springboot - thymeleaf] 쇼핑몰 장바구니 페이지 구현 (0) | 2022.04.25 |
[springboot-thymeleaf] 쇼핑몰 상품 찜 기능 구현하기 (0) | 2022.04.21 |
[thymeleaf] form 태그 아래 submit이 여러 개일 때 (0) | 2022.04.19 |