CS 잡지식

순환 참조 문제

JIN_YOUNG _KIM 2023. 5. 5. 22:58
@RestController
@RequiredArgsConstructor
public class OrderApiController { //[주문 내역]에서 주문한 [상품 정보(OrderItem,Item필요)]를
                                  // 추가로 조회하는 API

    private final OrderRepository orderRepository;
    private final OrderQueryRepository orderQueryRepository;
    
    //중간 생략
     @Data
    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.getOrderStatus();

            address = order.getDelivery().getAddress();

            orderItems = order.getOrderItems().stream()
                    .map(orderItem -> new OrderItemDto(orderItem))
                    .collect(toList());
        }
    }
    
    //이하 생략
    }
@Repository
@RequiredArgsConstructor

public class OrderQueryRepository {

    private final EntityManager entityManager;

   
    public List<OrderQueryDto> findOrderQueryDtos() {

    return  null;
    }
}

 만약, OrderQueryDto 대신, OrderApiController에 있던, OrderDto를 List<OrderDto>로 사용하게 되면


 OrderQueryController가 OrderApiRepository를 참조하게 되어 버리는 문제가 발생.


 OrderApiController -> OrderQueryRepository && OrderQueryRepository ->  OrderApiController의 결과


 OrderApiController <-> OrderQueryRepository 라는 [순환 참조] 문제가 발생한다.

-> 순환 참조 문제에서는 어떤 일이 벌어 질 수가 있을까?

일례로, 다음과 같은 문제가 생긴다.

OrderApiController에서는 OrderQueryRepository를 주입 받아야 한다. 

근데, OrderQueryRepository는 반대로 OrderApiController을 주입 받아야 한다.

OS로 치면 데드락 상태가 되버린다.

서로가 서로를 필요한 상태가 되버리므로, OrderApiController이든 OrderApiController이든

생성이 안 되고, 양쪽 다 어느 한 쪽이 생성되기를 기다리고만 있는 상태가 치명적인 상태가 되버린다.