저번 포스팅에서
Dto를 리포지토리에서 변환하는 것은 매우 구리다는 것을 알아냈다...
그래서 오늘은
리포지토리에서 페이징한 엔티티들을 받은 후
서비스에서 Dto로 변환하는 작업을 해봤다...
일단 전체 주문 목록을 가져오는 서비스를 만든다(엔티티를 반환하게 함)
* 해당 멤버가 한 주문만 가져오는 거라서 멤버 아이디를 조건으로 주었다
public Page<MdOrder> findAllOrders(Long memberId, Pageable pageable) {
BooleanBuilder builder = new BooleanBuilder();
builder.and(mdOrder.order.member.id.eq(memberId));
return getOrderList(pageable, builder);
}
그 다음
엔티티로 페이징해오는 쿼리 메소드를 작성했다
private Page<MdOrder> getOrderList(Pageable pageable, BooleanBuilder builder) {
List<MdOrder> resultList = query.select(Projections.constructor(MdOrder.class,
mdOrder.id, mdOrder.price, mdOrder.quantity, mdOrder.market,
mdOrder.delivery, mdOrder.order))
.from(mdOrder)
.where(builder)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
Long total = query.select(mdOrder.count())
.from(mdOrder)
.fetchOne();
return new PageImpl<>(resultList, pageable, total);
}
그런데 잠깐!
내가 가져오고 싶은 정보는
mdOrder.market.md.name
mdOrder.delivery.status
mdOrder.order.orderDate
인데
객체 자체를 가져올 필요가 있나?
있다...
왜냐하면 엔티티의 생성자는 자기가 가진 FK테이블(객체)만
생성자로 바들 수 있기 때문에
걍 다 받아버린다 ㅡ.ㅡ ㅠ
- 패치 조인은 하면 안 된다
- 직접 안 불러온 객체는 프록시 객체로 가져오기 때문에
- mdOrder.market.md.name이 불러와지지 않는다 ㅠ
그 다음 서비스에서 Dto로 변환시킨다
어차피 진짜 객체를 불러왔기 때문에
원투매니 엔티티에 있는 객체 필드(컬럼)들도
다 값이 있어서 불러와진다
private Page<MdOrder> getOrderList(Pageable pageable, BooleanBuilder builder) {
List<MdOrder> resultList = query.select(Projections.constructor(MdOrder.class,
mdOrder.id, mdOrder.price, mdOrder.quantity, mdOrder.market,
mdOrder.delivery, mdOrder.order))
.from(mdOrder)
.where(builder)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
Long total = query.select(mdOrder.count())
.from(mdOrder)
.fetchOne();
return new PageImpl<>(resultList, pageable, total);
}
@GetMapping("/list")
public Page<MdOrderDto> list(Pageable pageable, HttpSession session) {
return orderService.orderList(getMemberId(session), pageable);
}
컨트롤러에서 리스트를 불러오면?
무사히 불러와진다..
쿼리도 단 세 방만 나가는 것을 확인할 수 있다~~~
하...
처음부터 엔티티로 받았으면 좋았을 걸...
리포지토리랑 서비스 다 수정해야돼서 기분 좋다~~~~^^꺄오~~~~~!!!~!~!!!
728x90
'혼자서 개발새발' 카테고리의 다른 글
thymeleaf 템플릿을 사용해서 메일로 코드 발송하기! (0) | 2023.03.12 |
---|---|
Spring Security ) SNS 로그인 구현(내가 보려고 정리...) (1) | 2023.01.09 |
JPA ) QueryDsl , Pageble 을 이용해 페이징을 하다! (0) | 2023.01.04 |
게시판을 손수 페이징해보자 ^^! (0) | 2022.12.22 |
저장용) JPA & QueryDsl 쓰는 법 (0) | 2022.12.20 |