Api::V1::SitetracksController#captures (avg 13190ms, max 13190ms)
Fix Plan: Api::V1::SitetracksController#captures latency (avg 13190ms)
Scope#
RCA 의 사용자 선택 옵션은 단기 개선 (1주 이내) 이다. 해당 섹션은 두 개 하위 권장사항을 포함한다:
SitetrackRepository#captures에preload추가 (primary)CaptureSerializersparse-fieldsets 존중 (serializer concern 리팩터)
이번 PR 은 latency 카테고리 메모리 가이드의 "권장(primary) 1개만 구현하고 나머지는 별도 작업으로 분리" 패턴을 따라 (1) preload 추가만 구현한다. Serializer sparse-fieldsets 리팩터는 30여 개 concern 을 건드리는 광범위한 변경이며 회귀 위험이 커 별도 이슈로 분리한다.
Changes#
tesla: app/repositories/sitetrack_repository.rb#
- What:
captures(query_option)메서드에서@model.captures.paginate(...)앞에CaptureSerializer가 참조하는 belongs_to 연관에 대한preload를 추가한다. 대상 연관::record,:level,:floorplan,:user,:team,:facility,:workspace. - Why: RCA 의 H1 확정 원인.
has_many :captures, through: :associated_capturesrelation 을CaptureSerializer로 넘길 때 preload 가 없어 캡처 개수만큼 N+1 SQL 이 발생. 캐시 miss 경로 (특히 fields=[record, level, floorplan] 요청) 에서 실제 AR association 로드가 lazy 하게 이어져 DB 5.78s 를 유발함. 명시적 preload 로 각 참조를 단일 IN() 쿼리로 대체. - Lines: 34 (한 줄 추가/체이닝 확장)
- 주의:
CaptureSerializer는attribute :floorplan을capture.floorplan_id.present?조건으로 감싸 별도 로직으로 처리하지만,Capture모델은belongs_to :floorplan이 없다 (FloorplanModule concern 이floorplan_id를 다룸). 따라서:floorplan은 preload 대상에서 제외한다.:camera도 Capture 모델에 belongs_to 로 선언되지 않아 (HasCameraconcern 경유) 제외한다. 최종 preload 대상::record, :level, :user, :team, :facility, :workspace.
Acceptance Criteria#
-
grep -n "preload" app/repositories/sitetrack_repository.rb결과에captures메서드 내부의 preload 라인이 존재한다. -
preload호출은paginate앞 (즉, count query 이전) 에 위치한다. -
preload인자는Capture에서belongs_to로 실제 선언된 연관만 (:record, :level, :user, :team, :facility, :workspace) 포함한다 — 존재하지 않는 연관을 preload 하면ActiveRecord::AssociationNotFoundError발생. - 다른 메서드 (
update,create_sitetrack_upload_credentials,permission_joins등) 는 변경되지 않는다. -
ruby -c app/repositories/sitetrack_repository.rb구문 검사 통과.
Tests#
- 기존 테스트:
spec/repositories/sitetrack_repository_spec.rb(존재 시captures관련 컨텍스트가 회귀 없이 통과해야 함). - 신규 테스트: 이번 변경은 기능 동작을 바꾸지 않고 SQL 로드 순서만 최적화하므로 신규 테스트는 추가하지 않는다. 실제 latency 개선은 스테이징/프로덕션 APM 지표 (
trace.rack.request.durationforApi::V1::SitetracksController#captures) 로 검증한다.