본문 바로가기

Spring

[Spring Boot] WAITING인 주문 목록 가져오는 방법: 전체 조회 후 필터링하지 않고, 쿼리문 이용하기

☝️ 사용 버전

Spring Boot 3.2.5
JDK 17

 

 

 

💡문제 상황

JpaOrderSellerRepositoryAdapter 에서 (판매자)주문조회를 했을 때, findAll() 메서드 모든 주문정보를 가져온 후에 주문상태가 WAITING인 주문만 필터링을 하고있다. 

    @Override
    public List<Order> SelectWaitingOrders() {
        List<OrderEntity> orderEntityList = jpaOrderSellerRepository.findAll();

        return orderEntityList.stream()
                .filter(orderEntity -> orderEntity.getStatus() == Status.WAITING)
                .map(Order::new)
                .collect(Collectors.toList());
    }

 

이 코드의 문제점은 만약 주문의 개수가 1만 건일 경우, 1만 건의 주문 데이터를 모두 처리해야 한다는 것이다.

내가 필요한 것은 주문 상태가 WAITING인 주문 데이터인데, 모든 주문 데이터를 처리함으로써 불필요한 데이터까지 가져오게 되어 성능을 저하시킨다.

 

 

🛠️ 해결 방법

WAITING이라는 조건을 적용하여, 필요한 데이터만 조회하는 쿼리문을 이용하면 된다.

 

public interface JpaOrderSellerRepository extends JpaRepository<OrderEntity, Long> {
    @Query("SELECT o FROM orders o WHERE o.status = 'WAITING'")
    List<OrderEntity> findWaitingOrders();

 

 

기존 코드에서는 메서드이름을 수정하고, 필터링 과정을 삭제한다.

    @Override
    public List<Order> SelectWaitingOrders() {
        List<OrderEntity> orderEntityList = jpaOrderSellerRepository.findWaitingOrders();
        return orderEntityList.stream()
                .map(Order::new)
                .collect(Collectors.toList());
    }

 

 

 

⭐ 실행 결과

정상적으로 주문 상태가 WAITING인 주문 데이터만 조회된다.