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
활동 로그
-
팀팀리드 상태 변경: 리뷰 → 완료
2026년 03월 03일 05:55:12
-
Ssessions-fixer 상태 변경: 할 일 → 리뷰
2026년 03월 03일 05:54:50
-
Ssessions-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