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를 추가하여SpacetimeSerializer가spacetime.facility를 참조할 때 발생하는 N+1 을 제거. - 미포함 (별도 트랙):
spacetime_repository.rb:71(production 에서는facility_repository.rb:74) 의per_page != 30legacy 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로 추출되어 있음. 근본 결함(:facilitypreload 누락) 은 그대로이므로 develop 기준 파일로 반영.
Acceptance Criteria#
-
app/repositories/spacetime_repository.rb11번째 줄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 "단기 개선") 는 이번 스코프 밖.