프로젝트 도메인에서 가장 많이 사용되는프로젝트 찾기 API의 최대 권장 운영 부하를 확인하고 시스템의 한계점을 파악하기 위해 성능 테스트를 진행했습니다.
대상 API: GET /api/v2/projects/search
동시 사용자 100명 조건에서 2분간 처리율(Throughput) 을 50 -> 100 -> 150 -> .... 올려가며 병목 지점을 식별하고 권장 운영 부하를 알 수 있습니다.
테스트 이전(BEFORE) 상태:

초기 CTT(Concurrent Think Time) 3000/min으로 부하 테스트를 진행했을 때, 커넥션 풀의 Pending 지표가 80까지 급증하며 시스템이 불안정한 상태를 보였습니다. 이때의 응답 시간은 다음과 같이 저하되었습니다.


성능 저하의 주요 원인을 파악한 결과, keyword 파라미터 없이 전체 프로젝트 목록을 조회하는 경우에도 응답 속도가 느린 것을 확인했습니다. 이는 데이터베이스에서 필터링(WHERE)과 정렬(ORDER BY)을 수행할 때 적절한 인덱스가 없어 발생하는 문제였습니다.
과거에 trigram 인덱스를 활용하여 키워드 검색 성능을 99% 이상 개선했던 경험을 바탕으로, 이번 전체 목록 조회 성능 문제 역시 인덱스 추가를 통해 해결할 수 있을 것이라 판단했습니다.
느린 쿼리가 근본적인 문제라고 보고, 커넥션 풀 튜닝에 앞서 쿼리 성능 개선을 우선 진행했습니다. 쿼리의 WHERE 절에 사용되는 조건과 ORDER BY 절의 정렬 기준인 created_at 컬럼에 복합 인덱스와 단일 인덱스를 각각 생성하여 적용했습니다.
-- 상태/삭제여부/시작일 복합 인덱스 (필터링 조건)
CREATE INDEX idx_projects_state_deleted_start
ON projects (state, is_deleted, period_start);
-- 상태/삭제여부/종료일 복합 인덱스 (필터링 조건)
CREATE INDEX idx_projects_state_deleted_end
ON projects (state, is_deleted, period_end);
-- 생성일자 정렬용 인덱스 (정렬 조건)
CREATE INDEX idx_projects_created_at ON projects (created_at);
