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

담당자: 팀리드
생성일: 2026년 03월 06일 10:02

활동 로그

  • 팀리드 리뷰 완료 - 승인 (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