본문 바로가기

springboot

[springboot] 순환 참조 해결

 

 

조회 쿼리를 한번에 날리기 위해서 이런식으로 작성했더니

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를 사용하는 것을 알고 일단 냅다 붙여봤더니 다른 동작에 이상이 없는 듯 해서 사용하기로 했다.

 

이상이 있다면 덧붙이겠다.