컨트롤러에서는 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 |