N+1 제거 + upsert_all + includes(:translations)
ID: 72c7068d-c61b-4151-9d3b-c87c2a1cf609
## 목표
일괄 제출된 응답을 효율적으로 저장. 쿼리 90개 → 1-2개로 감소.
## 변경 파일
- `app/services/diagnosis/session_manager.rb` — save_responses_bulk 메서드 추가 (upsert_all)
- `app/controllers/diagnosis_sessions_controller.rb` — SurveyQuestion.find × N → where(id:).index_by
- `app/controllers/diagnosis_sessions_controller.rb` — load_questions에 `.includes(:translations)` 추가
- submit_part2_round에도 동일 N+1 제거 적용
## 구현 핵심
```ruby
# session_manager.rb
def save_responses_bulk(session, responses_data)
records = responses_data.map { |d| { diagnosis_session_id: session.id, ... } }
DiagnosisResponse.upsert_all(records, unique_by: [:diagnosis_session_id, :survey_question_id])
end
```
## 완료 기준
- 기존 테스트 통과
- DB 로그에서 최종 제출 시 쿼리 2개 이하 확인
- upsert_all 시 created_at 덮어쓰기 방지 확인
## 주의사항
- upsert_all은 AR validation 스킵 → DB NOT NULL 제약으로 보장
- unique index `idx_responses_session_question` 활용
## 의존성
PR #2 이후 (일괄 제출 구조에 맞춰 구현)
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
팀팀리드 리뷰 완료 - 승인 (N+1 제거 + upsert_all)
2026년 03월 09일 07:05:51
상세 보기
## 리뷰 결과
- 상태: 승인
- 코드 품질: upsert_all 벌크 저장 적절. where(id:).index_by 패턴으로 N+1 제거 확인
- 보안: SQL Injection 위험 없음
- UX/UI: 해당 없음 -
팀팀리드 상태 변경: 리뷰 → 완료
2026년 03월 09일 07:04:44
-
팀팀리드 상태 변경: 진행 중 → 리뷰
2026년 03월 09일 02:29:51
-
팀팀리드 티켓 클레임 완료
2026년 03월 09일 01:59:22
-
팀팀리드 상태 변경: 할 일 → 백로그
2026년 03월 06일 10:02:58