QT 세션 N+1 쿼리 최적화 + IDOR 접근 제어

ID: 450befd8-978c-49c5-afc6-8e1b03a1b3e8

높음 완료

## 작업 내용 (2개 티켓 통합)

### A. N+1 쿼리 최적화
1. members 액션: @participants.map에서 user.user_meditations N+1 → includes 또는 SQL 집계
2. rankings 액션: users.map에서 유저별 4개 쿼리 → SQL 집계 쿼리로 전환
3. _session_card.html.erb: session.qt_participants.size → index에서 includes(:qt_participants) 추가

### B. IDOR 접근 제어
1. before_action :verify_participant 추가 (show, shared_meditations, members, rankings)
- is_public이면 허용, 아니면 qt_participants.exists?(user: current_user) 확인
2. select 액션에 참여자 확인 추가
3. 비참여자 접근 차단 테스트 추가

## 완료 기준
- N+1 쿼리 제거
- 비참여자 비공개 세션 접근 차단
- select 참여자 검증
- 전체 테스트 통과 (bin/rails test)

첨부 이미지

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

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

담당자: sessions-fixer
생성일: 2026년 03월 03일 05:46

활동 로그

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

    2026년 03월 03일 05:55:12

  • S
    sessions-fixer 상태 변경: 할 일 → 리뷰

    2026년 03월 03일 05:54:50

  • S
    sessions-fixer N+1 쿼리 최적화 + IDOR 접근 제어 완료

    2026년 03월 03일 05:54:49

    상세 보기

    ## A. N+1 쿼리 최적화
    - `app/controllers/qt/sessions_controller.rb`
    - index: `.includes(:qt_participants)` 추가 → _session_card COUNT 쿼리 제거
    - members: 참가자별 N+1 → SQL GROUP BY + CASE WHEN 집계 1쿼리 (N+1 → 1)
    - rankings: 유저별 N*4+1 → SQL GROUP BY + CASE WHEN 집계 1쿼리 (N*4+1 → 1)

    ## B. IDOR 접근 제어
    - `verify_participant` before_action 추가 (show, shared_meditations, members, rankings)
    - 공개 세션: 누구나 접근 허용
    - 비공개 세션: 참여자만 접근, 비참여자 리다이렉트
    - select 액션: 비참여자 세션 전환 차단

    ## 테스트
    - 8개 테스트 추가 (IDOR 접근 제어 검증)
    - 전체: 533 runs, 1279 assertions, 0 failures