ES /docs

Api::V1::SitetracksController#captures (avg 13190ms, max 13190ms)

Fix Plan: Api::V1::SitetracksController#captures latency (avg 13190ms)

Scope#

RCA 의 사용자 선택 옵션은 단기 개선 (1주 이내) 이다. 해당 섹션은 두 개 하위 권장사항을 포함한다:

  1. SitetrackRepository#capturespreload 추가 (primary)
  2. CaptureSerializer sparse-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_captures relation 을 CaptureSerializer 로 넘길 때 preload 가 없어 캡처 개수만큼 N+1 SQL 이 발생. 캐시 miss 경로 (특히 fields=[record, level, floorplan] 요청) 에서 실제 AR association 로드가 lazy 하게 이어져 DB 5.78s 를 유발함. 명시적 preload 로 각 참조를 단일 IN() 쿼리로 대체.
  • Lines: 34 (한 줄 추가/체이닝 확장)
  • 주의: CaptureSerializerattribute :floorplancapture.floorplan_id.present? 조건으로 감싸 별도 로직으로 처리하지만, Capture 모델은 belongs_to :floorplan 이 없다 (FloorplanModule concern 이 floorplan_id 를 다룸). 따라서 :floorplan 은 preload 대상에서 제외한다. :camera 도 Capture 모델에 belongs_to 로 선언되지 않아 (HasCamera concern 경유) 제외한다. 최종 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.duration for Api::V1::SitetracksController#captures) 로 검증한다.