해결된 질문
작성
·
278
0
안녕하세요.
이전 강의에서 만든 v1 API와 이번 강의에서 만든 v2 API를 각각 호출해보면, 실행된 쿼리에 차이가 있는데요~
v1에서는 order_items 테이블을 N번(2번) 조회하고, v2에서는 조회하지 않습니다. 이 차이가 왜 발생하는지 궁금합니다.
Order의 List<OrderItem> @OneToMany 매핑 시 cascade 설정을 해두었고,
v1은 Order 조회 및 lazy loading 강제 초기화 이후에 orders가 그대로 응답으로 나가는 과정에서 order_items 테이블이 조회된 걸까요?
그렇다면 v2는 응답으로 사용하는 SimpleOrderDto를 생성할 때 order.orderItems를 불러오지 않기 때문에 order_items의 데이터가 필요하지 않아서 조회 쿼리가 발생하지 않은 거라고 보면 될까요?
코드는 아래와 같습니다.
답변 1
0
안녕하세요. 장환호님, 공식 서포터즈 y2gcoder입니다.
v1과 v2의 차이는 엔티티를 그대로 부르냐, DTO에 필요한 값만 부르냐의 차이에 집중을 해주고 있는데요,
사실 v1에서는 Hibernate5Module에서 해준 설정 때문에 프록시들이 강제로 초기화되고 있습니다.
이 설정으로 인해 json으로 로딩할 때 지연 로딩된 프록시 객체들을 강제로 초기화해서 값을 뿌려주기 때문에 v1에서는 orderitems도 초기화되어 조회 SQL이 날아간 것으로 보입니다. 전 강의 부분인 간단한 주문 조회 V1: 엔티티를 직접 노출 의 16분 경 후부터 설명을 해주고 계시죠. :)
그리고 v2에서 simpleOrderDto 에서는 말씀하신 것처럼 DTO에서 orderItems 를 부르는 게 없기 때문에 관련한 조회 SQL이 나가지 않고 있습니다.
감사합니다.