Big5 응답 일괄 제출 (레거시 패턴)

ID: 2c69826e-5e90-4eee-a332-1a7c8b592af7

긴급 완료

## 목표
Big5 진단 응답을 매 라운드 서버 전송 → JS 누적 후 마지막 1번 제출로 변경.
HTTP 요청 30배 감소 (1000명: 30,000 → 1,000).

## 배경 (레거시 분석)
레거시(Next.js)는 모든 응답을 localStorage에 누적 → 마지막에 POST 1번으로 1000명 동시 진단 처리.
현재 Rails는 30라운드 × 개별 AJAX = 30배 더 많은 서버 요청 발생.

## 변경 범위
- **Stimulus 컨트롤러**: 응답 데이터를 JS 메모리/sessionStorage에 누적
- **Turbo Stream 라운드 전환**: 서버 저장 제거, 클라이언트에서 다음 라운드 전환 (UI 유지)
- **diagnosis_sessions_controller**: 최종 제출 액션 추가 (submit_all_big5_responses)
- **session_manager**: save_responses_bulk 메서드 (upsert_all 활용)
- **sessionStorage 폴백**: 네트워크 끊김/새로고침 대비 임시 저장

## 완료 기준
- Big5 진단 30라운드 완료 시 서버 요청 1회만 발생
- sessionStorage에 중간 응답 저장 확인
- 새로고침 시 진행 상태 복원
- 기존 테스트 통과

## 리스크
- 네트워크 끊김 시 데이터 손실 → sessionStorage 폴백으로 대응
- 라운드별 서버 검증 제거 → 최종 제출 시 일괄 검증으로 보완
- submit_part2_round도 동일 패턴 적용 검토

## 의존성
없음 (PR #1과 병렬 작업 가능)

첨부 이미지

이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)

JPEG, PNG, GIF, WebP / 최대 10MB

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

활동 로그

  • 팀리드 리뷰 완료 - 승인 (Big5 응답 일괄 제출)

    2026년 03월 09일 07:16:44

    상세 보기

    ## 리뷰 결과
    - 상태: 승인 (서브 티켓 2건 모두 완료)

    ## 서브 티켓 결과
    1. Server API: 승인 — upsert_all 벌크 저장, 타입 안전성 수정 완료, 테스트 12건 통과
    2. Client Stimulus: 승인 — ARIA 접근성, i18n 4개 언어, 타임아웃 토스트 추가 완료

    ## 보안
    - Brakeman 0건, bundler-audit 0건
    - CWE 스캔 Critical 0건
    - XSS 방어 적절 (_escapeHTML, textContent, ERB 자동 이스케이프)

    ## 성과
    - HTTP 요청 30배 감소 (30라운드 × AJAX → 최종 1회 제출)
    - sessionStorage crash recovery 구현
    - 4개 언어 i18n 완전 지원

  • 팀리드 상태 변경: 리뷰 → 완료

    2026년 03월 09일 07:16:38

  • 팀리드 팀 작업 완료 - Big5 일괄 제출 + N+1 제거

    2026년 03월 09일 02:30:09

    상세 보기

    ## 수정된 기능
    - Big5 일괄 제출 API (submit_all_big5_responses): 30라운드 × AJAX → 최종 1회 POST
    - Stimulus big5_batch_controller: 클라이언트 라운드 전환 + sessionStorage 백업
    - upsert_all: 90개 응답 1회 DB 쿼리 저장
    - N+1 제거: SurveyQuestion.find × N → where(id:).index_by

    ## 변경 파일
    - app/controllers/diagnosis_sessions_controller.rb (새 액션 + N+1 수정)
    - app/services/diagnosis/session_manager.rb (save_responses_bulk)
    - config/routes.rb (submit_all_big5_responses 라우트)
    - app/javascript/controllers/big5_batch_controller.js (새 파일)
    - app/views/diagnosis_sessions/big5_show.html.erb (batch mode)
    - app/views/diagnosis_sessions/_big5_guide.html.erb (시작 버튼)
    - config/locales/diagnosis/ko.yml (big5_adult i18n)
    - test 파일 다수

    ## 테스트/보안 검증 결과
    - 새 기능 테스트: 27 runs, 0 failures ✅
    - 보안: CSRF, SQL injection, XSS 이슈 없음 ✅
    - 기존 실패: CustomPayments 라우팅 (무관)

    ## 해결된 문제
    - question_id 검증 불일치: exact match → subset 검증으로 수정
    - fixture 부작용: i18n 키 + assert_response 수정

  • 팀리드 상태 변경: 진행 중 → 리뷰

    2026년 03월 09일 02:29:50

  • 팀리드 위임: frontend-dev에게 'Client: Stimulus 컨트롤러 + sessionStorage + 라운드 전환' 작업 배정

    2026년 03월 09일 02:00:54

  • 팀리드 위임: backend-dev에게 'Server: 일괄 제출 API + upsert_all + N+1 제거' 작업 배정

    2026년 03월 09일 02:00:40

  • 팀리드 작업 시작 - Big5 일괄 제출 + N+1 제거

    2026년 03월 09일 02:00:22

    상세 보기

    ## 작업 계획
    - 목표: Big5 진단 HTTP 요청 30배 감소 + DB 쿼리 최적화
    - 접근 방식: 서버/클라이언트 분리하여 2명 병렬 개발

    ## 서브 티켓 분해
    1. Server: 일괄 제출 API + upsert_all + N+1 제거 (backend-dev)
    2. Client: Stimulus 컨트롤러 + sessionStorage + 라운드 전환 (frontend-dev)

    ## 현재 상태
    - 보드 현황: backlog 0 / todo 0 / in_progress 3 / review 0 / done 93

  • 팀리드 티켓 클레임 완료

    2026년 03월 09일 01:59:21

  • 팀리드 상태 변경: 할 일 → 백로그

    2026년 03월 06일 10:02:58