본문 바로가기
혼자서 개발새발

페이징 할 때 Entity로 받고, Dto로 변환하자!

by 휴일이 2023. 1. 5.

 

 

저번 포스팅에서

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