No Properties 오류 : 거의 다 Getter, Setter 문제. (넣어주면 된다.)
어 그런데 orderItems는 null 이 나온다.
-> orderItems는 엔티티 이기 때문에 안나옴. (LAZY)
그러나 이렇게 강제초기화 해주면
깔끔하게 나온다.
-- 번외
내 예상대로 OrderItem 속의 Item 을 초기화 안하고 OrderItem 만 초기화 한다면
이렇게 OrderItems 는 초기화 되어 프록시 객체 대신 실제 값이 있는데 Item은 초기화 되지 않았다.
-- 다시 본론
그럼 이렇게 한게 DTO로 반환한거니까 문제 없지 않나??
-> 지금 OrderItem 엔티티를 단순히 OrderDto 로 감싸서 반환되었다.
-> 엔티티를 DTO 로 감싸서 반환했더라도 이 구조가 그대로 노출된다..
(완전히 엔티티에 대한 의존을 끊으라는 뜻이다.)
(왜 엔티티 노출 안되나? = 다시말하지만 엔티티 수정하면 API 다 바뀜 )
=> 해결 : OrderItem 조차도 모두 DTO로 바꾸어야한다.
만약 요구조건이 orderitems -> item -> name, orderPrice, count 만 필요해!
API에 필요한 필드만 이렇게 넣는다.
이렇게 넣어준다. 너무 좋다... (API 요구사항에 맞게 DTO만들어서 반환하자!!!)
물론 여기서 Result 로 한번 감싸야함!!
이렇게 원하는 필드를 저장해주면 depth를 줄여서 반환해줄수 있다.(이건 프론트 편하도록)
orderitems -> item depth가 없는 것을 알 수 있다.
OrderDto 생성자에서 orderItems 또한 Dto로 변환해준다.
OrderItemDto에서는 응답에 필요한 값들만 정의하여 생성자로 만든다.
이 코드에서 쿼리가 몇 개가 나갈까?? order 2개.......
이거 모르겠으면 주문 조회 V2: 엔티티를 DTO로 변환 12:40 부터 다시 봐라
중요한점!!!!!!!!!!!!!!!!!
OrderDto로 변환 중 필드에 엔티티 있으면 그것도 DTO로 변환,응답DTO는 응답할 필드만있으면 응답JSON depth 줄일수있다 , 값타입은 제외!!!! (엔티티 있으면 그것 도 모두 DTO로 반환하자.)
그리고 요청DTO에는 받는 필드, 응답DTO는 반환 필드만 작성하자!
=====
생각해보면 좋을 점
orderitem 의 프록시객체가 초기화 되는 시점 :
저도 사실 궁금해서 디버깅이랑 로깅을 통해서 실험을 해봤더니, 말씀하신대로 order.getOrderItems().stream().map().collect(toList()); 부분에서 SQL이 나가는 것을 확인했습니다. 아마 stream 의 동작방식과 관련이 있는 것 같은데 먼저 리스트를 형성하고 map을 이용해서 dto를 만들어서 넣기 전에 orderItem 첫 원소를 불러오는 과정에서 sql이 날아가는 것 같습니다.
혹시나 눈으로 보길 원하신다면 강의 소스를 디버깅으로 켜시고 브레이크포인트를 걸어서 확인해보시면 재밌을 것 같습니다!
=> 직접 디버깅 해보니
이런경우 .getName() 할때야 비로소 Item이 초기화 된다.
그리고
orderitem은 하나씩 가져오는게 맞다!!! 답변이 틀림.
orderitem -> item -> item -> orderitem -> item -> item 순이 맞다.
https://www.inflearn.com/questions/647681?re_comment_id=211694
ordersV2(url : api/v2/orders) 실행 시 쿼리 질문 - 인프런 | 질문 & 답변
실행창을 확인해보니 해당 API 호출 시 쿼리가order -> member -> delivery -> orderitems -> item -> (2) -> item -> ( 1 ) ->member -> delivery ->...
www.inflearn.com
'Java, Spring > 스프링부트와 JPA 활용 2' 카테고리의 다른 글
질문 모음 (0) | 2022.09.09 |
---|---|
4-3. 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 (1) | 2022.09.09 |
4. 컬렉션 조회 최적화 4-1 엔티티 직접 노출 (0) | 2022.09.09 |
3-4. 간단주문조회V4 : JPA에서 DTO로 바로 조회(매우매우매우매우매우매우매우매우매우매우매우 중요) (0) | 2022.09.09 |
3-3. 간단주문조회V3 : 페치조인 최적화 (0) | 2022.09.09 |