피드로 돌아가기
Dev.toBackend
원문 읽기
O(n²) 복잡도 제거를 통한 p99 Latency 14초에서 80ms로 복구
The O(n^2) Bug That Looked Like Clean Code
AI 요약
Context
사용자 및 권한 데이터 증가에 따라 API p99 Latency가 80ms에서 14s로 급증하는 성능 저하 발생. Functional Style의 가독성 높은 코드 내부에 숨겨진 중첩 루프 구조가 데이터 규모 확대 시 Quadratic Complexity를 유발한 상황.
Technical Solution
- Array.prototype.find()를 이용한 반복적 검색을 Map 기반의 Lookup Table 구조로 전환
- 시간 복잡도를 O(n * m)에서 O(n + m)으로 개선하여 데이터 증가량에 따른 처리 시간 선형화
- Set.has()를 활용한 O(1) 시간 복잡도 기반의 멤버십 체크로 필터링 효율 극대화
- Recursive Tree Flattening 시 Spread Operator 사용을 지양하고 Accumulator를 전달하는 방식으로 Array Copy 비용 제거
- N+1 Query 문제를 해결하기 위해 루프 내 개별 쿼리 호출을 Batch Query 또는 Join 구조로 변경 제안
- Keyed Collections(Map, Set)를 기본 데이터 구조로 채택하여 불필요한 전수 조사를 원천 차단
실천 포인트
1. 루프 내부의 .find(), .includes(), .indexOf() 사용 여부 전수 검토
2. 검색 빈도가 높은 데이터셋을 Map 또는 Set으로 사전 변환하여 O(1) 접근 구조 확보
3. 코드 리뷰 시 'n의 최대 규모'와 '내부 연산 복잡도'를 명시적으로 질문
4. 소규모 테스트 데이터셋이 아닌 프로덕션 규모의 데이터로 성능 프로파일링 수행
5. p95/p99 Latency 기반의 Alert 설정을 통해 성능 저하 추세를 조기에 감지