이커머스 플랫폼의 주문 조회 API 응답 속도가 느려졌던 경험이 있습니다.


---

1. 문제 인지

모니터링 도구(AWS CloudWatch + New Relic)로 평균 응답시간이 3초 이상 걸리는 API가 발생한 것을 확인했습니다.

특히 /orders?user_id=xxx API가 느린 것으로 나타났고, DB에서 병목이 발생했습니다.



---

2. 문제 쿼리 찾기

APM에서 해당 API 요청에 연결된 SQL 쿼리를 추적했고, 다음과 같은 쿼리가 성능 이슈의 원인이었습니다:


SELECT * FROM orders
WHERE user_id = ?
ORDER BY created_at DESC
LIMIT 20 OFFSET 1000;


---

3. 원인 분석

OFFSET이 클수록 성능 저하가 발생하는 구조였습니다.

해당 테이블은 수백만 건의 주문 데이터를 가지고 있었고, 인덱스는 user_id, created_at에만 걸려 있었습니다.

하지만 OFFSET을 많이 사용하는 무한 스크롤 방식에서 데이터 스캔 비용이 커지는 게 문제였습니다.



---

4. 최적화 방법

Keyset Pagination으로 쿼리 구조를 변경했습니다:


SELECT * FROM orders
WHERE user_id = ? AND created_at < ?
ORDER BY created_at DESC
LIMIT 20;

이를 통해 OFFSET을 제거하고, 이전 페이지의 created_at을 기준으로 페이지네이션을 구현했습니다.

쿼리 속도는 평균 2.9초 → 0.15초로 대폭 줄었습니다.



---

5. 결과

API 응답 속도 향상

사용자 UX 개선

DB 부하도 줄어듦 (CPU, IOPS 모니터링 지표로 확인)


LIST

+ Recent posts