인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

장환호님의 프로필 이미지
장환호

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

간단한 주문 조회 V2: 엔티티를 DTO로 변환

V1, V2 실행 시 OrderItem 차이

해결된 질문

작성

·

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에서 해준 설정 때문에 프록시들이 강제로 초기화되고 있습니다.

image

이 설정으로 인해 json으로 로딩할 때 지연 로딩된 프록시 객체들을 강제로 초기화해서 값을 뿌려주기 때문에 v1에서는 orderitems도 초기화되어 조회 SQL이 날아간 것으로 보입니다. 전 강의 부분인 간단한 주문 조회 V1: 엔티티를 직접 노출 의 16분 경 후부터 설명을 해주고 계시죠. :)

그리고 v2에서 simpleOrderDto 에서는 말씀하신 것처럼 DTO에서 orderItems 를 부르는 게 없기 때문에 관련한 조회 SQL이 나가지 않고 있습니다.


감사합니다.

장환호님의 프로필 이미지
장환호

작성한 질문수

질문하기