트러블슈팅

DTO 생성 방식 혼용 문제를 기준 정립으로 해결하기

sudaruuu 2026. 3. 30. 17:09

문제 상황

인기 메뉴 조회 API 호출 시 빈 배열이 반환되는 문제가 발생했다.

  • 주문 데이터는 DB에 정상적으로 존재
  • order_items도 정상적으로 저장되어 있음
  • 하지만 조회 결과는 [ ]로 반환됨

원인 분석

초기에는 데이터가 없는 문제라고 생각했지만,

DB를 확인한 결과 orders와 order_items 모두 정상적으로 존재했다.

 

이후 인기 메뉴 조회 쿼리를 확인하는 과정에서

최근 7일 필터 조건이 createdAt 기준으로 설정되어 있는 것을 발견했다.

 

하지만 실제 주문 시점은 orderedAt 필드에 저장되어 있었고,

createdAt은 null 상태였다.

 

그 결과, 모든 데이터가 필터 조건에서 제외되어

빈 배열이 반환되고 있었다.


해결 방법

조회 기준을 createdAt에서 orderedAt으로 변경하였다.

기존

where o.createdAt >= :sevenDaysAgo

변경

where o.orderedAt >= :sevenDaysAgo

변경된 쿼리

@Query("""
        select new com.example.coffeeordersystem.domain.menu.dto.response.PopularMenuResponse(
            m.id,
            m.name,
            count(oi.id)
        )
        from OrderItem oi
        join oi.menu m
        join oi.order o
        where o.orderedAt >= :sevenDaysAgo
        group by m.id, m.name
        order by count(oi.id) desc
    """)

 


결과

수정 이후 정상적으로 인기 메뉴가 조회되었다.


느낀 점

조회 로직을 작성할 때 단순히 공통 필드(createdAt)를 사용하는 것이 아니라,
비즈니스 의미에 맞는 컬럼을 선택하는 것이 중요하다는 것을 알게 되었다.

특히 이번 케이스에서는 "주문 발생 시점"이 중요했기 때문에
orderedAt을 기준으로 조회하는 것이 더 적절했다.

 

데이터는 존재했지만, 조회 기준 컬럼(createdAt vs orderedAt)이 맞지 않아 발생한 문제를 해결한 경험 !!