주문 저장 전에 qty가 1 이상인지, 가격이 입력됐고 0 이상인지 검사합니다. 조건을 충족하지 못한 요청은 주문을 저장하지 않고 거부합니다.
주문 보고서가 느렸던 이유
먼저 HTTP 200과 예상한 500개 행이 반환되는지 확인했습니다. 결과 누락이 아닌 조회 시간의 문제로 범위를 좁혔습니다.
서비스 코드를 확인하니 고객 목록을 한 번 조회한 뒤 고객마다 SUM과 COUNT를 따로 실행해 총 1 + 2N개의 쿼리가 필요했습니다. 장애 설정에서는 orders.customer_id 인덱스도 없었습니다.
orders.customer_id 인덱스를 추가하고 한 번의 그룹 집계로 바꿔 두 원인을 함께 수정했습니다. 회귀 테스트는 계산 결과와 각 모드의 인덱스 존재 여부를 확인합니다.
인덱스 확인: 고객별 SUM 쿼리
SCAN orders → SEARCH orders USING INDEX ix_orders_customer_id
고객 한 명의 SUM을 구하는 별도 쿼리에 EXPLAIN QUERY PLAN을 적용해 인덱스가 조회 방식을 어떻게 바꾸는지 확인했습니다. 전체 JOIN … GROUP BY 보고서 쿼리의 실행 계획은 저장소에 따로 있습니다.
워밍업 1회 후 5회 측정한 서비스 함수 실행 시간의 중앙값은 90.26 ms에서 2.11 ms로 줄었습니다. 같은 프로세스 안에서 측정했으므로 HTTP 요청 처리 시간은 포함하지 않습니다. 벤치마크 파일에 개별 측정값이 있으며, 실행하는 컴퓨터에 따라 시간은 달라집니다.