문제 상황
인기 메뉴 조회 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)이 맞지 않아 발생한 문제를 해결한 경험 !!
'트러블슈팅' 카테고리의 다른 글
| 외부 플랫폼 주문 전송 기능 - Mock API 구현 (0) | 2026.03.31 |
|---|---|
| 예외 처리 범위 확장: GlobalExceptionHandler 리팩토링 (0) | 2026.03.30 |
| 기능 중심 API 설계의 한계와 도메인 중심으로의 개선 과정 (0) | 2026.03.30 |
| Response DTO에서 Builder와 생성자를 구분해서 사용한 이유 (1) | 2026.03.30 |
| Redis write-back 구조에서 벌크 업데이트 적용하기 (0) | 2026.03.20 |