Search

1분기 API 성능개선 작업

생성일
2025/03/18 07:02
태그
성능개선
Legacy
날짜
상위 항목
하위 항목

개요

평균 400ms 전후의 responseTime의 API 요청이 평균 1000ms까지 올라간 정황을 파악했다.
CloudWatch의 Logs insight를 통해 responseTime 로그를 확인해보니 10초 이상의 응답시간을 가진 API 지속적으로 호출되고 있어 평균치를 올리고 있는 것으로 보인다.
위 결과와 같이 응답까지 최대 19초까지 걸리는 API도 확인되고 있다.

개선진행

10초 이상 응답지연이 발생한 API 목록은 아래와 같다
url
method
설명
중요도
상태
/iamport-web-hook/web-hook
POST
결제관련 API
높음
/vehicle-details?vehicleNumber=372%EA%B0%808969&owner…
POST
차량등록 관련 API
보통
/customer/pending-orders
POST
주문생성 API
높음
개선완료
/v2/promotions, /v2/promotions/:id
GET
프로모션 조회 API
매우높음
개선완료
/v2/reviews/recent, /v2/reviews
GET, POST
리뷰 호출 API
매우높음

GET /v2/promotions

최근 당일장착 프로모션 진행으로 인해 /v2/promotions API가 지속적으로 호출되고 있으나
해당 건은 확인결과 for문 내의 await/async 문을 사용하게 되면서 반복문이 중첩되는 이슈였다.
반복문 내의 await문이 순차대로 실행되지 않도록 비동기 처리후 10000ms 전후에서 → 1000ms 전후로 성능이 크게 개선되었다.
Logs insights 결과

POST /iamport-web-hook/web-hook

/iamport-web-hook/web-hook 의 경우 내부 로직에 사용되는 쿼리 중 불필요하게 많은 JOIN이 발견되었다. 실제로 사용되지 않는 JOIN이 불필요한 오버헤드를 발생시키고 있었고 필요한 값만 호출하도록 변경하였다.
모니터링 결과 해결되지 않았다.

POST /customer/pending-orders

사용자가 상품을 구매하기 위한 절차로 주문을 생성하는 API이며 성능 저하는 크리티컬하다고 할 수 있다.
분석결과 아래와 같이 특정 쿼리의 EXPLAIN cost가 높게 측정되고 있다.
이유는 최근 추가된 컬럼이 INDEX에 추가되지 않았던 것으로 보이며, 기존 로직 또한 불필요한 호출이 발생하고 있었다.
Update on "Order" o (cost=192639.09..205723.41 rows=1054 width=580) -> Nested Loop (cost=192639.09..205723.41 rows=1054 width=580) -> Subquery Scan on sub_order (cost=192638.67..197498.38 rows=1054 width=32) -> HashAggregate (cost=192638.67..197487.84 rows=1054 width=4) Group Key: o2.id Filter: (count(oi2.id) = count(oi2."deletedAt")) Planned Partitions: 8 -> Hash Right Join (cost=29637.84..177543.09 rows=226788 width=16) Hash Cond: (oi2."orderId" = o2.id) -> Seq Scan on "OrderItem" oi2 (cost=0.00..136408.26 rows=861326 width=16) -> Hash (cost=26179.39..26179.39 rows=210756 width=4) -> Seq Scan on "Order" o2 (cost=0.00..26179.39 rows=210756 width=4) Filter: ("deletedAt" IS NULL) -> Index Scan using "PK_3d5a3861d8f9a6db372b2b317b7" on "Order" o (cost=0.42..7.80 rows=1 width=544) Index Cond: (id = sub_order.id)
SQL
복사

index 추가

CREATE INDEX "IDX_orderId" ON "OrderItem" ("orderId"); //default b-tree CREATE INDEX "IDX_productId" ON "OrderItem" ("productId"); //default b-tree
SQL
복사
INDEX 추가와 동시에 로직 개선을 병행하고나니 아래와 같이 1000ms대로 응답시간이 개선되었다.

POST /vehicle-details

차량등록 API로서 차량정보를 가져오는 외부업체의 API 성능이 5-6초 이상 걸리는 것으로 보인다.
해당 건은 업체측에 개선요청이 필요해보인다.
POST /v2/reviews

사용된 Logs insights 쿼리

# 하루 평균 요청 fields url, @timestamp, @message | filter statusCode < 400 | stats avg(responseTime) by bin(1d) // 30m, 1h ... # 10초 이상 지연이 발생한 요청 fields url, method, responseTime | sort @timestamp desc | filter responseTime > 10000 | limit 10000
Plain Text
복사