본문 바로가기

개발/JPA

[JPA] week8

컨트롤러에서는 Entity를 반환하지말고, DTO를 반환하자. 

* Order -> OrderDto 변경시 주의 사항

- OrderItems 도 entity이므로, 함께 DTO로 변경해야한다. 

 

tip: orderItems는 List<OrderItem>의 형태. Dto로 반환시, Summary 정보를 원하기 때문에, api 스펙대로 요약하면 1detph 줄어든다. 

예)

orderItems: {

    orderItem: {

       orderNo: 1 

       item : {

             name: "바나나",

             count: 1

        } 

     },

     orderItem: {

         orderNo: 1 

         item : {

             name: "딸기",

             count: 3

        } 

     },

}

-> orderItems: {

   orderItem: {

      {바나나, 3}

  }   

-> 1 depth 줄어들어 가독성 올라감. 

 

oneToMany 최적화

- distinct 키워드 + 패치조인

- 패치조인 사용시 주의 사항

   : 페이징 사용 불가. (페이징 할 경우 hibernate 경고 뜨고, 메모리에서 페이징하므로 위험하다. 절대 하지마라)

   : 컬랙션 둘 이상에 패치 조인 불가. (데이터 부정합하게 조회될 수 O)

     - https://jojoldu.tistory.com/457

 

페이징 + 컬렉션 엔티티 함께 조회시, 최적화하는 법

- ToOne (xToOne)

   : 페치 조인 가능. (row 수 증가하지 않으므로 페이징 쿼리에 영향 x)

- 컬렉션

   : 지연 로딩 사용 

   : 지연 로딩 성능 최적화 위해 hibernate.default_batch_fetch_size, @BatchSize 이용 (IN QUERY 사용)

   -> hibernate.default_batch_fetch_size: 글로벌 설정 

      * in query 1000개 이상 설정시 오류 나는 DB 있어서, 100~1000개 사이로 설정하자. 

      * 1000으로 두면 네트워크 속도는 빨라지지만, 순간 부하가 커진다. 

   -> @BatchSize: Entity 내 컬럼별 최적화

                예. @BatchSize(size = 1000)

                       컬렉션의 경우 Entity 상단에 @BatchSize 적용.-> OrderItem과 Item은 ManyToOne이므로, Item 상단에. 

         : 컬렉션/프록시 객체를 한번에 설정한 SIZE만큼 IN 쿼리로 조회한다. 

패치조인 사용시 네트워크 호출과 전송 용량 사이의 trade off 를 잘 체크하자. 

 

주목

em.createQuery(select o from Order o, Order.class) 

.setFirstResult(offset)

.setMaxResults(limit)

-> delivery, member도 batchSize 적용 받아, IN query 실행됨.  

컬렉션 조회 최적화 

v5

Order 1회 조회. OrderItems 전체 Inquery로 조회. -> 총 2회. 

application단에 서 Order - OrderItems 매핑 

 

v6

orderFlatDto 1번 가져오고 application단에서 중복 제거

'개발 > JPA' 카테고리의 다른 글

[JPA 활용2 스터디] week 7  (0) 2022.02.06
[JPA] 쿼리 언어 문법 (기본, 중급)  (0) 2022.02.06
[JPA 기본] 9. 값 타입  (0) 2022.01.22
[JPA 기본] 8. 프록시와 연관관계 정리  (0) 2022.01.22
[JPA 기본] 7. 고급 매핑  (0) 2022.01.22