이커머스 플랫폼의 주문 조회 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 모니터링 지표로 확인)
'Spring & Backend' 카테고리의 다른 글
| Content-Type 헤더에 대해서 설명해주세요 (0) | 2025.06.30 |
|---|---|
| CDN이란 무엇인가요? (0) | 2025.06.30 |
| JWT(Json Web Token)의 장점은 무엇인가요? (0) | 2025.06.27 |
| 스프링 트랜잭션 전파 속성에 대해서 설명해주세요. (1) | 2025.06.27 |
| CSS 의사 요소(Pseudo-elements)란 무엇인가요? (4) | 2025.06.26 |
