모바일에서 주문목록을 조회하는 로직정리해보자면

(1) memberId에 해당한 order 데이터 조회한다. 

(2) orderId로 store 데이터 조회한다.

(3) orderId로 review 데이터 조회한다.

(4) review 작성여부를 통해 리뷰 작성 가능 기간인지, 리뷰 작성 가능 여부를 체크한다.

(5) DTO 형식으로 변경 후 반환한다.

 

수정 전 로직

서비스와 서비스간의 통신인 Feign이 order의 개수만큼 이루어지기때문에 order의 개수가 많을 경우 많은 api 호출이 이루어져 서비스의 속도가 느려지는 것을 확인할 수 있었다.

이 문제사항을 해결하기 위해 order를 list로 묶어서 한 번에 통신할 수 있도록 로직을 수정하였다. 다른 부분에서도 사용되는 메서드, 로직이 있어 수정하는데 고려하는 상황이 많았다.

 

order-service의 OrderService

public Page<OrderMobileListResponseDto> mobileOrderList(Long memberId, Pageable pageable){
        log.info("[OrderService] mobileOrderList ");

        Page<Order> pageByMemberId = orderRepository.findPageByMemberId(memberId, pageable);

        // TODO : 리뷰량이 많은 경우 속도 느림
        // TODO : order시간 기준 최신순 정렬
        Page<OrderMobileListResponseDto> pages = pageByMemberId.map(order -> {
            StoreInfoForOrderDto storeInfoDto = storeServiceClient.storeInfoForOrder(order.getStoreId()).getData();
            Boolean review = reviewServiceClient.existReviewByOrder(order.getId()).getData();

            String writedCheck = writedCheck(order.getCreateDate(), LocalDateTime.now(), review);
            return OrderMobileListResponseDto.create(order, storeInfoDto, writedCheck);
        });

        return pages;

    }

 

 

수정 후 로직

HashMap과 HashSet를 활용하여 순서에 맞는 order 정보를 가져왔으며, 원하는 데이터를 뽑아 DTO로 만들어 반환해주었다.

 

order-service의 OrderService

/** 모바일 용 */
    public Page<OrderMobileListResponseDto> mobileOrderList(Long memberId, Pageable pageable){
        log.info("[OrderService] mobileOrderList ");

        Page<Order> orders = orderRepository.findPageByMemberId(memberId, pageable);

        List<Long> storeIds = new ArrayList<>();
        List<Long> orderIds = new ArrayList<>();

        orders.forEach(order -> {
            storeIds.add(order.getStoreId());
            orderIds.add(order.getId());
        });

        List<StoreInfoForOrderDto> storeInfoForOrderDtos = storeServiceClient.storeInfoForOrder(storeIds).getData();
        List<Long> orderIdsByReview = reviewServiceClient.existReviewByOrder(orderIds).getData();

        HashMap<Long,StoreInfoForOrderDto> storeInfoMap = new HashMap<>();
        storeInfoForOrderDtos.forEach(storeInfo-> storeInfoMap.put(storeInfo.getStoreId(),storeInfo));

        HashSet<Long> set = new HashSet<>(orderIdsByReview);
        Page<OrderMobileListResponseDto> pages = orders.map(order -> {
            StoreInfoForOrderDto storeInfoForOrderDto = storeInfoMap.get(order.getStoreId());
            String writedCheck = writedCheck(order.getId(), order.getCreateDate(), LocalDateTime.now(), set);
            return OrderMobileListResponseDto.create(order, storeInfoForOrderDto, writedCheck);
        });

        return pages;

    }

 

 

 

TIL :

서비스단 로직을 개발하면서 CRUD를 구성할 때도, 자료구조를 활용하지 않아서 그런지, 알고리즘외에 자료구조를 활용할 생각을 못했던 것 같다. 이번 로직수정을 통해 자료구조에 대한 개념을 다시 정리할 필요성을 느꼈으며, 자료구조에 대해 활용하는 방안에 대해서도 생각할 수 있는 경험이 되었다.

 

 

 

feign client 적용할 때 참고하기 좋은 블로그 :

 

우아한 feign 적용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요. 저는 비즈인프라개발팀에서 개발하고 있는 고정섭입니다. 이 글에서는 배달의민족 광고시스템 백엔드에서 feign 을 적용하면서 겪었던 것들에 대해서 공유 하고자 합니다

techblog.woowahan.com

 

 

 

 

📮개인 공부를 위한 공간으로 틀린 부분이 있을 수도 있습니다.📮

문제점 및 수정 사항이 있을 시, 언제든지 댓글로 피드백 주시기 바랍니다.