본문 바로가기

강의 내용 정리/스프링부트와 JPA 활용 2

4-2. 주문조회V2:엔티티를 DTO로 변환

 

No Properties 오류 : 거의 다 Getter, Setter 문제. (넣어주면 된다.)

 

 

OrderApiController.java

어 그런데 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

 

Recent Posts
Popular Posts
Recent Comments