피드로 돌아가기
Dev.toBackend
원문 읽기
SQL 30ms 대비 API 800ms 지연을 유발한 Ruby 레이어 최적화
Your SQL Is Fast but the API Is Slow: It's the Ruby Layer
AI 요약
Context
DB 쿼리 및 Index 최적화 완료 후에도 높은 CPU 점유율과 응답 지연이 지속되는 상황 분석. 데이터 로드 이후 Application Layer에서 발생하는 과도한 객체 생성 및 불필요한 직렬화 작업이 병목 지점으로 파악됨.
Technical Solution
- 불필요한 필드 직렬화를 제거하기 위한 Whitelist 기반 Serializer 도입 및 런타임 CPU 부하 감소
- AR Object 인스턴스화 비용을 제거하기 위해
pluck을 통한 Raw Array 데이터 직접 추출 방식 채택 - Hot Path 내 반복적인 객체 생성 및 문자열 포맷팅을 제거하여 GC Pressure 완화 및 Heap 메모리 증가 억제
- DB 수준의 계산 처리를 통해 Application Layer의 데이터 가공 루프 최소화
- 동일 요청 내 중복 계산 방지를 위한 Memoization 적용 및
defined?기반의 Null 값 처리 설계로 정확성 확보
Impact
- DB 처리 시간 30ms 대비 Application Layer에서 소요되던 770ms의 지연 시간 단축
실천 포인트
1. API 응답 지연 시 APM을 통해 SQL 실행 시간과 전체 Request 시간의 간극 확인
2. Model 전체를 JSON으로 렌더링하는 대신 필요한 필드만 명시하는 Serializer 사용 여부 검토
3. 루프 내부에서 매번 생성되는 임시 객체나 반복 계산 로직을 루프 외부로 추출
4. 대량 데이터 처리 시 ActiveRecord 객체 생성 비용을 줄이기 위해 `pluck` 활용 고려
5. Memoization 적용 시 결과값이 `nil` 또는 `false`일 경우의 재계산 버그 가능성 체크