이전 내용
1. API 호출 시 FetchType.Lazy -> 무한루프
2. API 호출 시 FetchType.Lazy -> Json 오류 (InvalidDefinitionException - ByteBuddyInterceptor)
API호출 시 무한루프와 InvalidDefinitionException을 해결했다.
이 때 결과를 출력하게 되면
[
{
"id": 4,
"member": null,
"orderItems": null,
"delivery": null,
"orderDate": "2023-11-23T16:57:32.353821",
"status": "ORDER",
"totalPrice": 50000
},
{
"id": 11,
"member": null,
"orderItems": null,
"delivery": null,
"orderDate": "2023-11-23T16:57:32.394409",
"status": "ORDER",
"totalPrice": 220000
}
]
프록시 객체의 경우 null이 반환된다.
Hibernate5Module을 빈으로 등록할 때
@Bean
Hibernate5Module hibernate5Module() {
Hibernate5Module hibernate5Module = new Hibernate5Module();
hibernate5Module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, true);
return hibernate5Module;
}
위와 같이 FORCE_LAZY_LOADING 옵션을 키게 되면, null이 반환되지 않고 강제로 지연로딩을 실행하기 때문에 모든 값이 반환된다.
그렇기에, 지나치게 많은 쿼리가 나가기 때문에 매우 성능이 좋지 않다.
대안으로, API에 반복문을 이용해 직접 조회하는 방법도 있다.
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAll(new OrderSearch());
for (Order order : all) {
order.getMember().getName();
order.getDelivery().getOrder();
}
return all;
}
결국 이 모든 문제는 Entity를 외부에 노출해서 발생하는 문제이다.
반드시, Entity대신 DTO를 매핑해서 해당 문제가 발생하지 않도록 한다.
참고 :