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이든
생성이 안 되고, 양쪽 다 어느 한 쪽이 생성되기를 기다리고만 있는 상태가 치명적인 상태가 되버린다.