ES /docs

Api::V1::FacilitiesController#spacetimes (avg 11652ms, max 11652ms)

Fix Plan: Api::V1::FacilitiesController#spacetimes N+1 latency (avg 11.6s)

Scope#

RCA "즉시 조치 (Critical)" 두 항목 중 첫 번째만 이번 PR 에서 처리한다.

  • 포함: SpacetimeRepository#spacetimes (develop 브랜치 기준; production 에서는 FacilityRepository#spacetimes) 의 eager_load:facility 를 추가하여 SpacetimeSerializerspacetime.facility 를 참조할 때 발생하는 N+1 을 제거.
  • 미포함 (별도 트랙): spacetime_repository.rb:71 (production 에서는 facility_repository.rb:74) 의 per_page != 30 legacy pagination guard 제거. RCA 원문이 "프런트엔드 담당자와 협의해 기본 pagination 을 항상 적용"으로 명시하고 있어, 자동 코드 수정 범위를 벗어난다. Jira/PR description 및 요약 문서에 후속 조율 필요성 명시.

Changes#

tesla: app/repositories/spacetime_repository.rb#

  • What: spacetimes(facility, query_option) 첫 줄(line 11)의 eager_load(:record, :level)eager_load(:record, :level, :facility) 로 변경.
  • Why: SpacetimeSerializer#facility 블록(spacetime_serializer.rb:7-13) 이 각 spacetime 마다 spacetime.facility 를 참조하지만 현재 repository 는 :record, :level 만 preload → belongs_to :facility 를 매 row lazy load 하여 N+1 발생. :facility 를 함께 eager_load 하면 단일 LEFT OUTER JOIN 으로 축소되어 대형 facility(records 498) 요청의 11초 tail 을 제거할 수 있다.
  • Lines: 11 (한 줄 수정)
  • Blast radius: SpacetimeRepository#spacetimes 가 반환하는 relation 만 영향. 다른 repository 메서드/시리얼라이저 미변경.
  • 참고: RCA 는 production/master 코드 기준으로 facility_repository.rb:32 를 지목했으나, develop 브랜치에서는 동일 로직이 SpacetimeRepository 로 추출되어 있음. 근본 결함(:facility preload 누락) 은 그대로이므로 develop 기준 파일로 반영.

Acceptance Criteria#

  • app/repositories/spacetime_repository.rb 11번째 줄 eager_load 호출에 :facility 심볼 포함 (grep -n "eager_load(:record, :level, :facility)" app/repositories/spacetime_repository.rb 매칭 1건).
  • 나머지 SpacetimeRepository#spacetimes 로직(pagination guard, extra_filter, from_at/to_at, record_ids, level_ids, building_ids, summary, query_string, SearchResult 반환)은 diff 없음.
  • ruby -c app/repositories/spacetime_repository.rb 문법 통과.
  • 파일 밖 다른 파일 변경 없음.

Tests#

  • 기존 테스트: spec/repositories/spacetime_repository_spec.rb (있으면). agent env 관례상 rspec 은 실행하지 않는다.
  • 신규 테스트: 없음. 순수 preload 추가로 관측 가능한 응답 shape 변경이 없어 별도 스펙 불필요.

Deferred / Follow-up#

  • 기본 per_page == 30 경로에서 pagination 이 여전히 skip 됨. 프런트엔드 준비 후 legacy guard 제거 필요 — 별도 티켓/PR 로 조율.
  • SpacetimeSerializer 가 매 record 마다 FacilitySerializer.new(...).serializable_hash 인스턴스화하는 오버헤드 (RCA "단기 개선") 는 이번 스코프 밖.